9
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

OpenPyXlで生成したファイルがExcelで開けないパターンとその対処

Last updated at Posted at 2015-12-10

とあるログをOpenPyXlでxlsxファイルに出力し、MacのExcel2011で開いたところ、以下の様なダイアログがでてしまいました。

スクリーンショット 2015-12-10 10.42.11.png

問題となっている箇所の分析を行い、以下の2つが原因で開けなくなっていることがわかりました。

  1. セルの中に携帯絵文字が入っている
  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はエラーを吐いていると思われます。

対策としては、

  1. 文字列セルに変換する
  2. セルの頭に ' (シングルクォート)を入れる

があり、今回は前者を選択しました。

ws.cell('A1').data_type = 's'

以上により、エラーなく生成したファイルが開けるようになりました。他のパターンがあればまた書きたいと思います。

9
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?