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();
非常感謝您的任何和所有建議。我真的被困在這一個。
手動完成時,在電子表格中查找「*」。在save()和close()之前,我還有更多的代碼,它在它到達之前就停止了,因此我刪除了它。我嘗試製作「$ LastRow」和「$ LastCol」變量常量,但隨後代碼停止向下,出現相同的錯誤。 (請參閱我添加到帖子中的內容,對不起,我一開始就把它刪除了)。但是,如果我使用$ LastRow和$ LastCol作爲常量運行代碼兩次,它將在第二次運行時起作用......我所看到的唯一區別是,在第二次運行時,excel從第一次運行開始仍處於打開狀態, t接近()。 – user1226409 2012-02-22 19:38:23
給出您的額外信息......我將猜測這個問題與$ sheet是空的有關。嘗試通過文本名稱而不是數字來引用工作表,看看是否有幫助 – Pynner 2012-02-23 17:47:18