/ / ¿Por qué Perl's Win32 :: OLE se queja sobre "Índice no válido" para una hoja de cálculo de Excel? - ventanas, perl, excel

¿Por qué se queja Win32 :: OLE de Perl sobre un "índice no válido" para una hoja de cálculo de Excel? - ventanas, perl, excel

Código

# 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 $worksheetn";
my $Sheet = $Book->Worksheets($worksheet);

dónde $worksheet es un número entero obtenido como un valor de un hash.

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

¿Alguna sugerencia de lo que podría estar haciendo mal?

Respuestas

2 para la respuesta № 1

Sí, $worksheet es probablemente 0. Dado que el idioma de la interfaz de las aplicaciones de Microsoft es VB, el primer índice Worksheets--como en muchas colecciones de MS - es 1.

Así que puedes poner a prueba tu rango de cordura.

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

La idea de Jmz probablemente no sea una mala manera de superar el problema.

use Win32::OLE qw<in>;

my @sheets = in $book->worksheets;
my $first_sheet = $sheets[0]; # or shift @sheets.

Reduciendo así la disonancia cognitiva de VB-ish a Perl.


1 para la respuesta № 2

Determine qué hojas están disponibles antes de acceder a ellas:

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