簡體   English   中英

Perl從數千個Excel文件中提取多個值,並將每個數據集寫入txt文件

[英]Perl extracting multiple values out of thousands of Excel Files and write each dataset into txt file

我在帶有Strawberry Perl的 Windows 7上使用Perl 5.24.3 我目前正在編寫一個腳本,該腳本在同一文件夾中的數千個Excel文件中搜索某些值。 這些值是從每個Excel文件中提取/讀取的,並保存在其相應的變量中。 之后,我想將變量值寫入.txt文件。

我的問題是,Perl腳本在Excel文件400ish時崩潰。 使用use strict時,我無法運行它,但是如果不使用它,它將運行。 不幸的是直到最后。 如何優化腳本,以免崩潰? 我如何更改代碼,以便可以使用use strict運行腳本?

使用診斷將返回以下內容:

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" . $zeile) + 2 轉換為數字的"G..."0 (並產生警告),因此這有效地調用$sheet->Range(2)

你可能想要

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

代替。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM