環境
- Windows:
10 Education 21H2
- Excel:
バージョン 2209
- Python:
3.9.6
(pyenv + pipenv) - Pipenv:
version 2021.11.23
- openpyxl:
3.0.10
問題
- スクレイピング結果をopenpyxlでExcelファイルとして出力した
- そのExcelファイルを開くときに
'<ファイル名>' の一部の内容に問題が見つかりました。可能な限り内容を回復しますか?ブックの発行元が信頼できる場合は、[はい] をクリックしてください。
というダイアログが開いてしまう- ↓ 修正時のログ
削除されたレコード: /xl/worksheets/sheet1.xml パーツ内の数式
削除されたレコード: /xl/worksheets/sheet4.xml パーツ内の数式
削除されたレコード: /xl/worksheets/sheet6.xml パーツ内の数式
削除されたレコード: /xl/worksheets/sheet14.xml パーツ内の数式
削除されたレコード: /xl/worksheets/sheet16.xml パーツ内の数式
削除されたレコード: /xl/worksheets/sheet20.xml パーツ内の数式
解決の経緯
- 同じような問題を調べたところ、「シート名に全角括弧が含まれている」や「使えない文字が含まれている」ことが原因になるらしい
- しかしこれらの問題を消してもエラーは消えない
- xlsxファイルをzipファイルに変換して、修正前と後を比較すると修正部分がわかるらしい
- openpyxlとExcel間で文字の表現方法が少し異なるようで、純粋に比較してもわからなかった
- 原因がわかった方法
- 問題が発生していたシート内の列を徐々に減らし、問題となっている列を特定
- その列の文字列を色々と変更してみて実験した
原因
- セルの先頭にイコール
=
が付いているとエラー - openpyxlはデフォルトではセルを数値として処理しているらしく、
=
が付いていると数式として認識してしまう? - その結果、誤った数式であるのでエラーが出てしまう?
解決法
- 以下のどちらか (詳細は参考URLをチェック)
- セルの先頭の
=
を'=
に変換 - セルの書式を文字列にする
- セルの先頭の