Perl从数千个Excel文件中提取多个值,并将每个数据集写入txt文件

Perl从数千个Excel文件中提取多个值,并将每个数据集写入txt文件,perl,win32ole,Perl,Win32ole,我在Windows7上使用Perl5.24.3和草莓Perl。 我目前正在编写一个脚本,在同一文件夹中搜索数千个Excel文件中的某些值。这些值从每个Excel文件中提取/读取,并保存在相应的变量中。 之后,我想将变量值写入.txt文件 我的问题是perl脚本在Excel文件400ish中崩溃。 当使用使用strict时,我无法运行它,但如果我不使用它,它将运行。 不幸的是,直到最后。如何优化脚本,使其不会崩溃? 我需要如何更改代码,以便使用use strict运行脚本 使用诊断返回以下内容:

我在Windows7上使用Perl5.24.3草莓Perl。 我目前正在编写一个脚本,在同一文件夹中搜索数千个Excel文件中的某些值。这些值从每个Excel文件中提取/读取,并保存在相应的变量中。 之后,我想将变量值写入.txt文件

我的问题是perl脚本在Excel文件400ish中崩溃。 当使用使用strict时,我无法运行它,但如果我不使用它,它将运行。 不幸的是,直到最后。如何优化脚本,使其不会崩溃? 我需要如何更改代码,以便使用use strict运行脚本

使用诊断返回以下内容:

Use of uninitialized value in string eq at auswertungLieferscheine.pl line 112(#1), line 117, 122, 127, ...
代码如下:

#严格使用;
#使用警告“全部”;
使用Cwd“abs_路径”;
使用Win32::OLE;
#使用诊断;
啤酒();
亚啤酒
{
我的@xlsm;
my$strgels=“Z:\\User\\Projekte\\Fertigung\\Lieferscheintool\\lieferschein\u lager\\bearbeitete Lieferscheine\\gebuchte Lieferscheine\\”;
chdir$strGebLS;
opendir(DIR,$strgels)或die$!;
while(my$lieferschein=readdir(DIR))
{   
下一个if($lieferschein!~m/2018\.xlsm$/);
推送(@xlsm,$lieferschein);
}
closedir(DIR);
my$excel=Win32::OLE->new('excel.Application','Quit')或die$!;
$excel->{'DisplayAlerts'}=0;
$excel->{'Visible'}=0;
foreach my$lsDatei(@xlsm)
{   
my$absPfad=abs_path($lsDatei)或die“Fehler:die Datei$lsDatei wurde nicht gefunden\n”;
my$arbeitsmappe=$excel->工作簿->打开($absPfad{
“只读”=>1,
“IgnoreReadOnlyRecommended”=>1
});
我的$sheet=$arbeitsmappe->工作表(“LieferscheinBauleitung”);
#这些值始终位于同一单元格中,如果单元格为空,则为预定义值!
my$lagerort=“Lager”;
my$lsNr=$sheet->Range(“C5”)->{Value};
我的$status=“gebucht”;
my$bv=$sheet->Range(“C7”)->{Value};
my$hv=$sheet->Range(“G7”)->{Value};
my$grund=“Kein Anforderungsgrund”;
my$besteller=“Kein besteller”;
我的$abholer=“Kein abholer”;
my$Bezeichung=“Keine Bezeichung”;
我的$menge=“0”;
my$einzelpreis=“0.0”;
我的$summe=“0.0”;
#这些值位于不同的单元格中
#但总是在2列中的1列!
#这就是为什么我在这里使用FOR循环。。。
#IF行为变量返回未声明的警告,我不知道为什么!为什么?#$sheet和$zeile都已定义,不是吗?!
对于(my$zeile=4;$zeileRange(“G”..$zeile)->{Value}eq“Grund”)
{
$grund=$sheet->Range(“G”。$zeile+2)->{Value};
}
如果($sheet->Range(“A”。$zeile)->{Value}eq“Anforderungsgrund”)
{
$grund=$sheet->Range(“C”。$zeile)->{Value};
}
如果($sheet->Range(“A”。$zeile)->{Value}eq“Besteller”)
{
$besteller=$sheet->Range(“C”。$zeile)->{Value};
}
如果($sheet->Range(“A”。$zeile)->{Value}eq“Abholer”)
{
$abholer=$sheet->Range(“C”。$zeile)->{Value};
}   
如果($sheet->Range(“B”。$zeile)->{Value}eq“bezeichung”)
{
$bezeichnung=$sheet->Range(“B”。($zeile+2))->{Value};
}
如果($sheet->Range(“A”。$zeile)->{Value}eq“Menge”)
{
$menge=$sheet->Range(“A”。($zeile+2))->{Value};
}
如果($sheet->Range(“H”。$zeile)->{Value}eq“Einzelpreis”)
{
$einzelpreis=$sheet->Range(“H”。($zeile+2))->{Value};
}
如果($sheet->Range(“I”。$zeile)->{Value}eq“Summe”)
{
$summe=$sheet->Range(“I”。($zeile+2))->{Value};
}       
}   
$arbeitsmappe->Close();
$excel->Quit();
如果($besteller eq“”)
{
$besteller=“Kein besteller”;
}
如果($abholer eq“”)
{
$abholer=“Kein abholer”;
}
如果($grund eq“”)
{
$grund=“Kein Anforderungsgrund”;
}
#将变量中的值写入TXT文件
if(substr($lsDatei,-9,4)等式“2018”)
{       
本地$auswertung=“auswertungLieferscheine_2018.txt”;
本地$auswertungPfad=“Z:\\User\\Projekte\\Fertigung\\Lieferscheintool\\lieferschein\u auswertung\\$auswertung”;
本地$data=$lagerort.\t.$lsNr.\t.$status.\t.$bv.\t.$hv.\t.$grund.\t.$besteller.\t.$abholer.\t.$BEZECHNUNG.\t.$menge.\t.$einzelpreis.\t.$summe.\n;
打开(我的$fh,“>>”,$auswertungPfad)或死亡$!;
#将数据集打印到TXT文件中
打印$fh$数据;
收盘价$fh;
}
}   
}
警告出现在for循环中,其中表示if($sheet….eq“something”)。如果涉及到行,则所有行。有什么解决方案吗?

这里有一个可能的错误:

$grund = $sheet->Range("G" . $zeile + 2)->{Value};
毫无意义。
+
运算符具有相同的优先级(并且是左关联的),因此
“G”$zeile+2
解析为
(“G”。$zeile)+2
<代码>“G…”转换为一个数字是
0
(并产生一个警告),因此这实际上调用了
$sheet->Range(2)

你可能想要

$grund = $sheet->Range("G" . ($zeile + 2))->{Value};
相反。

这里有一个可能的错误:

$grund = $sheet->Range("G" . $zeile + 2)->{Value};
毫无意义。
+
运算符具有相同的优先级(并且是左关联的),因此
“G”$zeile+2
解析为
(“G”。$zeile)+2
<代码>“G..”转换为数字是
0
(并产生警告),因此