【问题标题】:Perl - Spreadsheet::XLSX refer to a specific sheet in the workbookPerl - Spreadsheet::XLSX 引用工作簿中的特定工作表
【发布时间】:2012-05-24 02:32:43
【问题描述】:

还在 Perl 中学习走路(爬行?)。

我有 Perl 代码,我基本上是在尝试遍历数组字符串并在我的工作簿中找到这些工作表(现在,我 100% 确定会有一个工作簿中提供的名称的工作表)。 $worksheet 变量似乎根据

分配给工作表就好了
print $worksheet->(Name);

测试线。但是,下一行

my $cell = $worksheet->get_cell(1,1);

似乎没有设置单元格,因为以下行不打印单元格值(我知道这是为这种情况设置的)。我知道这一点,因为如果我在

中注释掉“if ($cell)”
my $value = $cell->value() if ($cell);

我得到错误:

Can't call method "value" on an undefined value at script.pl line 14

完整代码在这里:

use strict;
use warnings;
use Spreadsheet::XLSX;

my $excel = Spreadsheet::XLSX -> new ('C:\Scott.xlsm',);
my @sheets = qw(Fund_Data GL_Data);

foreach my $sheet (@sheets) {
    my $worksheet = $excel->Worksheet($sheet);
    print $worksheet->{Name}, "\n"; #just a test to make it is being set to worksheet
    my $cell = $worksheet->get_cell(1,1);
    my $value = $cell->value() if ($cell);
    print $value, "\n" if ($value);
}

我的结果很简单:

Fund_Data
GL_Data

他们应该在什么时候

Fund_Data
you '--> (Range("A1").Value in Sheet("Fund_Data"))
GL_Data
me '--> (Range("A1").Value in Sheet("GL_Data"))

另外,我构建上面代码的基础是下面的代码,它已经过尝试和测试。上面代码的主要区别是,我不是循环遍历每个工作表,而是尝试根据数组值分配我想要的工作表。

use strict;
use warnings;
use Spreadsheet::XLSX;

my $excel = Spreadsheet::XLSX -> new ('P:\VBA\Help\Book3.xlsx',);

foreach my $sheet (@{$excel -> {Worksheet}}) {
    printf("Sheet:  %s\n", $sheet->{Name});
    my $cell = $sheet->get_cell(2,1);
    my $value = $cell->value();
    printf("Cell value is: $value");
}

【问题讨论】:

  • 在初始化 $cell 之后执行 use Data::Dumper;print Dumper($cell) . "\n";。打印出来的是什么?
  • @JackManey -> 这样正式告诉我单元格没有设置好,但我的问题是为什么不呢?以及如何设置?
  • 好吧,试着转出$worksheet,看看它有什么单元格。
  • 天才!解决了。我转储了 $worksheet,发现单元格引用是从零开始的,所以引用单元格 A1 需要是 Cell(0,0) 而不是 Cell(1,1)!我将在下面更新回答我自己的问题。希望我可以根据您的建议给您解决问题的分数

标签: perl


【解决方案1】:

根据上述@JackManey 的 cmets,我在 $Worksheet 上使用 Data::Dumper 并得到以下结果(部分结果):

$VAR1 = bless( {
                 'DefColWidth' => '8.43
                 'MinCol' => 0,
                 'MaxRow' => 25,
                 'MinRow' => 0,
                 'path' => 'worksheets/
                 'MaxCol' => 0,
                 'Name' => 'Fund_Data',

'MinCol' => 0, 'MinRow' => 0,告诉我我的单元格引用是从零开始的。当我改变了

my $cell = $worksheet->get_cell(1,1);

my $cell = $worksheet->get_cell(0,0);

我得到了我想要的结果!

我不仅回答了我的问题,而且还学习了一个很棒的内置 PERL 函数!

【讨论】:

  • 不客气。随意接受这个答案(通过点击upvote/downvote箭头下方的复选标记的轮廓)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
  • 2018-01-25
  • 2013-08-16
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多