首页 > 解决方案 > 如何使用 Excel::Writer::XLSX 创建插入行复制列公式的表?

问题描述

因此,在 Excel 中,我可以手动创建以下内容(我让它在 C 列中显示公式):

在此处输入图像描述

然后,我可以选择 A:1 到 C3,选择 Insert -> Table,然后在 Create Table 对话框中按 OK 将我的数据变成一个表,取消选中 Filter Button 框:

在此处输入图像描述

然后,当我右键单击第 3 行并选择“插入”时,我得到一个新的第 3 行,其中 C 列的公式正确复制。

在此处输入图像描述

我的问题是我似乎无法使用 Excel::Writer::XLSX 使用 Perl 生成 Excel 文件,该文件可以创建一个表格,在该表格中插入一行将导致公式被复制。它最终是空白的,如下所示:

在此处输入图像描述

下面是我的代码。任何见解将不胜感激。

#!/usr/bin/env perl

use strict;
use warnings;

use Excel::Writer::XLSX;

my $filePath = shift;
my $workbook = Excel::Writer::XLSX->new( $filePath );
my $worksheet = $workbook->add_worksheet( 'Metadata' );

my @data = ( [1,2,"=SUM(A2:B2)"], [3,4,"=SUM(A3:B3)"], [5,6,"=SUM(A4:B4)"] );

my $rowCount = (scalar @data) + 1;

$worksheet->add_table( 
    "A1:C$rowCount", 
    {
        data => \@data,
        name => 'Table1',
        style => 'Table Style Medium 2',
        autofilter => 0,
        header_row => 1,
        columns => [
            { header => 'Value 1' },
            { header => 'Value 2' },
            { header => 'Sum' },
        ]
    }
);

$workbook->close();

标签: excelperl

解决方案


Excel 表格没有得到充分利用……很高兴看到有人欣赏他们所提供的东西,并感谢模块作者添加表格支持。

有几件事......如果你想要一个基于表格的公式,请在表格列的公式属性中声明它。这将导致它被复制到任何创建的新行中。

{ header => 'Title', formula => '=1+2' }

其次,可能有一种方法可以通过 R1C1 语法(Excel 支持它,但我不知道 Excel::Writer::XLSX 是否支持),但我发现当您引用表中的其他列时,它是基于表格列而不是单元格引用最容易做到这一点——这是 Excel 表格相对于标准范围的一大优势。

formula => '=[@[Header A]]*[@[Header B]]'

受影响的代码应如下所示:

my @data = ( [1,2], [3,4], [5,6] );

my $rowCount = (scalar @data) + 1;

$worksheet->add_table(
    "A1:C$rowCount",
    {
        data => \@data,
        name => 'Table1',
        style => 'Table Style Medium 2',
        autofilter => 0,
        header_row => 1,
        columns => [
            { header => 'Value 1' },
            { header => 'Value 2' },
            { header => 'Sum',
              formula => '=SUM([@[Value 1]]:[@[Value 2]])'
            },
        ]
    }
);

当你打开电子表格并添加一行时,我想你会得到你想要的行为。


推荐阅读