Сохранение файла openpyxl через текст и поток
Я создаю OpenPyXL в приложении, которое ожидает строку, содержащую содержимое файла excel, для записи по файловому потоку.
Из моего исследования исходного кода OpenPyXL не похоже, что он поддерживает этот вид вывода. Есть ли у кого-нибудь опыт в изменении openpyxl для поддержки этого?
Или какие-либо общие рекомендации/обходные пути?
Спасибо.
Ответы
Ответ 1
Ответ 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()
Ответ 2
Как использовать объект StringIO
для сохранения содержимого файла:
from openpyxl.workbook import Workbook
from StringIO import StringIO
output = StringIO()
wb = Workbook()
wb.save(output)
print output.getvalue()
Строка, которую вы ищете, это то, что печатается в последней строке этого примера.
Ответ 3
В 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())
Посмотрев на реализацию метода save
WorkBook, "имя файла" отправляется прямо в ZipFile, который принимает путь или файлоподобный объект, поэтому нет необходимости в NamedTeoraryFile и просто используется встроенный в память 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