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

问题描述 投票:20回答:3

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

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

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

谢谢。

python excel filestream openpyxl
3个回答
35
投票

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()返回的字符串


15
投票

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

from openpyxl.workbook import Workbook
from StringIO import StringIO

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

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


2
投票

在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())

在查看WorkBook save方法的实现之后,'filename'被直接发送到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

© www.soinside.com 2019 - 2024. All rights reserved.