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



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

从我对OpenPyXL源代码的调查来看,它似乎不支持这种输出。有人有修改openpyxl以支持此功能的经验吗?

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

谢谢。

在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, 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

jcollado的答案实际上是有效的,但也有一个函数(遗憾的是尚未记录)称为"save_virtual_workbook"在openpyxl.writer.excel,将采取你的工作簿,并返回工作簿作为一个字符串:

from openpyxl.workbook import Workbook
from openpyxl.writer.excel import save_virtual_workbook
wb = Workbook()
print save_virtual_workbook(wb)

您要查找的是save_virtual_workbook()

返回的字符串

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

from openpyxl.workbook import Workbook
from StringIO import StringIO
output = StringIO()
wb = Workbook()
wb.save(output)
print output.getvalue()

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

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()
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'}
)

最新更新