改行を含む文字列を単純にwrite()やmerge_range()で出力しようとしましたが、改行しない状態でexcelファイルが生成されました。
http://search.cpan.org/perldoc?Spreadsheet::WriteExcel
どうやら、Spreadsheet::WriteExcelでセル内改行するには、set_align('vjustify') または set_text_wrap() を行う必要があるようです。
sample script
#!/usr/local/bin/perl use strict; use utf8; use Spreadsheet::WriteExcel; my $FONT_NAME = 'MS 明朝'; my $FONT_SIZE = 11; main(); sub main { my $wbook = add_xls_book('/home/endo/tmp/foo.xls'); my $wsheet = add_worksheet($wbook,'test'); my $fmt = add_xls_format($wbook); my $disp_val = "改行を含む文字列を\n出力します。\nA\nB\n"; $wsheet->merge_range('A1:D3',$disp_val,$fmt); $wbook->close(); } sub add_xls_format { my ($wbook) = @_; my $fmt = $wbook->add_format(); $fmt->set_font($FONT_NAME); $fmt->set_size($FONT_SIZE); # $fmt->set_align('vjustify'); #セル内改行では必要 $fmt->set_text_wrap(); #セル内改行では必要 $fmt->set_shrink(); return $fmt; } sub add_xls_book { my ($xls_path) = @_; my $wbook = Spreadsheet::WriteExcel->new($xls_path); $wbook->{_formats}->[15]->set_properties(font => $FONT_NAME, size => $FONT_SIZE); return $wbook; } sub add_worksheet { my ($wbook,$sheet_name) = @_; my $wsheet = $wbook->add_worksheet($sheet_name); $wsheet->hide_gridlines(); #印刷時のgrid line非表示 $wsheet->set_landscape(); #用紙横置 return $wsheet; }