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

久々に Perl で Excel ファイルを処理する必要がでました。前回スクリプトを書いたころは Spreadsheet::WriteExcel も version 2.04 の頃と随分と昔のことなので、どうやるかなんて綺麗さっぱり忘れています。最新の Spreadsheet::WriteExcel は version 2.18 らしく changes を見ていたら

+ Added automatic Unicode handling via utf8 in perl 5.8 and
later. Thanks Mark Fowler.
Added several unicode_*.pl examples in different encodings.
Thanks to Sean Burke for the sample encodings.

てことが書いてあります。ちょっとぐぐってみたら、「元祖 サトシのブログ : Spreadsheet::WriteExcel - Perl で Excel ファイルを出力」ってとこにズバリの情報がでていて、perl 5.8 系もっといえば、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 対応のフォント?のみが正常動作するのでしょうか?ちょっと深追いしてませんが・・・

さて、version 2.04 から何が変更されたのかなぁ〜と思ってコードを見てみたら、

    if ($] >= 5.008) {
        require Encode;

        if (Encode::is_utf8($rgch)) {
            $rgch = Encode::encode("UTF-16BE", $rgch);
            $encoding = 1;
        }
    }

なんて記述がポツポツと見受けられます。Encode つかって結局内部的に UTF-16BE に変換してるってことでした。なので、以前の記述方法で事前に UTF-16BE に変換して write_unicode でデータを書き込むって方法でも変わらず正常に動作します。

perl 5.8 系 + utf 8 な環境での Spreadsheet::WriteExcel のサンプル

下記スクリプトは Perl 5.8 系環境下で utf8 で保存して実行下さい。ちゃんと excel で読める sample.xls が生成されるかと思います。ちなみにサンプルデータはとあるサイトの Google-Analystics のアクセスデータに手を入れたものです(w
require 5.8.0;
use strict;
use utf8;

use Encode;
use Spreadsheet::WriteExcel;

my $workbook = Spreadsheet::WriteExcel->new("simple.xls");
my $format   = $workbook->add_format();
$format->set_font("メイリオ");
$format->set_size(10);

my $uni_font = $workbook->add_format( font => 'Arial Unicode MS' );
my $name = 'アクセス分析';
utf8::decode($name);
my $worksheet = $workbook->add_worksheet($name);

my $y = 0;
while (<DATA>) {
    chomp;
    my @data = split( ',', $_ );
    my $x = 0;
    foreach (@data) {
        utf8::decode($_);
        $worksheet->write( $y, $x++, $_, $format );
    }
    $y++;
}


1;
__DATA__
ページ タイトル,固有の訪問数,ページビュー数,平均閲覧時間,離脱率,$ インデックス
おいしいパン&離乳食をつくるぞ日記。,74,95,50.41,69.47,0.00
ベーグル Archives :: おいしいパン&離乳食をつくるぞ日記。,12,23,26.08,43.48,0.00
甘くないパン Archives :: おいしいパン&離乳食をつくるぞ日記。,9,9,36.80,44.44,0.00
離乳食 Archives :: おいしいパン&離乳食をつくるぞ日記。,9,11,53.00,54.55,0.00
甘いぱん Archives :: おいしいパン&離乳食をつくるぞ日記。,8,12,26.86,41.67,0.00
ブルーベリーベーグル :: おいしいパン&離乳食をつくるぞ日記。,7,8,77.50,50.00,0.00
9ヶ月の離乳食 :: おいしいパン&離乳食をつくるぞ日記。,7,8,23.60,37.50,0.00
番外編? Archives :: おいしいパン&離乳食をつくるぞ日記。,5,5,86.00,80.00,0.00
フォカッチャ :: おいしいパン&離乳食をつくるぞ日記。,5,8,156.33,62.50,0.00
バナナヨーグルト :: おいしいパン&離乳食をつくるぞ日記。,3,3,17.00,66.67,0.00
チョコチップベーグル :: おいしいパン&離乳食をつくるぞ日記。,3,3,0.00,100.00,0.00
2004年06月 Archives :: おいしいパン&離乳食をつくるぞ日記。,3,3,0.00,100.00,0.00
おかゆ&かぼちゃスープ :: おいしいパン&離乳食をつくるぞ日記。,2,2,0.00,100.00,0.00
profile :: おいしいパン&離乳食をつくるぞ日記。,2,2,16.00,0.00,0.00
ベーグル :: おいしいパン&離乳食をつくるぞ日記。,2,2,0.00,100.00,0.00
ココアベーグル(アーモンド入り♪) :: おいしいパン&離乳食をつくるぞ日記。,2,2,10.50,0.00,0.00
鯛入りおかゆ :: おいしいパン&離乳食をつくるぞ日記。,2,2,0.00,100.00,0.00
なっとう粥&野菜スープ(ツナ入り) :: おいしいパン&離乳食をつくるぞ日記。,2,2,0.00,100.00,0.00
2004年11月 Archives :: おいしいパン&離乳食をつくるぞ日記。,1,1,0.00,100.00,0.00
2005年10月 Archives :: おいしいパン&離乳食をつくるぞ日記。,1,1,0.00,100.00,0.00
コーングリッツパン :: おいしいパン&離乳食をつくるぞ日記。,1,1,0.00,100.00,0.00
お豆腐のスープ :: おいしいパン&離乳食をつくるぞ日記。,1,1,0.00,100.00,0.00
2005年11月 Archives :: おいしいパン&離乳食をつくるぞ日記。,1,1,5.00,0.00,0.00
2004年03月 Archives :: おいしいパン&離乳食をつくるぞ日記。,1,2,53.00,50.00,0.00
サツマイモいりおかゆ :: おいしいパン&離乳食をつくるぞ日記。,1,1,0.00,100.00,0.00
ベーコンロールパン :: おいしいパン&離乳食をつくるぞ日記。,1,1,0.00,100.00,0.00
2004年02月 Archives :: おいしいパン&離乳食をつくるぞ日記。,1,1,1.00,0.00,0.00
じゃがいもとアスパラのスープ :: おいしいパン&離乳食をつくるぞ日記。,1,2,46.00,50.00,0.00
チョコチップメロンパン :: おいしいパン&離乳食をつくるぞ日記。,1,1,37.00,0.00,0.00
ほうれん草入りうどん :: おいしいパン&離乳食をつくるぞ日記。,1,1,25.00,0.00,0.00
メロンパン :: おいしいパン&離乳食をつくるぞ日記。,1,1,19.00,0.00,0.00
マーブルメロンパン :: おいしいパン&離乳食をつくるぞ日記。,1,1,17.00,0.00,0.00
ココアロール :: おいしいパン&離乳食をつくるぞ日記。,1,1,211.00,0.00,0.00
2005年01月 Archives :: おいしいパン&離乳食をつくるぞ日記。,1,1,0.00,100.00,0.00

ちなみに、Windows 上の ActivePerl なら、Win32::OLE 使う方法もあります。こちらについてはまた別途。

- スポンサーリンク -