Perl 从数千个 Excel 文件中提取多个值并将每个数据集写入 txt 文件
Perl extracting multiple values out of thousands of Excel Files and write each dataset into txt file
我在 Windows 7 上使用 Perl 5.24.3 和 Strawberry Perl.
我目前正在编写一个脚本,用于在同一文件夹中搜索数千个 Excel 文件以查找某些值。这些值是来自每个 Excel 文件的 extracted/read,并保存在它们相应的变量中。
之后,我想将变量值写入.txt 文件。
我的问题是 perl 脚本在 Excel 文件 400ish 处崩溃。
我不能在使用 use strict 时 运行 它,但如果我不使用它,它会 运行 。
不幸的是直到最后。如何优化我的脚本以使其不会崩溃?
我需要如何更改我的代码,以便我可以 运行 使用 use strict 的脚本?
使用诊断 returns 以下内容:
Use of uninitialized value in string eq at auswertungLieferscheine.pl line 112(#1), line 117, 122, 127, ...
代码如下:
#use strict;
#use warnings "all";
use Cwd 'abs_path';
use Win32::OLE;
#use diagnostics;
lager();
sub lager
{
my @xlsm;
my $strGebLS = "Z:\User\Projekte\Fertigung\Lieferscheintool\lieferschein_lager\bearbeitete Lieferscheine\gebuchte Lieferscheine\";
chdir $strGebLS;
opendir(DIR, $strGebLS) or die $!;
while(my $lieferschein = readdir(DIR))
{
next if ($lieferschein !~ m/2018\.xlsm$/);
push(@xlsm, $lieferschein);
}
closedir(DIR);
my $excel = Win32::OLE->new('Excel.Application', 'Quit') or die $!;
$excel->{'DisplayAlerts'} = 0;
$excel->{'Visible'} = 0;
foreach my $lsDatei(@xlsm)
{
my $absPfad = abs_path("$lsDatei") or die "Fehler: Die Datei $lsDatei wurde nicht gefunden\n";
my $arbeitsmappe = $excel->Workbooks->Open($absPfad, {
'ReadOnly' => 1,
'IgnoreReadOnlyRecommended' => 1
});
my $sheet = $arbeitsmappe->Worksheets("LieferscheinBauleitung");
# THESE VALUES ARE ALWAYS IN THE SAME CELL OR PREDEFINED IF CELLS EMPTY!
my $lagerort = "Lager";
my $lsNr = $sheet->Range("C5")->{Value};
my $status = "gebucht";
my $bv = $sheet->Range("C7")->{Value};
my $hv = $sheet->Range("G7")->{Value};
my $grund = "Kein Anforderungsgrund";
my $besteller = "Kein Besteller";
my $abholer = "Kein Abholer";
my $bezeichnung ="Keine Bezeichnung";
my $menge = "0";
my $einzelpreis = "0.0";
my $summe = "0.0";
#THESE VALUES ARE IN DIFFERENT CELLS
#BUT ALWAYS IN 1 out of 2 POSSIBLE COLUMNS!
#THAT IS WHY I AM USING A FOR LOOP HERE...
#THE IF LINES RETURN UNDECLARED WARNINGS FOR VARIABLES AND I DONT KNOW WHY! WHY?! #$sheet and $zeile are both defined, aren't they?!
for (my $zeile=4; $zeile<=25;$zeile++)
{
if($sheet->Range("G" . $zeile)->{Value} eq "Grund")
{
$grund = $sheet->Range("G" . $zeile + 2)->{Value};
}
if($sheet->Range("A" . $zeile)->{Value} eq "Anforderungsgrund")
{
$grund = $sheet->Range("C" . $zeile)->{Value};
}
if($sheet->Range("A" . $zeile)->{Value} eq "Besteller")
{
$besteller = $sheet->Range("C" . $zeile)->{Value};
}
if($sheet->Range("A" . $zeile)->{Value} eq "Abholer")
{
$abholer = $sheet->Range("C" . $zeile)->{Value};
}
if($sheet->Range("B" . $zeile)->{Value} eq "Bezeichnung")
{
$bezeichnung = $sheet->Range("B" . ($zeile + 2))->{Value};
}
if($sheet->Range("A" . $zeile)->{Value} eq "Menge")
{
$menge = $sheet->Range("A" . ($zeile + 2))->{Value};
}
if($sheet->Range("H" . $zeile)->{Value} eq "Einzelpreis")
{
$einzelpreis = $sheet->Range("H" . ($zeile + 2))->{Value};
}
if($sheet->Range("I" . $zeile)->{Value} eq "Summe")
{
$summe = $sheet->Range("I" . ($zeile + 2))->{Value};
}
}
$arbeitsmappe->Close();
$excel->Quit();
if($besteller eq "")
{
$besteller = "Kein Besteller";
}
if($abholer eq "")
{
$abholer = "Kein Abholer";
}
if($grund eq "")
{
$grund = "Kein Anforderungsgrund";
}
# WRITE VALUES IN VARIABLES INTO TXT-FILE
if(substr($lsDatei, -9, 4) eq "2018")
{
local $auswertung = "auswertungLieferscheine_2018.txt";
local $auswertungPfad = "Z:\User\Projekte\Fertigung\Lieferscheintool\lieferschein_auswertung\$auswertung";
local $data = $lagerort . "\t" . $lsNr . "\t" . $status . "\t" . $bv . "\t" . $hv . "\t" . $grund . "\t" . $besteller . "\t" . $abholer . "\t" . $bezeichnung . "\t" . $menge . "\t" . $einzelpreis . "\t" . $summe . "\n";
open(my $fh, '>>', $auswertungPfad) or die $!;
# PRINT DATASET INTO TXT FILE
print $fh $data;
close $fh;
}
}
}
警告出现在 for 循环中,它表示 if($sheet..eq "something")。 Alle 如果线路有关。有什么解决办法吗?
这是一个可能的错误:
$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};
相反。
我在 Windows 7 上使用 Perl 5.24.3 和 Strawberry Perl. 我目前正在编写一个脚本,用于在同一文件夹中搜索数千个 Excel 文件以查找某些值。这些值是来自每个 Excel 文件的 extracted/read,并保存在它们相应的变量中。 之后,我想将变量值写入.txt 文件。
我的问题是 perl 脚本在 Excel 文件 400ish 处崩溃。 我不能在使用 use strict 时 运行 它,但如果我不使用它,它会 运行 。 不幸的是直到最后。如何优化我的脚本以使其不会崩溃? 我需要如何更改我的代码,以便我可以 运行 使用 use strict 的脚本?
使用诊断 returns 以下内容:
Use of uninitialized value in string eq at auswertungLieferscheine.pl line 112(#1), line 117, 122, 127, ...
代码如下:
#use strict;
#use warnings "all";
use Cwd 'abs_path';
use Win32::OLE;
#use diagnostics;
lager();
sub lager
{
my @xlsm;
my $strGebLS = "Z:\User\Projekte\Fertigung\Lieferscheintool\lieferschein_lager\bearbeitete Lieferscheine\gebuchte Lieferscheine\";
chdir $strGebLS;
opendir(DIR, $strGebLS) or die $!;
while(my $lieferschein = readdir(DIR))
{
next if ($lieferschein !~ m/2018\.xlsm$/);
push(@xlsm, $lieferschein);
}
closedir(DIR);
my $excel = Win32::OLE->new('Excel.Application', 'Quit') or die $!;
$excel->{'DisplayAlerts'} = 0;
$excel->{'Visible'} = 0;
foreach my $lsDatei(@xlsm)
{
my $absPfad = abs_path("$lsDatei") or die "Fehler: Die Datei $lsDatei wurde nicht gefunden\n";
my $arbeitsmappe = $excel->Workbooks->Open($absPfad, {
'ReadOnly' => 1,
'IgnoreReadOnlyRecommended' => 1
});
my $sheet = $arbeitsmappe->Worksheets("LieferscheinBauleitung");
# THESE VALUES ARE ALWAYS IN THE SAME CELL OR PREDEFINED IF CELLS EMPTY!
my $lagerort = "Lager";
my $lsNr = $sheet->Range("C5")->{Value};
my $status = "gebucht";
my $bv = $sheet->Range("C7")->{Value};
my $hv = $sheet->Range("G7")->{Value};
my $grund = "Kein Anforderungsgrund";
my $besteller = "Kein Besteller";
my $abholer = "Kein Abholer";
my $bezeichnung ="Keine Bezeichnung";
my $menge = "0";
my $einzelpreis = "0.0";
my $summe = "0.0";
#THESE VALUES ARE IN DIFFERENT CELLS
#BUT ALWAYS IN 1 out of 2 POSSIBLE COLUMNS!
#THAT IS WHY I AM USING A FOR LOOP HERE...
#THE IF LINES RETURN UNDECLARED WARNINGS FOR VARIABLES AND I DONT KNOW WHY! WHY?! #$sheet and $zeile are both defined, aren't they?!
for (my $zeile=4; $zeile<=25;$zeile++)
{
if($sheet->Range("G" . $zeile)->{Value} eq "Grund")
{
$grund = $sheet->Range("G" . $zeile + 2)->{Value};
}
if($sheet->Range("A" . $zeile)->{Value} eq "Anforderungsgrund")
{
$grund = $sheet->Range("C" . $zeile)->{Value};
}
if($sheet->Range("A" . $zeile)->{Value} eq "Besteller")
{
$besteller = $sheet->Range("C" . $zeile)->{Value};
}
if($sheet->Range("A" . $zeile)->{Value} eq "Abholer")
{
$abholer = $sheet->Range("C" . $zeile)->{Value};
}
if($sheet->Range("B" . $zeile)->{Value} eq "Bezeichnung")
{
$bezeichnung = $sheet->Range("B" . ($zeile + 2))->{Value};
}
if($sheet->Range("A" . $zeile)->{Value} eq "Menge")
{
$menge = $sheet->Range("A" . ($zeile + 2))->{Value};
}
if($sheet->Range("H" . $zeile)->{Value} eq "Einzelpreis")
{
$einzelpreis = $sheet->Range("H" . ($zeile + 2))->{Value};
}
if($sheet->Range("I" . $zeile)->{Value} eq "Summe")
{
$summe = $sheet->Range("I" . ($zeile + 2))->{Value};
}
}
$arbeitsmappe->Close();
$excel->Quit();
if($besteller eq "")
{
$besteller = "Kein Besteller";
}
if($abholer eq "")
{
$abholer = "Kein Abholer";
}
if($grund eq "")
{
$grund = "Kein Anforderungsgrund";
}
# WRITE VALUES IN VARIABLES INTO TXT-FILE
if(substr($lsDatei, -9, 4) eq "2018")
{
local $auswertung = "auswertungLieferscheine_2018.txt";
local $auswertungPfad = "Z:\User\Projekte\Fertigung\Lieferscheintool\lieferschein_auswertung\$auswertung";
local $data = $lagerort . "\t" . $lsNr . "\t" . $status . "\t" . $bv . "\t" . $hv . "\t" . $grund . "\t" . $besteller . "\t" . $abholer . "\t" . $bezeichnung . "\t" . $menge . "\t" . $einzelpreis . "\t" . $summe . "\n";
open(my $fh, '>>', $auswertungPfad) or die $!;
# PRINT DATASET INTO TXT FILE
print $fh $data;
close $fh;
}
}
}
警告出现在 for 循环中,它表示 if($sheet..eq "something")。 Alle 如果线路有关。有什么解决办法吗?
这是一个可能的错误:
$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};
相反。