スペースモラトリアムノカミサマ

日記+コメント付きブックマーク+他人にも役に立つかもしれない情報など。
(更新情報: RSS(ツッコミ付き) / RSS(ツッコミ抜き) / LIRS)

最近の TrackBack:
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|06|07|08|09|10|
2011|01|02|03|07|10|11|
2012|02|03|04|07|08|09|
2013|01|06|07|
2014|02|08|09|11|
2015|09|
2016|01|05|
2017|07|
2018|05|07|
2019|07|
2020|08|09|10|12|
2021|05|
2022|03|

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 になってしまう。

で、同じ悩みを抱えている人は他にもいたようで、解決手段があるようだ。

これでフォント周りは解決だ。

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程度に縮まる) 問題が何とかなると申し分ないのですが。