使用perl将多种格式应用于excel中的相同数据

我有一种情况,我正在使用Excel :: Writer :: XLSX和Perl将数据写入Excel文件。 我有以逗号分隔的string存储在数组中的logging。 例如:

$array[0] = "col1_value,col2_value,col3_value,col4_value" # row 1 $array[1] = "col1_value,col2_value,col3_value,col4_value" # row 2 . . $array[$n] # row n 

现在我必须显示这些数据与Excel中心alignment,边界和bg_color。 所以我做了如下:

 my $general_format = $workbook->add_format( border => 1, bg_color => 31, align => 'center' ); 

然后我把一个循环放在数组上,在分割之后,我把每个logging的所有列放在excel中,如下所示:

 Loop on array of records{ $worksheet->write_row( $i+2, 0, $recordRef, $general_format ); } 

但我面临的问题是每个logging的col1&col2有数字,而col3&col4是百分比/date等。我需要用逗号分隔的格式格式化数字。 如果我这样做,输出是好的,但是当我们在Excel中单击col3 / col4单元格时,它将百分比/date转换为数字格式:

 my $general_format = $workbook->add_format( border => 1, bg_color => 31, align => 'center', num_format => '#,##0' ); 

有没有什么办法在col1&col2上专门应用num_format => '#,##0'格式,以及在col1&col2上完成的其他格式(颜色/alignment方式等),因为正在写入的数据是行(logging)-wise?

我需要col1和col2有以下格式:

 border => 1, bg_color => 31, align => 'center', num_format => '#,##0' 

col3和col4有以下格式:

 border => 1, bg_color => 31, align => 'center' 

但是我可以只写数据logging(使用write_row() ),而不是逐列。

您不能将多种格式传递给write_row方法。 但是,您可以在使用set_column写入行之前为每列设置默认格式。

这是一个简短的例子。

 use strict; use warnings; use Excel::Writer::XLSX; my $workbook = Excel::Writer::XLSX->new( 'perl.xlsx' ); my $worksheet = $workbook->add_worksheet(); my $general_format = $workbook->add_format( border => 1, bg_color => 31, align => 'center', ); my $num_format = $workbook->add_format(); $num_format->copy($general_format); # we have to copy the other format options $num_format->set_num_format('#.##0'); # set column formats up front $worksheet->set_column( 'A:B', undef, $num_format); $worksheet->set_column( 'C:D', undef, $general_format); my @records = ( [qw/ 1.1 11.111 1% 2017-12-05/], [qw/ 2.2 22.222 2.2% 2017-12-05/], [qw/ 3.3 33.333 3.33% 2017-12-05/], [qw/ 4.4 44.444 4.444% 2017-12-05/], ); my $i = 1; foreach my $record ( @records) { $worksheet->write_row( $i, 0, $record ); # no more format here ++$i; } 

这就是它的样子(使用Excel Viewer)。

示例Excel文件输出

需要注意的是,如果单元格中没有其他格式,则set_column只写入格式。

$format参数将应用于列中没有格式的单元格。

您还需要注意应用格式的顺序。

如果您希望以这种方式定义列格式,则应在调用write()之前调用该方法。 如果你之后再打电话,它不会有任何效果。

默认的行格式优先于默认的列格式