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

时间:2017-12-05 00:48:44

标签: excel perl formatting format

我遇到的情况是我使用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()),而不是逐列。

1 个答案:

答案 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)。

Example Excel file output

重要的是要注意,如果单元格中没有其他格式,set_column只会写一种格式。

  

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

您还需要处理应用格式的顺序。

  

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

     

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