Perl
WriteExcel
SaveParser

Perlで既存Excelファイルにデータを書き込んで保存する方法(前ゼロが消えない方法)

More than 1 year has passed since last update.

結論

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();