33

我正在将 OpenPyXL 构建到一个应用程序中,该应用程序需要一个包含 excel 文件内容的字符串,以便它通过文件流写入。

从我对 OpenPyXL 源代码的调查来看,它看起来并不支持这种输出。有没有人有修改 openpyxl 以支持这一点的经验?

或任何一般性建议/解决方法?

谢谢。

4

5 回答 5

46

jcollado 的回答实际上是有效的,但在 openpyxl.writer.excel 中还有一个名为“save_virtual_workbook”的函数(遗憾的是尚未记录),它将获取您的工作簿并将工作簿作为字符串返回:

from openpyxl.workbook import Workbook
from openpyxl.writer.excel import save_virtual_workbook

wb = Workbook()
print save_virtual_workbook(wb)

您正在寻找的是 save_virtual_workbook() 返回的字符串

于 2012-01-03T15:13:19.507 回答
33

在 openpyxl 2.6 中调用该save_virtual_workbook方法会发出以下警告:

DeprecationWarning: Call to deprecated function save_virtual_workbook (Use a NamedTemporaryFile).

在某些时候save_virtual_workbook将从 openpyxl 中删除。

在 Python 3 中,将 openpyxl 工作簿保存到文件流的典型用法变为:

from io import BytesIO
from tempfile import NamedTemporaryFile
from openpyxl import Workbook

wb = Workbook()
with NamedTemporaryFile() as tmp:
    wb.save(tmp.name)
    output = BytesIO(tmp.read())

在查看了 WorkBooksave方法的实现之后,“文件名”被直接发送到 ZipFile,它接受路径或类似文件的对象,因此不需要 NamedTemporaryFile,只需使用内存中的 BytesIO:

from io import BytesIO
from openpyxl import Workbook

wb = Workbook()
virtual_workbook = BytesIO()
wb.save(virtual_workbook)

# now use virtual_workbook to send to a stream; email attachment, etc

于 2019-03-13T14:48:09.427 回答
18

StringIO使用对象保存文件内容怎么样:

from openpyxl.workbook import Workbook
from StringIO import StringIO

output = StringIO()
wb = Workbook()
wb.save(output)
print output.getvalue()

您要查找的字符串是本示例最后一行打印的内容。

于 2011-12-12T06:37:10.680 回答
4

save_virtual_workbook自 2.6 版起已弃用的兼容实现:

from io import BytesIO
from tempfile import NamedTemporaryFile


def save_virtual_workbook(workbook):
    with NamedTemporaryFile() as tf:
        workbook.save(tf.name)
        in_memory = BytesIO(tf.read())
        return in_memory.getvalue()
于 2020-06-15T09:28:02.247 回答
0
from openpyxl import Workbook
from io import BytesIO

rows = [[1,2], [3,4]]

book = Workbook()
sheet = book.active

for row in rows:
    sheet.append(row)

io = BytesIO
book.save(io)

content = io.getValue()

return Response(
    content,
    mimetype=magic.from_buffer(content, mime=True),
    headers={
    'Content-Disposition': 'attachment;filename=' + 'test.xlsx'}
)
于 2019-11-18T17:51:57.380 回答