現在、Flaskを使ったWebアプリを作成しています。
サーバーでExcelフィアルを作成してそのExcelファイルをクライアントにダウンロードして開きたいのですが、Excelファイルをダウンロードすると毎回Excelファイルが破損して開けません。
Excelファイルの作成はopenpyxlを使っています。
サーバーで作成されたExcelファイルをサーバーから直接WinSCP経由で取得すると問題なくファイルを開くことができます。
Excelファイルに挿入するデータが原因なのかと思いExcelファイルに何も書き込まない状態でExcelファイルを生成しクライアントにダウンロードするように変更し動作させました。しかし、ファイルが破損してひらけません。なので書き込むデータが原因ではないと思われます。
また、VSCodeの拡張機能を使ってVSCode内で破損していると表示がでてくるExcelファイルを開くとデータを挿入したExcelファイルでも正常に見ることができます。
以下が該当部分のソースコードになります
Python
1@app.route('/write_log',methods=["GET","POST"]) 2@login_required 3def write_log(): 4 5 ・・・データを取得する処理・・・ 6 7 # Excelファイルの作成 8 XLSX_MIMETYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' 9 wb = openpyxl.Workbook() 10 worksheet = wb.active 11 worksheet.title = "ログの出力" 12 13 ・・・ 取得データの挿入・・・ 14 15 # 列幅自動調整 16 for col in worksheet.columns: 17 max_length = 0 18 column = col[0].column_letter 19 for cell in col: 20 if len(str(cell.value)) > max_length: 21 max_length = len(str(cell.value)) 22 23 adjusted_width = (max_length + 2) * 2.5 24 worksheet.column_dimensions[column].width = adjusted_width 25 # フィルターの調整 26 worksheet.auto_filter.ref = 'A1:F1' 27 # 書き込みファイル名とその設定 28 now = datetime.datetime.now() 29 d = now.strftime('%Y%m%d%H%M%S') 30 downloadFileName = f"{d}.xlsx" 31 # 出力先ストリームの設定 32 output = BytesIO() 33 # ワークブックをメモリ上に保存 34 wb.save(output) 35 wb.close() 36 output.seek(0) 37 38 # バイトでファイルをDLする 39 return send_file( 40 BytesIO(output.getvalue()), 41 download_name=downloadFileName, 42 as_attachment=True, 43 mimetype = XLSX_MIMETYPE)
〇動作環境
サーバー:さくらサーバー(CGIを使用)
Python:3.8.12
モジュール情報
a2wsgi 1.10.7
alembic 1.13.1
anyio 4.5.0
blinker 1.8.2
certifi 2021.10.8
cffi 1.15.0
chardet 4.0.0
click 8.1.7
cryptography 2.9.2
et-xmlfile 1.1.0
exceptiongroup 1.2.2
fail2ban 0.11.2
fastapi 0.115.0
Flask 3.0.3
Flask-Login 0.6.3
Flask-Migrate 4.0.7
Flask-SQLAlchemy 3.1.1
Flask-WTF 1.2.1
greenlet 3.0.3
idna 2.10
importlib_metadata 7.1.0
importlib_resources 6.4.0
itsdangerous 2.2.0
Jinja2 3.1.4
Mako 1.3.5
MarkupSafe 2.1.5
openpyxl 3.1.4
pip 24.2
pycparser 2.21
pydantic 1.10.18
pyinotify 0.9.6
PyMySQL 1.0.2
pyOpenSSL 20.0.1
PySocks 1.7.1
requests 2.25.1
setuptools 57.0.0
six 1.16.0
sniffio 1.3.1
SQLAlchemy 2.0.30
sqlite3 0.0.0
starlette 0.38.5
typing_extensions 4.12.2
urllib3 1.26.7
Werkzeug 3.0.3
wheel 0.43.0
WTForms 3.1.2
zipp 3.19.2
Excelに挿入するデータに関して公開できないものなので省略させていただきました。申し訳ございません。
こちらに質問を掲載することに慣れてなく拙い文章でうまく伝わっているか分かりませんがよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー