通过文本和文件流保存openpyxl文件

Nel*_*haw 22 python excel filestream openpyxl

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

从我对OpenPyXL源代码的调查来看,它看起来不像是支持这种输出.有没有人有修改openpyxl的经验来支持这个?

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

谢谢.

Eri*_*oni 36

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)
Run Code Online (Sandbox Code Playgroud)

你要找的是save_virtual_workbook()返回的字符串

  • 这正是我需要通过文件流保存的内容.你也可以保存它:`io.BytesIO(save_virtual_workbook(wb))` (5认同)
  • 我们不应该再使用这个函数了。`已弃用:使用 NamedTemporaryFile`。请参阅[文档](https://openpyxl.readthedocs.io/en/stable/tutorial.html# saving-as-a-stream) (5认同)

ade*_*nes 28

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

DeprecationWarning: Call to deprecated function save_virtual_workbook (Use a NamedTemporaryFile).
Run Code Online (Sandbox Code Playgroud)

在某些时候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())

Run Code Online (Sandbox Code Playgroud)

查看 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

Run Code Online (Sandbox Code Playgroud)


jco*_*ado 16

如何使用StringIO对象保存文件的内容:

from openpyxl.workbook import Workbook
from StringIO import StringIO

output = StringIO()
wb = Workbook()
wb.save(output)
print output.getvalue()
Run Code Online (Sandbox Code Playgroud)

您正在寻找的字符串是在此示例的最后一行中打印的字符串.

  • 似乎不起作用..而不是IO-Byte-object的东西,wb.save()只是期望一个文件名(str-object) (3认同)
  • 确认这不起作用。您提供给wb的save方法的任何内容都试图用作文件名。 (2认同)

Tha*_*yen 10

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()
Run Code Online (Sandbox Code Playgroud)