通过文本和文件流保存openpyxl文件
我正在把OpenPyXL这个库放进一个应用程序里,这个应用程序需要一个包含Excel文件内容的字符串,以便通过文件流来写入。
我查了一下OpenPyXL的源代码,发现它似乎不支持这种输出方式。有没有人有经验修改openpyxl来支持这个功能?
或者有没有什么其他的建议或解决办法?
谢谢。
5 个回答
19
你可以试试用一个叫做 StringIO
的东西来保存文件里的内容:
from openpyxl.workbook import Workbook
from StringIO import StringIO
output = StringIO()
wb = Workbook()
wb.save(output)
print output.getvalue()
你想要的那个字符串就是这个例子最后一行打印出来的内容。
50
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()返回的那个字符串。
53
在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