我正在将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'}
)