我正在将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()返回的字符串
如何使用StringIO
对象保存文件的内容:
from openpyxl.workbook import Workbook
from StringIO import StringIO
output = StringIO()
wb = Workbook()
wb.save(output)
print output.getvalue()
您正在寻找的字符串是在此示例的最后一行中打印的字符串。
在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