21 01 2006 Tweet
エクセル万歳系が多いのは世の常(あぁ無常)。万歳というより漫才ジャネーか?CSVでいいじゃんと思いつつも、何かと応える必要があったり。
というわけで、Linux(perl)でこのようなニーズを満たすperl moduleが出現したときには軽い興奮を覚えたもんです(ビバ!とか叫んだとか叫ばなかったとか)。さて、このWriteExcelですが、最近どうしてもExcelに画像を貼り付けて返すCGIを作る必要が生じたわけダ。
CPANで最新バージョンをチェックしてみると24bitのビットマップなら可能という情報が。今使っているバージョンみると、0.39なんで(古スギ!)早速アップデート。
依存も特に無く、サクッとインストール完了
さて、今回貼り付けたい画像はgif(png)なもんでいきおい、PerlmagickとWriteExcelの組み合わせというのがベターな解というわけですな。
と、サクサク進むわけがなく。Imagemagickのconvertで躓くの巻ナリ
#convert test.png test.bmp
で変換したビットマップ画像を下のテストプログラムで実行すると、エラーを吐きすてとまりやがる。
#!/usr/bin/perl use Spreadsheet::WriteExcel; my $workbook = Spreadsheet::WriteExcel->new("test.xls"); $worksheet = $workbook->add_worksheet(); $worksheet->insert_bitmap('A1','./test.bmp');
#./test.pl ./test.bmp isn't a 24bit true color bitmap. at ./test.pl line 5
えっ?なんで24bitじゃないの。ググッたりしてもイマイチすっきりしないので、identifyしていろいろ調べたところ、Class:DirectClass,Type:TrueColor (or Palette?)にしないといけないっぽい。
#identify -verbose ./test.bmp Image: ./test.bmp Format: BMP (Microsoft Windows bitmap image) Geometry: 46x43 Class: DirectClass Type: Palette Endianess: Undefined Colorspace: RGB Depth: 8 bits
どっかに png -> jpg -> bmpでうまく行くヨ~とか書いてあったのだが、スマートじゃないので、オプションで指定だ。
%% pngの場合 %% #convert +matte test.png test.bmp %% gifの場合 %% #convert +matte -type TrueColor test.gif test.bmp
- +matteはαチャンネルを除く
- -type TrueTypeで24bitにする
みたいに属性を変えればいいみたい。ほんでもってperlでこねくりまわすには、ここの部分をPerlMagickを使ってやればイイ。