今回は、C#でNPOIを使ってファイルを触っていて起きた事象だったので、プログラムのバグと信じて追っていた。起こるのは特定のExcelファイル(.xlsx)だけ。他のシンプルなExcelブックなら起きない。
それでも、プログラムのバグだろうとどの時点で壊れるのか、突き止めようと調べた。元のファイルを読み込んで、そのまま出力するだけでもエラーが出る。Excelでを開こうとすると、
‘xxxxxx.xlsx’の一部の内容に問題が見つかりました。可能な限り内容を回復しますか?ブックの発行元が信頼できる時は、[はい]をクリックしてください。」というエラーメッセージ。
[はい]をクリックすると
「読み取れなかった内容を修復または削除することにより、ファイルを開くことができました。」と出、修復されたレコード: /xl/worksheeets/sheet1.xml
パーツ内のセル情報 と表示され、有益な情報は出ない。因みに対象のExcelブックのシートの名称は変更されていて、表面上sheet1は無い。
エラーメッセージのウィンドウには、xmlのログファイルが表示できるリンクがあるので、見てみると
<recoveryLog xmlns=”http://schemas.openxmlformats.org/spreadsheetml/2006/main”>
<logFileName>error417200_01.xml</logFileName>
<summary>ファイル ‘C:\Users\aaa\AppData\Local\Packages\bbb\LocalState\xxx.xlsx’ にエラーが検出されました</summary>
<repairedRecords>
<repairedRecord>修復されたレコード: /xl/worksheets/sheet1.xml パーツ内のセル情報</repairedRecord>
</repairedRecords>
</recoveryLog>
とあるだけ。やはり有益な情報は無い。
Excelファイルをプログラムで触っていなくても、Excelブックを何度も修正していると、やたらと開くのに時間が掛かったり、似たようなメッセージを見た記憶に思い当たる。Excel方眼紙で作られた複雑な様式のExcelブックをダウンロードして修正を重ねた場合にあるような。
ダメ元で、ジャストシステムの JUST CALC で開いて、何も修正を加えず、名前を付けて保存をしてみる。ファイルサイズが小さくなっている。
このファイルで作成したプログラムを実行し、出力したファイルをExcelで開くと、エラー表示無しに開いた。
確か記憶では、LibreOfficeのCalcでも修復されたような。同様にLibreOfficeのCalcで開いて、何も修正を加えず、名前を付けて保存をしてみる。ファイルサイズがJUST CALCの時よりさらに小さくなっている。続けて、このファイルで作成したプログラムを実行し、出力したファイルをExcelで開くと、エラー表示無しに気持ちよく開く。
Excelファイルがおかしくなったと思ったら、例えプログラムで作成したファイルでも、時間を掛けて追いかけず、取りあえず 元ファイルを LibreOffice か JUST CALC で開いて保存し直してみるのもいいかも。
コメント