Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Größere Anzahl von Exceldateien auswerten (https://www.delphipraxis.net/204898-groessere-anzahl-von-exceldateien-auswerten.html)

zeras 12. Jul 2020 11:54

Größere Anzahl von Exceldateien auswerten
 
Ich habe ein Programm, welches alle Exceldateien (gleicher Aufbau) eines Pfades einliest und dann Werte zwischenspeichert.
Derzeit sind das ca. 8000 Dateien und es dauert einige Stunden, bis das Programm durch ist.

Hier die Code Schnipsel
Delphi-Quellcode:
if OpenXlsWorkBook(fName, WSName, WBk, WS) then begin
 
....
  KalkData.Kunde := WS.Cells.Item[arZellBezüge[Kunde, 1], arZellBezüge[Kunde, 2]].Value;
 
....
 
   if WBk <> Nil then begin
    SaveChanges := Save;
    WBk.Close(SaveChanges, EmptyParam, EmptyParam, lcidXls);
    WBk := NIL;
  end;
Sieht hier jemand Optimierungsmöglichkeiten?

hstreicher 12. Jul 2020 13:02

AW: Größere Anzahl von Exceldateien auswerten
 
schreiben und lesen in Excel über Delphi ist ziemlich langsam ,
ich würde, wenn möglich, die Excel Datei als CSV abspeichern
und die CSV verarbeiten

mfg Hannes

TiGü 12. Jul 2020 13:14

AW: Größere Anzahl von Exceldateien auswerten
 
Eine richtige Datenbank zu verwenden scheitert an den Umständen/Kundenvorgaben?

zeras 12. Jul 2020 13:38

AW: Größere Anzahl von Exceldateien auswerten
 
Zitat:

Zitat von hstreicher (Beitrag 1469396)
schreiben und lesen in Excel über Delphi ist ziemlich langsam, ich würde, wenn möglich, die Excel Datei als CSV abspeichern und die CSV verarbeiten.

mfg Hannes

Die Dateien enthalten für andere Nutzer noch eingebettete Infos. Daher kann ich diese nicht in CSV speichern.


Zitat:

Zitat von TiGü (Beitrag 1469398)
Eine richtige Datenbank zu verwenden scheitert an den Umständen/Kundenvorgaben?

Das hatte ich schon einmal gefragt, ob man das nicht ändern kann. Aber da hängen wahrscheinlich noch so viele alte Zöpfe (oder Köpfe) dran. Für das Nachfolgesystem hat man dann eine Datenbank erstellen lassen.

Vielleicht merke ich mir intern (in einer DB) das Datum der jeweiligen Exceltabelle. Wenn sich dieses nicht geändert hat, dann brauche ich die Daten ja nicht erneut auswerten und ich kann mir das Laden einer Exceltabelle sparen.

Bernhard Geyer 12. Jul 2020 14:09

AW: Größere Anzahl von Exceldateien auswerten
 
Was genau ist bei dir langsam?
Das Speichern oder das Ändern der Werte in der Excel-Datei?
Wenn du viele Werte (in einem Excelbereich) änderst, dann ist evtl. das Arbeiten mit VariantArrays schneller

Alternativ gibts ein paar € aus und machst alles native in Delphi: https://www.tmssoftware.com/site/flexcel.asp

zeras 12. Jul 2020 15:39

AW: Größere Anzahl von Exceldateien auswerten
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1469405)
Was genau ist bei dir langsam?
Das Speichern oder das Ändern der Werte in der Excel-Datei?

Ich lese nur Daten aus den Exceltabellen aus. Immer an gleichen Stellen, immer die gleiche Anzahl und immer dasselbe Tabellenblatt. Nur, dass es ca. 8000 Exceldateien sind. Und es werden täglich einige mehr.

Zitat:

Zitat von Bernhard Geyer (Beitrag 1469405)
Wenn du viele Werte (in einem Excelbereich) änderst, dann ist evtl. das Arbeiten mit VariantArrays schneller

Das jeweilige Tabellenblatt hat benutzt 9 Spalten und 71 Zeilen. Könnte ich da das Array komplett einlesen und mir dann die entsprechenden Werte auslesen?
Derzeit kopiere ich jede Zelle, wie oben beschrieben. Das sind aber nur 13 Werte.

Zitat:

Zitat von Bernhard Geyer (Beitrag 1469405)
Alternativ gibts ein paar € aus und machst alles native in Delphi: https://www.tmssoftware.com/site/flexcel.asp

Das flexcel habe ich sogar. Meinst du, dass es dann schneller geht? Das wäre vielleicht ein weiterer Ansatz.

stifflersmom 12. Jul 2020 15:43

AW: Größere Anzahl von Exceldateien auswerten
 
Aber Du wirst doch nicht jeden Tag alle Dateien einlesen müssen, oder?
Also reicht es doch bestimmt aus, den letzten Zeitpunkt der Auswertung zu speichern und beim nächsten Durchgang nur die dateien zu verarbeuten, die eben nach diesem gemerkten Zeitpunkt erstellt/geändert worden sind.

zeras 12. Jul 2020 15:51

AW: Größere Anzahl von Exceldateien auswerten
 
Zitat:

Zitat von stifflersmom (Beitrag 1469410)
Aber Du wirst doch nicht jeden Tag alle Dateien einlesen müssen, oder?
Also reicht es doch bestimmt aus, den letzten Zeitpunkt der Auswertung zu speichern und beim nächsten Durchgang nur die dateien zu verarbeuten, die eben nach diesem gemerkten Zeitpunkt erstellt/geändert worden sind.

Ja, so in der Art fiel mir das vorhin auch ein.
Ich hatte erst einmal das Programm geschrieben, damit ich überhaupt an die Daten komme und nun habe ich bemerkt, dass es "ewig" dauert.

Wie Uwe oben beschrieben hat, kann ich ja auchmal flexcel versuchen. Aber das Merken der das Dateidatums wird wohl die schnellste Lösung sein.

stifflersmom 12. Jul 2020 16:05

AW: Größere Anzahl von Exceldateien auswerten
 
Zitat:

Zitat von zeras (Beitrag 1469411)
Wie Uwe oben beschrieben hat, kann ich ja auchmal flexcel versuchen. Aber das Merken der das Dateidatums wird wohl die schnellste Lösung sein.

Und der am wenigsten Fehlerrächtige, da Deine eigentliche Auswertungsroutine ja schon existiert und nicht an eine andere Schnittstelle wie Flexcel angepasst werden muss.

Meino 12. Jul 2020 16:50

AW: Größere Anzahl von Exceldateien auswerten
 
Flexcel ist um ein Vielfaches schneller als der Zugriff über OLE, besonders beim Schreiben. Man muss allerdings den Code umschreiben.

Wenn es nur ums Einlesen geht sollte das aber nicht aufwendig sein.
Einfach mal probieren. Der Code zum Einlesen und zum Verarbeiten ist getrennt?

scrat1979 12. Jul 2020 17:13

AW: Größere Anzahl von Exceldateien auswerten
 
Zitat:

Zitat von stifflersmom (Beitrag 1469412)
Zitat:

Zitat von zeras (Beitrag 1469411)
Wie Uwe oben beschrieben hat, kann ich ja auchmal flexcel versuchen. Aber das Merken der das Dateidatums wird wohl die schnellste Lösung sein.

Und der am wenigsten Fehlerrächtige, da Deine eigentliche Auswertungsroutine ja schon existiert und nicht an eine andere Schnittstelle wie Flexcel angepasst werden muss.

Ich „merke“ mir - ein einem ähnlichen Kontext - Dateiname und die MD5-Checksumme. Hat sich bisher bestens bewährt. Stimmen Dateiname und MD5 überein dann unterstelle ich, dass die Datei identisch ist und überspringe sie. In meinem Fall geht es um eine Liste mit vorhandenen Backups.

zeras 12. Jul 2020 17:43

AW: Größere Anzahl von Exceldateien auswerten
 
Zitat:

Zitat von scrat1979 (Beitrag 1469415)

Ich „merke“ mir - ein einem ähnlichen Kontext - Dateiname und die MD5-Checksumme. Hat sich bisher bestens bewährt. Stimmen Dateiname und MD5 überein dann unterstelle ich, dass die Datei identisch ist und überspringe sie. In meinem Fall geht es um eine Liste mit vorhandenen Backups.

Die MD5-Checksumme ist neben dem Dateidatum auch eine Idee.
Gibt es in Delphi Funktionen, die direkt die MD5 Checksumme ausspucken oder muss man sich das selbst zusammenbauen?

Chemiker 12. Jul 2020 17:50

AW: Größere Anzahl von Exceldateien auswerten
 
Hallo,

wird für jede Datei eine neue Excel-Instanz geöffnet? Wenn Du die Dateien einlesen willst, haben zu gleicher Zeit noch andere User Zugriff auf die Dateien? Wenn die Daten nur gelesen werden braucht man das Workbook nicht abspeichern, es muss nur geschlossen werden.

Bis bald Chemiker

zeras 12. Jul 2020 18:03

AW: Größere Anzahl von Exceldateien auswerten
 
Zitat:

Zitat von Chemiker (Beitrag 1469419)
Hallo,

wird für jede Datei eine neue Excel-Instanz geöffnet? Wenn Du die Dateien einlesen willst, haben zu gleicher Zeit noch andere User Zugriff auf die Dateien? Wenn die Daten nur gelesen werden braucht man das Workbook nicht abspeichern, es muss nur geschlossen werden.

Bis bald Chemiker

Nein, ich habe eine Excel Instanz vorher geöffnet, die dann für alle Tabellen genutzt wird.
Ich habe nochmal nachgeschaut. Das Workbook wird in diesem Falle nicht gespeichert, sondern nur geschlossen.

jobo 12. Jul 2020 18:10

AW: Größere Anzahl von Exceldateien auswerten
 
Also wenn es komplett formalisiert ist, könnte ich mir vorstellen es nur über eine Excel oder Access Master Datei und Makro / Links zu machen und bloß das Ergebnis mit Delphi abzugreifen.
Eine lokale Kopie (mit MD5 Hash) oder durch einen Windows Dienst ist vielleicht auch hilfreich.

Wenn Du eine funktionierende Variante hast, dann kannst Du das ja wunderbar gegeneinander laufen lassen und durchtesten.

Delphi.Narium 12. Jul 2020 18:24

AW: Größere Anzahl von Exceldateien auswerten
 
Zitat:

Zitat von zeras (Beitrag 1469417)
Zitat:

Zitat von scrat1979 (Beitrag 1469415)

Ich „merke“ mir - ein einem ähnlichen Kontext - Dateiname und die MD5-Checksumme. Hat sich bisher bestens bewährt. Stimmen Dateiname und MD5 überein dann unterstelle ich, dass die Datei identisch ist und überspringe sie. In meinem Fall geht es um eine Liste mit vorhandenen Backups.

Die MD5-Checksumme ist neben dem Dateidatum auch eine Idee.
Gibt es in Delphi Funktionen, die direkt die MD5 Checksumme ausspucken oder muss man sich das selbst zusammenbauen?

MD5 ist auch dann noch eindeutig, wenn Dateiname und / oder Datum geändert wurden.

MD5 und Delphi? Bei Google suchendelphi source md5
Du hast die Qual der Wahl. Die Indys haben das auch dabei und sollen schon seit 'ner Weile bei Delphi immer mit dabei sein ;-)

18 Zeilen zur Umsetzung in einer eigenen Funktion sind z. B. hier zu finden.

Benmik 12. Jul 2020 21:13

AW: Größere Anzahl von Exceldateien auswerten
 
Der erste Gedanke, der einem kommt, ist, ob man die Daten nicht unter Umgehung von Excel extrahieren könnte. Insbesondere, weil es immer die gleichen Zellen sind. Spätestestens seit 2007 verwendet Excel das Office Open XML-Format. Wenn man das direkt auslesen könnte, müsste das die Geschwindigkeit enorm steigern. Tatsächlich gibt es zumindest für .NET EPPlus und für Delphi findet sich bei Embarcadero Direct Office 4.0. Es scheint noch mehr Bibliotheken zu geben. Vielleicht wäre das ein Ansatz?

TurboMagic 13. Jul 2020 21:19

AW: Größere Anzahl von Exceldateien auswerten
 
Ob MD5 direkt von Delphi's RTL unterstützt ist weiß ich nicht, aber
SHA1/SHA2 (SHA224, SHA256, SHA384 und SHA512) sind in System.Hash
standardmäßig seit ein paar Versionen dabei.

Grüße
TurboMagic

zeras 19. Jul 2020 14:20

AW: Größere Anzahl von Exceldateien auswerten
 
Zitat:

Zitat von scrat1979 (Beitrag 1469415)

Ich „merke“ mir - ein einem ähnlichen Kontext - Dateiname und die MD5-Checksumme. Hat sich bisher bestens bewährt. Stimmen Dateiname und MD5 überein dann unterstelle ich, dass die Datei identisch ist und überspringe sie. In meinem Fall geht es um eine Liste mit vorhandenen Backups.

Nun ist wieder etwas Zeit für mein Projekt. Ich nutze nun die MD5 und das klappt ganz gut.
Des Weiteren hatte ich noch beim Öffnen der Exceltabelle ReadOnly auf True gesetzt. Das sollte nun für eine Optimierung reichen.

Danke nochmals für alle Tipps.

himitsu 19. Jul 2020 14:29

AW: Größere Anzahl von Exceldateien auswerten
 
Delphi-Referenz durchsuchenSystem.Hash (das sind im Prinzip die WinAPIs, welche Delphi jahrelang vergessen hatte im Delphi bereitzustellen und die Delphi nun selber immer öffters benötigt)
Delphi-Referenz durchsuchenWinapi.Security.Cryptography
...


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz