将多个 openpyxl xlsx 工作簿合并为一个 .zip 文件以供下载

Posted

技术标签:

【中文标题】将多个 openpyxl xlsx 工作簿合并为一个 .zip 文件以供下载【英文标题】:multiple openpyxl xlsx workbooks into one .zip file for download 【发布时间】:2017-11-18 12:42:51 【问题描述】:

我正在尝试从表单中获取一些 xlsx 文件,我使用 openpyxl 加载它们并进行一些数据处理.. 最后我需要下载所有已处理的 xlsx 压缩文件给用户。

这是我到目前为止所做的一个例子

if form.is_valid():

    s = StringIO.StringIO()
    zf = zipfile.ZipFile(s, mode="w")

    for xlsx in request.FILES.getlist('xlsxs'):

        element_column = "G"
        element_row = 16

        massar_column = "C"
        massar_row_start = 18

        loop = column_index_from_string(element_column)
        while (loop <= ws.max_column):
            for i in range(massar_row_start, ws.max_row+1):
                # ...
                ws["%s%s" % (element_column,i)] = 0
                # ...

            loop+=2
            element_column = get_column_letter(loop)

        buf = save_virtual_workbook(wb)
        zf.write(buf) # or zf.write(wb)

    zf.close()
    response = HttpResponse(s.getvalue(), content_type="application/x-zip-compressed")
    response['Content-Disposition'] = "attachment; filename=notes.zip"
    return response

我得到了错误

TypeError at My_view
stat() argument 1 must be encoded string without null bytes, not str

提前感谢您提供的任何帮助。

【问题讨论】:

报告错误时,您应该提供完整的堆栈跟踪信息——它会告诉您和我们实际错误在哪里。您还应该包括哪些 Python 版本,以及哪些其他库(Django?)和那里的版本。 @spookylukey 错误出现在“zf.write(buf)”行中,我正在使用 django 1.10 和 python 2.7.12 【参考方案1】:

save_virtual_workbook 返回一个字节流 - source。

您将此值传递给ZipFile.write,它需要一个文件名。

我认为您应该使用ZipFile.writestr,并且您需要提供将在存档中使用的文件名。我不确定您是如何收到您看到的错误消息的,但这是我能看到的第一个错误。

【讨论】:

zf.writestr(xlsx.name, buf) 解决了这个问题。谢谢

以上是关于将多个 openpyxl xlsx 工作簿合并为一个 .zip 文件以供下载的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenPyXL 读取提取的 XLSX 文件

python通过openpyxl操作excel

有没有办法使用 openpyxl 读取没有工作簿的 Excel 文件?

如何使用 openpyxl 保存 xlsx 并获得正确的编码? 【垃圾人物】

在 python 3.6 中提取 xlsx 工作簿文件元数据/属性

将多个工作簿合并为一个工作簿,所有工作簿为工作表