2012-02-22 61 views
1

OLE我有(.xlsx)格式連接到「數據源」以文件名爲.iqy Excel文件。我用Perl來打開excel文件並刷新數據。最初,我的代碼工作。但是,我需要更改我的電子表格鏈接到的.iqy文件,並且這樣做似乎破壞了我的Perl腳本(儘管實際上並未更改腳本本身內的任何內容)。現在,當我打電話問題解析的Excel 2010 .xlsx文件的Win32 ::在Perl

my $LastRow = $Sheet->UsedRange->Find({What=>"*", 
    SearchDirection=>xlPrevious, 
    SearchOrder=>xlByRows})->{Row}; 

和CMD輸出讀取失敗:「不能用一個未定義的值作爲sharing.pl線20散列引用」我試過調試過這個,但是我對Win32 :: OLE模塊的內核知之甚少,無法知道如何在調試器中發現問題的位置或原因。我的腳本的源代碼是:

#!/usr/bin/perl 
use Win32::OLE; 
use Win32::OLE qw(in with); 
use Win32::OLE::Variant; 
use Win32::OLE::Const 'Microsoft Excel'; 

$Excel = Win32::OLE->GetActiveObject('Excel.Application') || 
     Win32::OLE->new('Excel.Application'); 
$Excel->{'Visible'} = 0;  #0 is hidden, 1 is visible 
$Excel->{DisplayAlerts}=0; #0 is hide alerts 

# Open File and Worksheet 
my $Book = $Excel->Workbooks->Open ('C:\shareP\sp.xlsx'); # open Excel file 
$Sheet = $Book->Worksheets(1); 

# Refresh Data (ActiveWorkbook.RefreshAll) 
$Book->RefreshAll(); 

# Find Last Column and Row 
my $LastRow = $Sheet->UsedRange->Find({What=>"*", 
    SearchDirection=>xlPrevious, 
    SearchOrder=>xlByRows})->{Row}; 

my $LastCol = $Sheet->UsedRange->Find({What=>"*", 
       SearchDirection=>xlPrevious, 
       SearchOrder=>xlByColumns})->{Column}; 
####### EDIT: I initially didn't post this portion because it stops 
#  before reaching it unless I make $LastCol and $LastRow constants 
my @hasher; 
my $c = "a"; 
for (my $cn=1; $cn <= $LastCol; $cn++){ 
    for (my $r=2; $r <= $LastRow; $r++){ 
# stops here with same error if I make $LastCol and $LastRow constants 
     $hasher[$r-2]{ $Sheet->Range($c.'1')->{Value} } = $Sheet->Range($c.$r)->{Value}; 
    } 
$c++; 
} 
####### end of EDIT 
# Save as Excel 
$Book->Save(); 
$Book->Close(); 
$Excel->Quit(); 

非常感謝您的任何和所有建議。我真的被困在這一個。

回答

1

我相信你的find函數現在沒有返回值。我有兩個可能的解釋。

1)也許你的新的源數據不再包含「*」字符

2)查找功能記得即LookInLookAtSearchOrder使用之間的一些屬性。爲了獲得最佳效果,您應該在查找時始終設置這3個屬性,以確保獲得所需的功能。

我adivice是嘗試執行手動在電子表格中查找,看看它是否工作。我不認爲你的錯誤在腳本的OLE部分。

+0

手動完成時,在電子表格中查找「*」。在save()和close()之前,我還有更多的代碼,它在它到達之前就停止了,因此我刪除了它。我嘗試製作「$ LastRow」和「$ LastCol」變量常量,但隨後代碼停止向下,出現相同的錯誤。 (請參閱我添加到帖子中的內容,對不起,我一開始就把它刪除了)。但是,如果我使用$ LastRow和$ LastCol作爲常量運行代碼兩次,它將在第二次運行時起作用......我所看到的唯一區別是,在第二次運行時,excel從第一次運行開始仍處於打開狀態, t接近()。 – user1226409 2012-02-22 19:38:23

+0

給出您的額外信息......我將猜測這個問題與$ sheet是空的有關。嘗試通過文本名稱而不是數字來引用工作表,看看是否有幫助 – Pynner 2012-02-23 17:47:18

1

我卷繞通過添加短暫停頓的代碼解決問題。在excel表單完成刷新之前,perl腳本正在前進。感謝您的幫助。

0

我認爲這是因爲你的其中一個電子表格是空的。 獲得總列數和行數的更好方法是:

my $Tot_Rows= $Sheet->UsedRange->Rows->{'Count'}; 

my $Tot_Cols= $Sheet->UsedRange->Columns->{'Count'};