【问题标题】:Is it Possible to change Worksheet names when useing ParseExcel?使用 ParseExcel 时是否可以更改工作表名称?
【发布时间】:2012-09-20 14:48:53
【问题描述】:

使用Spreadsheet::ParseExcel(作为模板)编写了一个 Perl 脚本来解析现有的 Excel 工作簿,并在从我们的数据库中添加更新数据的同时创建新文件。

有没有办法在运行 SaveAs 函数之前更新各个工作表的名称?我想将它们重命名为客户编号,而不是默认的 Sheet1、Sheet2 等。我确实阅读了 PerlDoc,确实看到有一个 get_name() 选项,但没有什么可以更改和重新保存的。

任何帮助都会很棒。

【问题讨论】:

  • 您是在谈论使用Spreadsheet::WriteExcel 创建一个新工作簿吗?
  • 否,仅使用现有工作簿中的数据,然后对某些单元格进行更改,并保存为不同的文件。在这种特殊情况下,我没有创建任何新的工作表,只是编辑现有的。由于主文件是一个模板,我想通过与每个更新的工作表上的新数据有关的客户编号来保存使用的工作表(其中有 30 个)。到目前为止,我只使用 Spreadsheet::ParseExcel 就能完成所有这些工作。
  • 我已经调整了答案。

标签: perl perl-module


【解决方案1】:

如果您使用SpreadSheet::WriteExcel,您可以将工作表的名称指定为方法add_worksheet 的第一个参数。 doc 是这么说的:

$worksheet1 = $workbook->add_worksheet();           # Sheet1
$worksheet2 = $workbook->add_worksheet('Foglio2');  # Foglio2
$worksheet3 = $workbook->add_worksheet('Data');     # Data
$worksheet4 = $workbook->add_worksheet();           # Sheet4

所以你想要做的可能是这样的:

while (my $res = $dbh->fetchrow_hashref) {
  my $worksheet = $workbook->add_worksheet($res->{'customerName'});
  # do stuff with that sheet
}

更新: 由于您只使用 Spreadsheet::ParseExcel 这是另一个想法。名称没有 setter 方法,因此让我们深入研究一下以找到解决方法。

code of Spreadsheet::ParseExcel::Worksheet 向我们展示了工作簿对象的名称是如何存储的:

###############################################################################
#
# get_name()
#
# Returns the name of the worksheet.
#
sub get_name {

    my $self = shift;

    return $self->{Name};
}

您可以直接通过工作表对象访问键 Name

$worksheet->{'Name'} = $res->{'customerName'};

免责声明:您绝不应该干预对象的内部值,尤其是在您无法控制其来源的情况下。内部结构可能会在未来的版本中发生变化,从而破坏您的代码!

【讨论】:

  • 当然你也可以将你自己的setter方法monkeypatch到其中,但这仍然取决于名称的存储位置不会改变。
猜你喜欢
  • 2014-03-23
  • 2016-08-28
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 2019-09-27
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
相关资源
最近更新 更多