为什么Perl的Win32 :: OLE抱怨Excel工作表的“无效索引”?

# get already active Excel application or open new my $Excel = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit'); # open Excel file my $Book = $Excel->WorkBooks->Open($file); # select worksheet number. Default is 1 (you can also select a worksheet by name) print "worksheet $worksheet\n"; my $Sheet = $Book->Worksheets($worksheet); 

其中$worksheet是一个整数作为一个哈希值获得的整数。

 Error - Win32::OLE(0.1709) error 0x8002000b: "Invalid index" in METHOD/PROPERTYGET "Worksheets" at win32excel.pl 

任何build议,我可能做错了?

是的, $worksheet可能是0.因为微软的应用程序界面语言是VB,所以Worksheets的第一个索引(如许多MScollections)是1。

所以你可以testing你的理智范围。

 if ( $worksheet > 0 and $worksheet <= $xl->Worksheets->{Count} ) { ... } 

Jmz的想法可能不是一个超越这个问题的不好的方法。

 use Win32::OLE qw<in>; my @sheets = in $book->worksheets; my $first_sheet = $sheets[0]; # or shift @sheets. 

从而减less从VB-ish到Perl的认知失调。

在访问之前确定哪些表是可用的:

 use Win32::OLE qw(in); my @sheets = in $Book->Worksheets;