PSLブログ

ヨシナシゴトヲツヅリマス

Spreadsheet::WriteExcelをutf8で

新しい案件で、Windows+WebサーバでExcelファイルをPerlCGIから書き出すニーズが出てきた。もし受注となれば、久しぶりにExcelファイルをこしらえて書き出していくことになる。Spreadsheet::WriteExcelモジュールを使えば、Perlのコーディングでファイルが生成できる。

WindowsなサーバでもSpreadsheet::WriteExcelを使えるのかなと調べていたところ、Perl使いの方が書いているブログを見つけた。

drk7.jp - Spreadsheet::WriteExcel が 2.10 から便利になっている件について

Encode が使える環境ならば、version 2.10 から普通に utf8 な日本語が扱えるようになったみたいです。ちなみに以前は UTF-16BE で日本語を扱う必要がありました。フォントも 'Arial Unicode MS' のみが使用可能だったのですが、'MS UI Gothic' や 'Meiryo' なども正常に表示できました。 メイリオなんかは日本語で指定してもフォント情報が正しく設定できるようです。
my $format   = $workbook->add_format();
$format->set_font("メイリオ");
$format->set_font("Meiryo");
$format->set_font("MS UI Gothic");
$format->set_font("MS PGothic");
$format->set_font("XANO明朝U32");
上記全てが動作しました。残念ながら、 'HG丸ゴシックM-PRO' なんかはダメみたいですね。JIS2K 対応のフォント?のみが正常動作するのでしょうか?ちょっと深追いしてませんが・・・

おお、便利だ。実は、以前Spreadsheet::WriteExcelを扱ったときも、フォント名はもとより、日本語を書き出すときに、いちいちUTF16BEに変換して引数に指定していたのだ。

# use Unicode::String qw(utf8 utf16); を使用
sub to_utf16 {
    return utf8( encode("utf-8", decode("cp932", $_)) )->utf16;
}

こんなサブルーチンを作った上で、

$workbook->add_worksheet(to_utf16("ワークシート名"), 1);
$sheet->write_unicode($row, $col, to_utf16($value), $format);

のようなことをしていた。しかもヘッダやフッタはutf8を指定するなどいろいろ大変だった。ところが、そんなことは意識せずコード自体をutf8で書けば済むとはなんと楽なことか。内部的にUTF16BEに書き替えているようだが、コーディングの際に意識しなくてよくなったのはよかった。

しかしこの元記事、2年も前のものだった…。ちょうど入れ違いでリリースされたようだ。失敗した!