【问题标题】:How to use Excel::Writer::XLSX to create a table where inserting a row copies a column's formula?如何使用 Excel::Writer::XLSX 创建插入行复制列公式的表?
【发布时间】:2018-12-13 08:39:49
【问题描述】:

因此,在 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();

【问题讨论】:

    标签: excel perl


    【解决方案1】:

    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]])'
                },
            ]
        }
    );
    

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

    【讨论】:

      猜你喜欢
      • 2019-05-13
      • 1970-01-01
      • 1970-01-01
      • 2023-01-26
      • 2019-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      相关资源
      最近更新 更多