У меня есть файл Excel (.xlsx), подключенный к «источнику данных» с помощью файла .iqy. Я использовал Perl, чтобы открыть файл Excel и обновить данные. Изначально мой код работал. Однако мне нужно было изменить файл .iqy, с которым была связана моя электронная таблица, и это, похоже, нарушило мой сценарий Perl (несмотря на то, что в самом сценарии ничего не менялось). Теперь не получается, когда я звоню
my $LastRow = $Sheet->UsedRange->Find({What=>"*",
SearchDirection=>xlPrevious,
SearchOrder=>xlByRows})->{Row};
и вывод cmd гласит: «Нельзя использовать неопределенное значение в качестве ссылки на HASH в строке разделения shared.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();
Заранее благодарю за любые советы. Я действительно застрял на этом.