とあるログをOpenPyXlでxlsxファイルに出力し、MacのExcel2011で開いたところ、以下の様なダイアログがでてしまいました。
問題となっている箇所の分析を行い、以下の2つが原因で開けなくなっていることがわかりました。
- セルの中に携帯絵文字が入っている
- 数値セルが '=' (半角イコール)で始まっている
携帯絵文字対策
携帯絵文字(非常に雑に言うとU+E000-U+F8FF)はOpenPyXl自体は問題なく通り、xlsxファイルが生成されます。ただし、Excelはこれらの表示できない文字はファイルにそのまま記載されることは想定していないようで、上記エラーになり、文字変換(?)が行われます。tsvファイルの読み込みやセルにコピペした場合はこの段階でExcelにより変換されるようで、変換後の文字がセルに格納されます。
今回の作業では、表示できない物は削ってよかったので、以下で削りました。
invalid_code = re.compile(ur'[\u0000-\u001F\u007f\uE000-\uF8FF]')
invalid_code.sub('', s)
実際、携帯絵文字に対応しているのは\uE000-\uF8FF
になります。\u0000-\u001F\u007f
は制御文字なりますが、こちらはOpenPyXlが通してくれないので、入れてあります。(こんな文字入ってるログってどーなのという問題は置いておいて) あとs
はunicode文字列です。
イコール対策
これも絵文字と同様に、どうやらExcelは数値かつ '=' はじまりをエラーとみなすようです。(数式なら数式のセルで入っているべきってことなんだと思う) かつ、OpenPyXlはデフォルトで、数値としてセルに書き込むよう(Be wary of setting Cell values text starting with "=".)で、そのためやはりExcelはエラーを吐いていると思われます。
対策としては、
- 文字列セルに変換する
- セルの頭に ' (シングルクォート)を入れる
があり、今回は前者を選択しました。
ws.cell('A1').data_type = 's'
以上により、エラーなく生成したファイルが開けるようになりました。他のパターンがあればまた書きたいと思います。