【问题标题】:Posting an excel workbook modified through openpyxl using request使用请求发布通过openpyxl修改的excel工作簿
【发布时间】:2021-10-26 21:02:24
【问题描述】:

我有一张我在内存上写的 Excel 表,我想使用 openpyxl 进行修改。由于多种情况,我不能使用临时文件或任何类似的东西。我也在编写原始表格,而不是使用 openpyxl,而是 xlsxwriter,原因我不想详细说明。但是,原始表格以类似字节的格式保存,所以我想知道是否可以对修改后的 Excel 表格执行相同操作,然后使用请求上传。

这是我正在使用的代码:

def UploadXLS(name, xlsx):
   wb = opx.load_workbook(io.BytesIO(xlsx))     
   wb.security = WorkbookProtection(workbookPassword = 'super-secret-password', lockStructure = True)
   wb.save(name)

   r = requests.post('my-url-here', 
                      files = wb)
return r.url

这是我收到的(可预测的)错误消息:

a bytes-like object is required, not 'Workbook'

任何有关该主题的帮助或建议将不胜感激。

【问题讨论】:

  • 您需要打开文件并将文件流添加到请求中,而不是工作簿对象。
  • 没有理由不使用临时文件,因为 openpyxl 无论如何都会使用它们。

标签: python python-3.x python-requests openpyxl xlsxwriter


【解决方案1】:

这里的问题是您试图将 openpyxl Workbook 对象传递给 post() 请求。但是,post() 不知道如何处理Workbook。但它确实知道如何处理任何通用文件流。所以解决方法是打开文件,将流传递给请求:

file = open(name, 'r')
r = requests.post('url', files=file)

【讨论】:

  • 好的,我有一个非常愚蠢的后续问题,但它来了:它在技术上不是已经开放了吗?还是我自己绊倒了?
  • @NL 什么已经打开了? Excel 文件?也许...您的代码不包含有关xslx 的值或类型的详细信息。如果这是来自文件系统上 Excel 文件的文件流,则无需将其包装在 io.BytesIO() 中。此外,我认为传递给post() 是不可重复使用的,因为load_workbook() 已经使用了它。可能有一种方法可以确保将流重置为开头,但打开您自己的文件流比重用用于更改 excel 文件的文件流要清晰得多。
猜你喜欢
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多