結論
Spreadsheet::ParseExcel::SaveParserとWriteExcelの合わせ技で解決できた!
1.素直にParseExcel::SaveParserを使用してみる
# ベースとなるxlsファイルを読み込む
my $base_xls_path = $FindBin::Bin . '/base/filename.xls';
my $parser = Spreadsheet::ParseExcel::SaveParser->new();
my $template = $parser->Parse($base_xls_path);
my $worksheet = $template->worksheet(0);
# ファイルに書き込み
my $row = 0;
for my $list_data (@xls_datas) {
$worksheet->AddCell($row, 0, $list_data->{氏名});
$worksheet->AddCell($row, 1, $list_data->{郵便番号});
$worksheet->AddCell($row, 2, $list_data->{電話番号});
$row++;
}
# 名前を付けて保存
my $dl_file = 'new.xls';
my $save_xls_path = $FindBin::Bin . '/' . $dl_file;
$template->SaveAs($save_xls_path);
よし!これで行けるはず!!
と思ったら、電話番号の先頭0が消えてしまうという。
Excelめ!
2.SaveParserからWriteExcelオブジェクトが取得できることが判明!
試行錯誤していると、下記の記事にたどりつく。
http://www.perlmonks.org/?node_id=1056659
(和訳)SaveParserからWriteExcelが使えるよ
実際にやってみた。
# ベースとなるxlsファイルを読み込む
my $base_xls_path = $FindBin::Bin . '/base/filename.xls';
my $parser = Spreadsheet::ParseExcel::SaveParser->new();
my $template = $parser->Parse($base_xls_path);
# 名前を付けて保存
my $dl_file = 'new.xls';
my $save_xls_path = $FindBin::Bin . '/' . $dl_file;
my $workbook = $template->SaveAs($save_xls_path); # WriteExcelオブジェクトが返却される
# デフォルトフォント設定
my $default_format = Spreadsheet::WriteExcel::Format->new(
15, # default font
font => 'MS Pゴシック',
size => 11, # フォントサイズ
text_wrap => 1, # セル内改行のために必要
border => 1
);
$workbook->{_formats}->[15] = $default_format;
my $worksheet = $workbook->sheets(0);
# 送付リストファイルに書き込み
my $row = 0;
for my $list_data (@xls_datas) {
$worksheet->write_string($row, 0, $list_data->{氏名});
$worksheet->write_string($row, 1, $list_data->{郵便番号});
$worksheet->write_string($row, 2, $list_data->{電話番号});
$row++;
}
$workbook->close();