我正在将OpenPyXL构建到一个应用程序中,该应用程序期望一个包含Excel文件内容的字符串,以便通过文件流进行写入。
从我对OpenPyXL源代码的调查中,它似乎不支持这种输出。有没有人有修改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,它接受路径或文件对象,因此不需要使用 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的答案实际上是有效的,但在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()返回的字符串。io.BytesIO(save_virtual_workbook(wb))
- Esteban使用 StringIO
对象来保存文件内容:
from openpyxl.workbook import Workbook
from StringIO import StringIO
output = StringIO()
wb = Workbook()
wb.save(output)
print output.getvalue()
你要寻找的字符串就是这个例子最后一行输出的内容。
io.BytesIO
。 - velisfilename
传递给Python的ZipFile库,该库接受文件名或文件类对象(例如BytesIO
)。不幸的是,我无法确定自从哪个版本开始出现这种情况。 - Jonas自版本2.6起,与save_virtual_workbook
兼容的实现已被弃用:
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'}
)
content = io.getvalue()
。 - qocuTypeError: descriptor 'tell' of '_io.BytesIO' object needs an argument
。 - Mr Alihoseinyio
被赋值为BytesIO
函数。要获取BytesIO
的值,请像这样调用它:io = BytesIO()
。 - Josh Martin
BytesIO
在这里无法正常工作。但无论如何,这更像是基于私有代码的黑客行为,所以我不建议在生产代码中这样做,因为无法保证私有代码不会发生变化。不过,使用NamedTemporaryFile
的建议代码可以正常运行,并且也被save_virtual_workbook
的弃用消息建议使用! - Jerther