日記+コメント付きブックマーク+他人にも役に立つかもしれない情報など。
(更新情報: RSS(ツッコミ付き) / RSS(ツッコミ抜き) / LIRS)
- p (01/03)
- Thiramil (10/26)
- 久々にいまむらを食べたい通りすがり (09/28)
- Fluxadir (05/16)
- Antiprestin (11/08)
2007/08/28
_ [Perl] Spreadsheet::WriteExcel での日本語の取り扱い
ちょっと Perl で Excel ブックを吐き出したかったので Spreadsheet::WriteExcel など使ってみた。
Spreadsheet::WriteExcel - クロス・プラットフォームなExcelバイナリ・ファイルを出力
日本語の出力にあたって、Spreadsheet::WriteExcel = Perl で Excel 出力 :: Drk7jpの例だと、日本語を書き込むためにわざわざ
$worksheet->write_unicode(0, 0, utf8( Jcode->new('こんにちわ Excel!')->utf8 )->utf16);
としているし、Spreadsheet::WriteExcelで日本語を扱うでも
$worksheet->write_unicode(0, 0, encode('ucs2', decode('euc-jp', '河馬屋二千年堂')));
とされているのだが、最近のバージョン (少なくとも2.18) では、utf8 フラグのついた Unicode 文字列なら素直に
$worksheet->write(0, 0, 'こんにちわ Excel!');
で通った。
2.10 September 23 2004 - Major
+ Added automatic Unicode handling via utf8 in perl 5.8 and later. Thanks Mark Fowler.
[Revision history for Perl module Spreadsheet::WriteExcel.より引用]
ここからかな。
同様に、add_worksheet でのシート名指定や、add_font でのフォント名指定も utf8 フラグ付きの日本語がすんなり通った。無事MS Pゴシックで書けましたよ。
しかし、行・桁・セル毎にはスタイルを指定するメソッドがあるのに、シートのデフォルトスタイルを指定するメソッドがないので、空セルがみなモジュールでデフォルトに設定されている Arial 10pt になってしまう。
で、同じ悩みを抱えている人は他にもいたようで、解決手段があるようだ。
- daily dayflower - Spreadsheet::WriteExcel でデフォルトフォントが Arial なのがイヤだ
- Spreadsheet::WriteExcel、デフォルトフォントを「MS Pゴシック」に (bokut.in)
これでフォント周りは解決だ。
Spreadsheet::WriteExcel = Perl で Excel 出力 :: Drk7jpの例を今風に直すと (ソースは UTF-8 で)
#!/usr/bin/perl -w use strict; use warnings; use utf8; use Spreadsheet::WriteExcel; # Create a new workbook called simple.xls and add a worksheet my $workbook = Spreadsheet::WriteExcel->new("simple.xls"); $workbook->{_formats}->[15]->set_properties( font => 'MS Pゴシック', size => 9, align => 'vcenter', ); my $worksheet = $workbook->add_worksheet('シート1'); # Write some text $worksheet->write(0, 0, 'こんにちわ Excel!'); # Write some numbers $worksheet->write(2, 0, 3); # Writes 3 $worksheet->write(3, 0, 3.00000); # Writes 3 $worksheet->write(4, 0, 3.00001); # Writes 3.00001 $worksheet->write(5, 0, 3.14159); # TeX revision no.? # Write some formulas $worksheet->write(7, 0, '=A3+A6'); $worksheet->write(8, 0, '=IF(A5>3,"Yes","No")'); # Write a hyperlink $worksheet->write(10, 0, 'http://www.perl.com/'); # Close Workbook $workbook->close;
ということになりますね。(Excel のフォントサイズは 11pt じゃなくて 9pt が好き派)
あとは、Spreadsheet::WriteExcel でファイルを吐き出すと Excel が吐き出すファイルより大きくなる (吐き出されたファイルを Excel 2007 で開いてそのまま上書き保存すると3/4程度に縮まる) 問題が何とかなると申し分ないのですが。