我遇到的情况是我使用Perl使用Excel::Writer::XLSX将数据写入Excel文件。我将记录存储为数组中逗号分隔的字符串。例如:
$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
现在我必须在中心对齐,边框和bg_color的Excel中显示这些数据。所以我做了以下几点:
my $general_format = $workbook->add_format(
border => 1,
bg_color => 31,
align => 'center'
);
然后我在数组上放了一个循环,在拆分后,我将每条记录的所有列放在excel中,如下所示:
Loop on array of records{
$worksheet->write_row( $i+2, 0, $recordRef, $general_format );
}
但我面临的问题是col1&每个记录的col2都有数字,而col3& col4是百分比/日期等。我需要以逗号分隔格式格式化数字。如果我执行以下操作,输出正常,但是当我们单击Excel中的col3 / col4单元格时,它会将百分比/日期转换为数字格式:
my $general_format = $workbook->add_format(
border => 1,
bg_color => 31,
align => 'center',
num_format => '#,##0'
);
有没有办法专门对col1&amp ;;采用num_format => '#,##0'
格式? col2以及col1&amp ;;上完成的其余格式化。 col2(颜色/对齐/等),因为正在写入的数据是row(record)-wise?
我需要col1和col2以下格式:
border => 1,
bg_color => 31,
align => 'center',
num_format => '#,##0'
和col3和col4具有以下格式:
border => 1,
bg_color => 31,
align => 'center'
但我只能记录数据(使用write_row()
),而不是逐列。
答案 0 :(得分:2)
您无法将多种格式传递给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)。
重要的是要注意,如果单元格中没有其他格式,set_column
只会写一种格式。
$format
参数将应用于列中没有格式的任何单元格。
您还需要处理应用格式的顺序。
如果您希望以这种方式定义列格式,则应在调用write()之前调用该方法。如果你之后再打电话,它将没有任何效果。
默认行格式优先于默认列格式