如何将openpyxl修改后的内存Excel工作簿通过requests上传?
问题原因
你的代码存在两个核心问题:
- 直接调用
wb.save(name)会把文件写入本地磁盘,不符合不允许本地存储的要求; - requests的
files参数接收的是类文件对象/字节内容,你直接传入openpyxl的Workbook实例,类型不匹配触发报错。
修复方案
所有操作全程在内存中完成,不涉及本地磁盘读写,修改后的代码如下:
import io import requests import openpyxl as opx from openpyxl.workbook.protection import WorkbookProtection def UploadXLS(name, xlsx): # 从输入的字节流加载工作簿 wb = opx.load_workbook(io.BytesIO(xlsx)) # 配置工作簿保护规则 wb.security = WorkbookProtection(workbookPassword = 'super-secret-password', lockStructure = True) # 新建内存缓冲区存储修改后的Excel output_buf = io.BytesIO() # 把修改后的工作簿写入内存缓冲区,不存本地 wb.save(output_buf) # 重置缓冲区指针到开头,避免后续读取得到空内容 output_buf.seek(0) # 构造符合要求的上传参数,注意files为字典结构,键需和后端接收文件的字段名一致 r = requests.post( 'my-url-here', files = {"file": (name, output_buf, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")} ) return r.url
关键改动说明
- 全程用
BytesIO做内存中转,完全规避本地文件存储,符合你的限制要求 - 新增
seek(0)操作,修正工作簿写入缓冲区后指针在末尾的问题 - 按照requests规则构造
files参数,同时指定Excel对应的MIME类型,避免服务端识别文件格式错误
内容的提问来源于stack exchange,提问作者N L
相关产品推荐
相关产品推荐

