我正在将 OpenPyXL 构建到一个应用程序中,该应用程序需要一个包含 excel 文件内容的字符串,以便它通过文件流写入。
从我对 OpenPyXL 源代码的调查来看,它看起来并不支持这种输出。有没有人有修改 openpyxl 以支持这一点的经验?
或任何一般性建议/解决方法?
谢谢。
我正在将 OpenPyXL 构建到一个应用程序中,该应用程序需要一个包含 excel 文件内容的字符串,以便它通过文件流写入。
从我对 OpenPyXL 源代码的调查来看,它看起来并不支持这种输出。有没有人有修改 openpyxl 以支持这一点的经验?
或任何一般性建议/解决方法?
谢谢。
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() 返回的字符串
在 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
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'}
)