Spreadsheet::WriteExcel - Perl で Excel ファイルを出力
Spreadsheet::WriteExcel という perl 用のモジュールがある。
昨日、会社経営している友人に出会い、色々と話をしたのだが、「Webシステムで Excel出力できたら便利やのにな」と言うので、ちょっと調べてあげることになった。もちろん、Perl で Excel ファイルを生成するライブラリの存在は知っていたので、あとは以下の点を調べる約束になった。
- 友人が利用しているレンタルサーバにライブラリをインストールできるかどうか?
サーバ管理者がインストールしてくれるならよいが、そうでなければ FTPでインストールできる(C言語で書かれていない)か
- 日本語が正しく出力できるかどうか?
いつものように、FreeBSD の ports を使ってインストールする事にした。The CPAN Search Site にある、Spreadsheet::WriteExcel のバージョンは 2.11 であった。一方、ports にある Spreadsheet::WriteExcel のバージョンは 2.04である。まあそんなに違いは無いだろうと考えて ports からインストールした。
色々な理由があって、私のサーバでは Perl5.8 を使っている。
かなり前に記述したエントリにあるように、本格的に Unicode に対応したバージョンだ。cpan のマニュアルによると、Perl5.8 以降のバージョンでは Perl の UTF-8 文字列を write() メソッドで扱えるとある。しかしうまくいかない。cpan のマニュアルにある、write_unicode() を使ったサンプルと同じようなスクリプトではうまく出力できるのだが。(但し、フォントを Arial Unicode MS
に指定しないとうまくいかない。実はこれで一時間程無駄にした。)
散々悩んだ挙句 CHANGES を読むと、以下の記述が目に入った。
2.10 September 23 2004 - Major
+ Added automatic Unicode handling via utf8 in perl 5.8 and later. Thanks Mark Fowler.
つまり、私のインストールしたバージョン 2.04 では対応していなかったのだ。(実は、過去にも同じような間違いを犯している)
結局 ports に頼らず、自力でインストール(といっても、perl Makefile.PL && make install
で済むのだが)し、再挑戦。今度はうまくいった。
まあ、こういう失敗もやっておいたほうが良い。これで少しは学習しただろう。
Excelファイル出力するCGI (Perl5.8編)
せっかくなので、ソースを公開しておこう。あまり意味のある処理はやっていないが、何かの参考になるかと思う。(ソースは utf-8 で記述する事!!)
#!/usr/bin/perl
require 5.8.0;
use strict;
use utf8;
use Encode;
use CGI;
use Spreadsheet::WriteExcel;
print CGI::header(-type => 'application/vnd.ms-excel');
binmode(STDOUT);
my $workbook = Spreadsheet::WriteExcel->new(\*STDOUT);
# 文字に指定するフォーマット
my $format = $workbook->add_format();
$format->set_font("MS PGothic");
$format->set_size(20);
$format->set_color('red');
$format->set_align('center');
# ワークシートを作成し、色々書き込んでみる
my $worksheet = $workbook->add_worksheet('test');
$worksheet->set_column(0, 0, 63); # カラム幅を指定
$worksheet->write(0, 0, "Perl は便利なんだよ", $format);
$worksheet->write_number('A2', 1.2345);
$worksheet->write_formula('A3', '=SIN(PI()/4)');
# Webへのリンク
$worksheet->write_url(3, 0, 'http://www.randynetwork.com/',
'ランディ・ネットワークの Webサイト', $format);
exit(0);
ちなみに、Drk7.jp というサイトにも、Perl で Excelデータを生成という記事があり、サンプルプログラムも掲載されている。これもおそらく、Spreadsheet::WriteExcel のバージョン 2.04なのであろう。あと、このやり方の場合、フォントは Arial Unicode MS
でないとうまくいか無いが、2.11 だと MS PGothic
だけでなく、MS PMincho
でもうまくいった。残念ながらその他の日本語フォントではうまくいかなかった。
