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

时间:2010-10-20 09:24:40

标签: windows perl 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

有什么建议我可能做错了吗?

2 个答案:

答案 0 :(得分:2)

是的,$worksheet可能为0.因为Microsoft的应用程序界面语言是VB,Worksheets的第一个索引 - 就像许多MS集合一样 - 是1。

所以你可以测试你的理智范围。

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.

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

答案 1 :(得分:1)

在访问之前确定哪些工作表可用:

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