Почему Per32 Win32 :: OLE жалуется на «Неверный индекс» для листа Excel? - PullRequest
0 голосов
/ 20 октября 2010

Код

# 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 ]

2 голосов
/ 20 октября 2010

Да, $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-иша до Perl.

1 голос
/ 20 октября 2010

Определите, какие листы доступны, прежде чем получить к ним доступ:

use Win32::OLE qw(in);
my @sheets = in $Book->Worksheets;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...