LoginSignup
3
8

More than 5 years have passed since last update.

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

Posted at

結論

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();
3
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
8