1

Excel::Writer::XLSX perl モジュールを使用して Excel にエクスポートしています。大規模なエクスポートに時間がかかることを除けば、うまく機能しています。ただし、 $workbook->set_optimization(); を追加すると .xlsx ファイルで数値データのみを取得します。

$worksheet->write() と $worksheet->write_string() の両方を使用してみましたが、$workbook->set_optimization(); を使用すると、数値ではなく文字列を持つフィールドがエクスポートから除外されます。

以前の Spreadsheet::WriteExcel モジュールを使用すると問題なく動作しますが、エクスポートのファイル サイズが大幅に大きくなり、24MB 対 7MB になります。

ヘッダー行を作成するコードは次のとおりです。

# Create a new workbook
my $workbook = Excel::Writer::XLSX->new($file_path);

$workbook->set_optimization();

my $worksheet = $workbook->add_worksheet();
# insert the header row
my $header_cnt = 0;
foreach my $header_cell (@header_values){#loop through each header column and add it to the sheet
    # print $header_cell." - ".$header_cnt."\n";
    # $worksheet->write_string("0", $header_cnt, "test");
    $worksheet->write_string("0", $header_cnt, $header_cell);
    $header_cnt++;
}

$workbook->close() or die "Error closing file: $!";
4

2 に答える 2

2

set_optimization()モードで数字や文字列を書くのに問題はないはずです。実際、そのようなテストケースがいくつかあります。

いくつかのサンプル データを使用してプログラムの変形を実行したところ、出力が正しく表示されました。

#!/usr/bin/perl -w

use strict;
use Excel::Writer::XLSX;

my $workbook = Excel::Writer::XLSX->new('test.xlsx');
$workbook->set_optimization();

my $worksheet = $workbook->add_worksheet();


my @header_values = ( 1, 2, 3, 'foo', 'bar', 6, 7 );
my $header_cnt    = 0;

for my $header_cell (@header_values){
    $worksheet->write(0, $header_cnt, $header_cell);
    $header_cnt++;
}

$workbook->close();

出力例

文字列が左に、数字が右に配置されていることに注意してください。これは、Excel が文字列と数値データとして扱っていることを示しています。

また、write_string()メソッドを使用すると、どちらの場合も文字列を取得できます。

発生している問題は、最適化モードで行と列の順序でデータを書き込む必要があることです。つまり、各行とその行の各列を順番に書き込む必要があります。

たとえば、次の行を for ループの後に追加した場合、2 番目のデータは最適化モードで表示されません。

$worksheet->write('A2', "This is fine");
$worksheet->write('A1', "I'm too late.");
于 2013-02-14T16:11:49.043 に答える