2012-05-23 55 views
3

仍然學習在Perl中漫步(抓取?)。Perl - Spreadsheet :: XLSX指代工作簿中的特定工作表

我有Perl代碼,我基本上試圖循環訪問數組字符串,並在我的工作簿中找到這些工作表(現在,我100%確定會有工作簿中提供名稱的工作表)。 $工作表變量似乎被分配到工作表就好了基於

print $worksheet->(Name); 

測試線。然而,下一行

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

似乎並沒有被設置的單元格,以下線不打印單元格的值(我知道是設置此情況下)。我知道這是因爲如果我註釋掉 「如果($小區)」 中

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"); 
} 
+1

做'使用Data :: Dumper;打印Dumper($ cell)。 「\ n」;'剛剛初始化'$ cell'後。什麼打印出來? – 2012-05-23 17:52:50

+0

@JackManey - $ VAR1 = undef; –

+0

@JackManey - >這樣正式告訴我單元沒有設置,但我的問題是爲什麼不呢?以及如何設置它? –

回答

3

每@JackManey的上述評論,我使用的數據::自卸車上$工作表,並得到下面的結果(部分結果):

$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); 

我得到了我想要的結果!

我不僅獲得了我的Q回答,還學習了一個非常棒的內置PERL函數!

+0

不客氣。隨意接受此答案(通過點擊upvote/downvote箭頭下面的複選標記輪廓)。 – 2012-05-23 19:31:21

+1

謝謝@JackManey。在我被允許的兩天內會做。 –

相關問題