ExcelをXML操作したら破損した。数式が壊れているらしいが…

事件編

Pythonを使ってExcelファイル(.xlsx)をXML操作してみようと、とりあえずZIP形式として読み込み→ElementTreeでXMLパース→加工せずにXML形式で書き出し、という処理を書いてみた。何もしていないし大丈夫だろうと高を括っていたら、

エラーメッセージ

開けない。

修復をかけても真っ白なシートが表示されるだけ。

エラーメッセージ

ワークシートの実体であるsheet1.xmlが壊れているらしい。

解決編

出力されるXMLでの名前空間の定義の問題だった。ElementTreeは、何もしないとns0, ns1 … みたいな番号順の prefix で名前空間を自動的に処理してくれるが、ちゃんと決まった名前にしておかないと xlsx 内での関係性が壊れてしまうよう。

worksheet 要素の属性 mc:Ignorable=”x14ac xr xr2 xr3″ みたいに、に名前空間を書くのはやめてほしい。

で、さらに、ElementTree はドキュメント中に出現しなかった名前空間の定義は書き出さないようだが、xr2 と xr3 が使われておらず、書き出されていなかった。先のIgnorableに列挙されている xr2:http://schemas.microsoft.com/office/spreadsheetml/2015/revision2 と xr3:http://schemas.microsoft.com/office/spreadsheetml/2016/revision3 もちゃんと定義しておかないといけないらしい。(Ignorableから消せばうまくいったのかは試していない)