如何把 Excel 文件转为 Base64
- 把
.xlsx、.xls或.csv文件拖到框中,或用文件选择器选择。 - 输出为 默认是 纯 Base64。选择 JSON 可以同时包含文件名、MIME 类型和大小。
- 按 复制输出;工作簿较大时可以用 另存为 .txt。
这是哪种表格?
| 文件 | Base64 开头 | MIME 类型 |
|---|---|---|
.xlsx、.xlsm | UEsDB(ZIP) | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet |
.xls | 0M8R4KGxGuE(OLE2) | application/vnd.ms-excel |
有密码保护的 .xlsx | 0M8R4KGxGuE | 与 .xlsx 相同 |
.csv,带 BOM 的 UTF-8 | 77u/ | text/csv |
.csv,无 BOM | 就是文本本身,例如 name,qty 加一个换行符是 bmFtZSxxdHkK | text/csv |
data URI 和 JSON 输出使用浏览器报告的类型。在装有 Excel 的 Windows 电脑上,系统经常把 .csv 文件标记为 application/vnd.ms-excel。如果 API 对 CSV 的类型要求严格,请手动改为 text/csv。
CSV 只是文本
CSV 文件是纯文本,所以它的 Base64 解码后就是可读的数据行。这带来几点影响:
- 字符编码随字节一起传输。Excel 用传统代码页(例如 Windows-1252)保存的 CSV,如果接收方按 UTF-8 解析,就会出现乱码。保存时尽量选“CSV UTF-8”。
- 大的 CSV 用 gzip 或 ZIP 压缩后会小很多;如果 API 接受压缩上传,值得在编码前先压缩。
.xlsx本身就是 ZIP,再压缩一次几乎省不了空间。 - 收到 Base64 形式的 CSV 想快速看一眼,可以用 Base64 转 CSV,它会解码并以文本显示。
表格以 Base64 传输的场景
- 在 JSON 请求体中接收工作簿的报表和导入 API,例如批量导入商品或价格。
- 在各步骤之间以 Base64 字符串传递文件的自动化平台,例如读取邮件附件再上传到存储。
- 邮件发送 API:表格附件以 Base64 形式放进 JSON 字段。
- 生成的 HTML 中的下载链接:使用 HTML
<a download>输出,让报表页面自带.xlsx文件。
用 Python 编码并检查格式
import base64
from pathlib import Path
SIGNATURES = {
"UEsDB": "xlsx (ZIP)",
"0M8R4KGxGuE": "xls (OLE2) or encrypted xlsx",
"77u/": "text with a UTF-8 BOM, e.g. CSV UTF-8",
}
def encode_sheet(path):
b64 = base64.b64encode(Path(path).read_bytes()).decode("ascii")
kind = next((v for k, v in SIGNATURES.items() if b64.startswith(k)), "other")
return b64, kind
这样的检查能发现一种常见的上传错误:所谓的“表格”其实是一个 HTML 错误页,或者是改名为 .xlsx 的旧 .xls 文件。文件处理的更多内容见 Python 中的 Base64;Base64 转 Excel 可以预览 Base64 形式的工作簿并保存为文件。
常见问题
XLSX 文件的 MIME 类型是什么?
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet。旧版 .xls 格式使用 application/vnd.ms-excel,CSV 则是 text/csv。
为什么 CSV 的 Base64 以 77u/ 开头?
77u/ 是 UTF-8 字节顺序标记(BOM,EF BB BF)。在 Excel 中另存为“CSV UTF-8”时会加上它。大多数解析器能正确处理,但有些会把它当成第一列列名的一部分;如果 name 之类的表头突然匹配不上,就把它去掉。
可以在 JSON 请求中发送 Excel 文件吗?
可以。把文件编码为纯 Base64,放进 API 文档规定的文件内容字段,再附上文件名和 MIME 类型。JSON 输出展示了这种结构:name、type、size 和 data。