Schrift
[thread]7323[/thread]

ParseExcel und Datumsformat: Wie b



<< >> 5 Einträge, 1 Seite
AndreasM
 2005-10-08 15:12
#58582 #58582
User since
2005-10-08
31 Artikel
BenutzerIn
[Homepage] [default_avatar]
Guten Tag erstmal!
Ich bin neu in diesem Forum, und mit Perl beschäftige ich mich seit etwa zwei Monaten...
In unserer Firma sind wir oft gezwungen, externe Excel-Tabellen zu verarbeiten. Darin enthalten sind Adressdaten, Codierungen, Zahlen und oft auch Datumsangaben.
Unsere Programme verarbeiten aber kein Excel, sondern Textdateien mit einem beliebigen Separator. Wir müssen also die Exceltabelle öffnen und als Textfile wieder abspeichern.
Wenn man nur eine Excel-Tabelle zu verarbeiten hat geht das ja noch. Wenn man aber 50 Dateien auf einen Rutsch bekommt ist das Ganze nicht mehr lustig. Ausserdem besteht die Gefahr, das man weitere Tabellenblätter in einer Arbeitsmappe einfach übersieht.

Ich habe mir überlegt, wie sich das ganze automatisieren lässt, und weil ich von Perl viel Gutes gehört habe habe ich damit angefangen.
Ich habe für meine Kollegen ein Skript gebastelt, das alle Excel-dateien in einem Verzeichnis auslesen und jedes gefundene Tabellenblatt als Textdatei ausgibt.

Der Code findet sich hier:
--- schnipp---
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#! D:\Perl\bin

use warnings;
use strict;
use Spreadsheet::ParseExcel;

foreach my $filename (glob("*.xls")){ #&─usserste Schleife. Wird f³r jede passende (Excel)Datei durchlaufen

my $oBook = Spreadsheet::ParseExcel::Workbook->Parse("$filename"); #legt ein Objekt f³r die Exceldatei an
my($iR, $iC, $oWkS, $oWkC, $SZaehler); #Zeile Spalte, Tabellenblatt und ein Hilfszõhler werden angelegt

foreach my $oWkS (@{$oBook->{Worksheet}}) { #Schleife f³r jedes gefundene Arbeitsblatt
my $Ausgabedatei = "${filename}_${oWkS}_$oWkS->{Name}.txt"; #Name der Ausgabedatei: ExcelDatei+Arbeitsblatt.txt
open AUSGABEDATEI, (">$Ausgabedatei"); # Lege Ausgabedatei f³r Excel-Arbeitsblatt an
print "--------- SHEET:", $oWkS->{Name}, "\n";
for(my $iR = $oWkS->{MinRow}; defined $oWkS->{MaxRow} && $iR <= $oWkS->{MaxRow}; $iR++) {
my $SZaehler=0;
for(my $iC = $oWkS->{MinCol}; defined $oWkS->{MaxCol} && $iC <= $oWkS->{MaxCol}; $iC++) {
my $Umbruch="\t";
$oWkC = $oWkS->{Cells}[$iR][$iC];

print "( $iR , $iC ) =>", $oWkC->Value, "\n" if($oWkC);
if ($SZaehler < $oWkS->{MaxCol}){$Umbruch="\t";}
else {$Umbruch="\n"}
#entferne CRLF
my $Zelle;
if (defined($oWkC)){
$Zelle = $oWkC->Value;
$Zelle =~ s/(\n|\t)/ /g;
}
print AUSGABEDATEI $Zelle, "$Umbruch" if($oWkC);
print AUSGABEDATEI "$Umbruch" if not ($oWkC);
$SZaehler++;
}
}
close AUSGABEDATEI;
}
}
exit;

---schnipp---

Und es funktioniert auch sehr gut... hat nur einen kleinen Haken:
Datumsangaben werden umformatiert: steht dort ein "04.10.2002" wird eine Ausgabe "10-4-05" erzeugt.
Aus 19.12.1995 wird 12-19-95.
Das möchte ich vermeiden und die Ausgabe wie sie ist übernehmen... und als Text abspeichern.
Ich weiss nun nicht ob mein Problem eher in einer local-Einstellung zu suchen ist, oder ob ich ParseExcel mitteilen kann, das es, wenn es in einer Zelle einen Datumstyp findet, diesen mit seiner Formatierung "as it is" auslesen soll. Ich glaube Val statt Value ist da nicht mein Helfer.

MfG
AndreasM\n\n

<!--EDIT|renee|1128779633-->
renee
 2005-10-08 18:38
#58583 #58583
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Probier es mal mit Val. Da es das "Original Value" der Zelle ist...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
sesth
 2005-10-10 11:05
#58584 #58584
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Hallo Andreas,

mit ParseExcel habe ich zwar keine Erfahrung, da ich entweder direkt per OLE-Automation mit Excel arbeite oder gleich per Datenbank (DBI). Trotzdem hier ein kleines Beispiel, wie ich via OLE ein Datum in Excel schreibe. Vielleicht hilft es Dir weiter.
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
use Win32::OLE::Variant;
...
        (my $ls = $hashref->{'Last Saved'}) =~ s/^(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)$/$1 $2 $3 $4:$5:$6/;
        if ($ls ne "") {
            my $var = Variant(VT_DATE, $ls);
            $worksheet->Cells($row, $col++)->{'Value'} = $var;
        } else {
            $worksheet->Cells($row, $col++)->{'Value'} = '-';
        }

Auf Locale-Einsteillungen kannst Du dabei verzichten, da direkt mit dem internen Datumsformat gearbeitet wird.
Gruß
Thomas
renee
 2005-10-10 16:12
#58585 #58585
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@sesth: Es soll ja aus der xls-Datei auslesen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
sesth
 2005-10-10 16:23
#58586 #58586
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
@renee: Das es lesen soll ist mir klar. Ich wollte nur ein Beispiel geben, wie man einen Variant im Date-Format in Perl verarbeitet.
Gruß
Thomas
<< >> 5 Einträge, 1 Seite



View all threads created 2005-10-08 15:12.