
当服务端以 JSON 格式返回包含 Base64 编码的 Excel 文件(如 "content": "UEsDBB...")时,需先解析 JSON、解码 Base64 字符串,再以二进制方式写入 .xlsx 文件,才能正确生成可打开的 Excel 文档。
当服务端以 json 格式返回包含 base64 编码的 excel 文件(如 `"content": "uesdbb..."`)时,需先解析 json、解码 base64 字符串,再以二进制方式写入 `.xlsx` 文件,才能正确生成可打开的 excel 文档。
在你的场景中,response.content 并非原始 Excel 二进制流,而是一个 JSON 字节字符串,其中 "content" 字段是经过 Base64 编码的 .xlsx 文件数据(即 ZIP 格式压缩包的 Base64 表示)。直接将整个 response.content 写入文件会导致生成一个非法 JSON 文本文件,而非真正的 Excel 文件——这正是你看到 PK-...(ZIP 签名)被包裹在 JSON 引号中的原因。
✅ 正确做法是:
- 将响应体解析为 Python 字典;
- 提取
"content"字段值(字符串); - 使用
base64.b64decode()将其还原为原始字节; - 以
'wb'模式写入文件。
以下是完整、健壮的实现示例:
import requests
import json
import base64
response = requests.post('url', headers=headers, json=payload)
response.raise_for_status() # 确保请求成功(抛出异常便于调试)
try:
response_json = response.json() # 推荐用 .json() 而非 json.loads(response.content)
file_content_b64 = response_json["content"]
file_content_bytes = base64.b64decode(file_content_b64)
with open('template.xlsx', 'wb') as f:
f.write(file_content_bytes)
print("✅ Excel 文件已成功保存:template.xlsx")
# 验证:可选地用 openpyxl 加载测试
from openpyxl import load_workbook
wb = load_workbook('template.xlsx')
print(f"? 工作簿包含 {len(wb.sheetnames)} 个工作表")
except KeyError as e:
raise ValueError(f"响应 JSON 缺少必需字段: {e}")
except base64.binascii.Error as e:
raise ValueError(f"Base64 解码失败,请检查 content 字段格式: {e}")
except Exception as e:
raise RuntimeError(f"文件写入或加载失败: {e}")
⚠️ 注意事项:
-
不要跳过 JSON 解析:
response.content是 JSON 字节流,不是原始 Excel 数据; -
务必使用
base64.b64decode():content字段是标准 Base64 编码(不含data:...;base64,前缀),无需额外清洗; -
推荐用
response.json():比json.loads(response.content)更安全(自动处理编码与空响应); - 添加异常处理:生产环境必须校验字段存在性、Base64 合法性及文件操作权限;
-
避免手动 flush/close:
with语句已自动完成资源释放,无需显式调用f.flush()或f.close()。
通过以上步骤,你就能可靠地将 API 返回的 Base64 包装 Excel 内容还原为标准 .xlsx 文件,并确保 openpyxl 等库能正常读取。











