33

ファイルストリーム経由で書き込むために、Excelファイルのコンテンツを含む文字列を期待するアプリケーションにOpenPyXLを構築しています。

OpenPyXL ソース コードを調べたところ、この種の出力はサポートされていないようです。これをサポートするためにopenpyxlを変更した経験がある人はいますか?

または、一般的なアドバイス/回避策はありますか?

ありがとう。

4

5 に答える 5

46

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()によって返される文字列です。

于 2012-01-03T15:13:19.507 に答える
33

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())

WorkBooksaveメソッドの実装を確認した後、「ファイル名」は、パスまたはファイルのようなオブジェクトを受け入れる 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

于 2019-03-13T14:48:09.427 に答える
18

StringIOオブジェクトを使用してファイルの内容を保存するのはどうですか:

from openpyxl.workbook import Workbook
from StringIO import StringIO

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

探している文字列は、この例の最後の行に出力されているものです。

于 2011-12-12T06:37:10.680 に答える