Thread ParseExcel und Datumsformat: Wie b (4 answers)
Opened by AndreasM at 2005-10-08 15:12

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-->

View full thread ParseExcel und Datumsformat: Wie b