Schrift
[thread]8788[/thread]

Sortieren von Exceldateien (Seite 2)

Leser: 2


<< |< 1 2 >| >> 15 Einträge, 2 Seiten
wiel
 2007-02-26 13:56
#74580 #74580
User since
2006-08-08
11 Artikel
BenutzerIn
[default_avatar]
Moinsen,

hängt ein wenig von den Randbedingungen ab, ob Du ernsthaft über einen Umstieg auf eine Datenbank nachdenken solltest. Dafür spricht meiner Ansicht auf alle Fälle die Anzahl der Datensätze. Innerhalb eine Datenbank kannst Du Deine Ursprungsdaten eben sehr einfach sortieren.
Code: (dl )
1
2
CREATE VIEW NameSortiert AS SELECT * FROM NameUnsortiert
ORDER BY Kriterium1, Kriterium2, Kriterium3, Kriterium4, Kriterium5;

ist Standard-SQL und sollte von jeder Datenbank verstanden werden. Die Ergebnistabelle kannst Du dann sehr schön mit CPAN:Spreadsheet::WriteExcel::FromDB; exportieren. Wenn Du allerdings öfter aktualisierte Daten in Excel bekommst und verarbeitest oder das Programm auch weitergibst, spricht auch einiges für eine reine Excellösung. Bloß das kann hier keiner wissen.

renee war gerade schneller, ich benutze obengenanntes Modul aber selber und der Export nach Excel ist wirklich nach dem Datenbankaufbau in einer Zeile erledigt.
gr wiel
mike42
 2007-02-26 14:43
#74581 #74581
User since
2006-04-24
6 Artikel
BenutzerIn
[default_avatar]
Hallo renee,

[quote=renee,26.02.2007, 12:41]Schau Dir mal CPAN:DBD::Excel an. Das könnte Dir evtl. weiterhelfen. Ich habe es selbst aber noch nicht ausprobiert...[/quote]

sehr interessant. Ich habe es mal ausprobiert. Das Sortieren über sieben Spalten hat mit einem Test-Excel-Sheet einwandfrei funktioniert. Das hatte allerdings nur 17 Zeilen :-)

Hier mal die Infos (gekürzt auf drei Spalten), falls es jemanden interessiert:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
use DBI;

# Mit dem Excel Sheet "verbinden" ...
$hDb = DBI->connect("DBI:Excel:file=test.xls")
or die "Cannot connect: " . $DBI::errstr;

# Tabelle 1 = Name des interessanten Excel Sheets
# A, B, C, ... = Namen der Spalten: Ergeben sich aus den Einträgen aus der ersten Excel Zeile

# Befehl ausführen
$hSt = $hDb->prepare("select * from Tabelle1 order by A, B, C")
or die "Cannot prepare: " . $hDb->errstr();
$hSt->execute();

# Schleife über die Ergebnisse
while (@row = $hSt->fetchrow_array){
print "$row[0] : $row[1] : $row[2]\n";
}

# Beenden
$hSt->finish();
$hDb->disconnect();


mike42
GoodFella
 2007-02-26 18:34
#74582 #74582
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
Das hört sich ja sehr gut an, mir fällt nur gerade auf, dass ich, um das Nutzen zu können, mir jegliche mitgespeicherten Excel-Formate zerschiesse. Hat jemand eine Idee, wie ich das am besten lösen könnte?


@wiel:
1. Kunde schickt ein Dokument + Exceldatei
2. Exceldatei wird bearbeitet (wenn ich fertig bin mit meinem Programm)
3. Exceldatei wird in Word für den Seriendruck importiert.

So läuft das ab; die Daten wechseln immer, werden nie ein zweites Mal gebraucht.\n\n

<!--EDIT|GoodFella|1172507877-->
GoodFella
 2007-02-27 11:59
#74583 #74583
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
Also, hab mal drüber geschlafen. Das könnte funktionieren, wenn ich sortiere, bevor ich das Format hinzufüge.
Vielleicht sollte ich mal das Gesamtproblem beschreiben:

Ein Kunde schickt eine oder mehrere ExcelDatei(en). Diese werden von meinem Programm per Spreadsheet::ParseExcel gelesen

(an dieser Stelle fällt mir gerade ein: weiss jemand, wie ich mit ParseExcel nur die Überschriften anstatt die Gesamtdatei auslese? Der Speicherverbrauch ist enorm..)

Nun bekommt man diese in einer TableMatrix angezeigt, hat eine Datei mehrere Tabellen, werden diese auch angezeigt.
Man kann die Überschriften einer Zeile (=einer Tabelle) untereinander verschieben, Formate einstellen und Zeilen oder Spalten ausblenden, es werden aus der Vereinigungsmenge aller Unter-Überschriften eine Hauptüberschrift erzeugt. Zweck des ganzen: z.B. steht in Tabelle 1 in Spalte 3 der Vorname, in der zweiten Tabelle steht dieser jedoch in Spalte 8. Diese kann man jetzt einander zuordnen.
Mein Code erstellt pro Datei ein Spreadsheet::ParseExcel-Objekt.

Ist man fertig, kann man sehr viele Optionen auswählen, hier mal einige davon:
- Laufende Nummer hinzufügen
- Säubern ( DDE-Fehler entfernen )
- Pivot-Tabelle erstellen
- Statistiken erstellen
- XX-Zeile hinzufügen
- Umbrüche entfernen
- Mehrfache Whitespaces(Tabs + Leerzeichen) auf ein - Leerzeichen reduzieren
- auf ungrade Zahl Anführungszeichen prüfen
- auf ungültige Kontonummern prüfen
- auf ungültige Postleitzahl prüfen (International)
- auf ungültige Postleitzahl prüfen (Deutschland, fragt nicht nach Länderspalte)
- Länderspalte in Grossbuchstaben
- Perl-Code pro Zelle ausführen

Danach wird man je nach Option nach Zusatzinfos gefragt.

Jetzt wird ein Spreadsheet::WriteExcel-Objekt erzeugt und eine Schleife arbeitet alle Spreadsheet::ParseExcel-Objekte->Tabellen->Zeilen->Zellen ab, wobei je nach Einstellung ein Format oder Zusatzinfos hinzugefügt werden.

So, jetzt möchte ich das ganze Sortieren (+nachträglich eine laufende Nummer einfügen) können, mittlerweile nach 7 Sortierkriterien nach Rücksprache mit meinen Chefs, mir fallen folgende Möglichkeiten ein:

1. Ich füge erst alle Dateien zu einer zusammen, speichere,
1a. lese diese in ein Perl-Array, sortiere per @array = sort { .. } @array;
1b. sortiere diese mit Win32::OLE, speichere (kommt mir am performantesten vor)--> http://www.buha.info/board/showthread.php?t=53486
1c. sortiere diese mit DBD::Excel, speichere
..und öffne die Datei nochmals, um die gewünschten Optionen zu applizieren

2. Ich speichere Formate + Daten in ein Perl-array, sortiere, speichere mit WriteExcel. Vorteil: Nur einmal sehr viele Datensätze in eine Datei schreiben und auch nicht nochmal auslesen. Nachteil: Ich muss Formate mitsortieren -> lahm

Was denkt ihr? Wie wäre es am besten?\n\n

<!--EDIT|GoodFella|1172570416-->
GoodFella
 2007-03-24 02:54
#74584 #74584
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
Wollte nur nochmal hinzufügen, dass ich das jetzt mit Win32::OLE gelöst habe, soll ja eh nur auf Win laufen und ist recht schnell. Das coole daran st, dass Excel die Formate mitsortiert ^^
Achja und 7-fach sortieren funktioniert, indem man 7mal nach jeder entsprechenden spalte sortiert, allerdings von der niedrigsten zur höchsten Priorität.
Danke für eure Mühe.
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2007-02-25 15:53.