Подтвердить что ты не робот

Сохранение файла openpyxl через текст и поток

Я создаю OpenPyXL в приложении, которое ожидает строку, содержащую содержимое файла excel, для записи по файловому потоку.

Из моего исследования исходного кода OpenPyXL не похоже, что он поддерживает этот вид вывода. Есть ли у кого-нибудь опыт в изменении openpyxl для поддержки этого?

Или какие-либо общие рекомендации/обходные пути?

Спасибо.

4b9b3361

Ответ 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