Сохранение файла openpyxl через текст и файловый поток - PullRequest
20 голосов
/ 12 декабря 2011

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

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

Или какие-то общие советы / обходные пути?

Спасибо.

Ответы [ 3 ]

35 голосов
/ 03 января 2012

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

15 голосов
/ 12 декабря 2011

Как насчет использования объекта StringIO для сохранения содержимого файла:

from openpyxl.workbook import Workbook
from StringIO import StringIO

output = StringIO()
wb = Workbook()
wb.save(output)
print output.getvalue()

Строка, которую вы ищете, печатается в последней строке этого примера.

1 голос
/ 13 марта 2019

В 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 имя файла отправляется прямо в ZipFile, который принимает путь или объект, подобный файлу, такИменованный файл не требуется, просто используйте 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

...