end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

Spreadsheet::WriteExcelのセル内改行にはset_align('vjustify') or set_text_wrap()

改行を含む文字列を単純に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出力します。\n\n\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;
}