ファイルストリーム経由で書き込むために、Excelファイルのコンテンツを含む文字列を期待するアプリケーションにOpenPyXLを構築しています。
OpenPyXL ソース コードを調べたところ、この種の出力はサポートされていないようです。これをサポートするためにopenpyxlを変更した経験がある人はいますか?
または、一般的なアドバイス/回避策はありますか?
ありがとう。
ファイルストリーム経由で書き込むために、Excelファイルのコンテンツを含む文字列を期待するアプリケーションにOpenPyXLを構築しています。
OpenPyXL ソース コードを調べたところ、この種の出力はサポートされていないようです。これをサポートするためにopenpyxlを変更した経験がある人はいますか?
または、一般的なアドバイス/回避策はありますか?
ありがとう。
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()によって返される文字列です。
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
StringIO
オブジェクトを使用してファイルの内容を保存するのはどうですか:
from openpyxl.workbook import Workbook
from StringIO import StringIO
output = StringIO()
wb = Workbook()
wb.save(output)
print output.getvalue()
探している文字列は、この例の最後の行に出力されているものです。