当前位置: 首页 > 知识库问答 >
问题:

如何使用Excel::Writer::XLSX创建一个表,其中插入一行将复制列的公式?

何兴邦
2023-03-14

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

然后,我可以选择A: 1到C3,选择插入-

然后,当我右键单击第3行并选择Insert时,我得到一个新的第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();

共有1个答案

余阳秋
2023-03-14

Excel表格使用得太少了。。。很高兴看到有人对他们所能提供的东西表示赞赏,并对模块作者添加表支持表示赞赏。

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

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

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

 类似资料:
  • 批量订单 Purchorder 我已经试了一个星期了。我有这两个表,batchporder和purchord在batchporder表中,我需要插入一行,并获得传递给purchord插入的主id。在purchord中,我需要插入多行,因此我使用了insert\u batch。 控制器 模型 错误1 遇到PHP错误严重性:警告 消息:array_keys()要求参数1为数组,字符串为给定值 文件名:

  • 问题内容: 标题基本上总结了所有内容,包括我想在这里完成的工作。 一些更多的信息,我有一个包含4列的表。我需要它的精确副本,但只需要更改一列的值即可。 假设该列的客户编号为123456(其他值并不重要)。 如何复制整个表并将客户号更改为123457,然后将该副本插入到同一表中。 如果一切顺利,我应该拥有的记录(数据库中只有一个客户)是以前的两倍(只有客户编号已更改)。 我正在使用MSSQL2008

  • 问题内容: 在MySQL中,我试图复制一排的 自动增量 和 插入 数据到同一个表的新行。 如何在单个查询中执行此操作? 问题答案: 用途: 除以外的所有列都在哪里?如果要显式插入2,则将其包括在INSERT列列表和SELECT中: 当然,在第二种情况下,您必须注意2 的可能重复项。

  • 问题内容: 直到11g版本(包括11g)为止,Oracle中似乎都没有AUTO_INCREMENT的概念。 如何在Oracle 11g中创建行为类似于自动增量的列? 问题答案: 从Oracle 11g开始,Oracle中 没有诸如“ auto_increment”或“ identity”列之类的东西。但是,您可以使用序列和触发器轻松对其进行建模: 表定义: 触发定义: 更新: 列现在在Oracle

  • 问题内容: 我在Python中列出了一些值,并希望使用openpyxl将它们写入Excel电子表格。 到目前为止,我已经尝试过,其中lstStat是需要写入Excel文件的整数列表: 我收到TypeError:代码段的最后一行无法调用’NoneType’对象。 您能帮我怎样将数据写入Excel文件吗? 干杯托马斯 问题答案: 要将值分配给单元格,请使用: 您还需要修复循环。注意,现在,对于其中的

  • 我有一个列表,其中包含以下元素: 和另一个对象,比如: 我有Element1的列表,并希望从Element1创建Elements2: 我正在寻找以更简单的方式执行此操作,也许使用 stream()。实现这一目标的最干净方法是什么?