Excel-Datei einlesen - mit Debugger geht, ohne hängt das Programm

Einbindung von Office-Komponenten wie Word, Excel usw.

Moderator: Moderatoren

Antworten
georg
Foren-Administrator
Foren-Administrator
Beiträge: 2200
Registriert: Fr, 08. Feb 2008 21:29

Excel-Datei einlesen - mit Debugger geht, ohne hängt das Programm

Beitrag von georg » Mo, 26. Feb 2018 20:10

Hallo,


ich habe da einen sehr seltsamen Effekt:

Code: Alles auswählen

	nCurRow := 2
	lDoShift := .F.
	xValue := oSheet:Cells(nCurRow, 1):Value
	WHILE xValue <> NIL .AND. nCurRow <= nMaxRows
			oProgressDia:NewLine("Zeile " + LTrim(Str(nCurRow)) + " von " + LTrim(Str(nMaxRows)))
		WriteLineIntegra(oSheet, nCurRow, lDoShift)
		nCurRow ++
		xValue := oSheet:Cells(nCurRow, 1):value
	END
oProgressDia ist eine Klasse, mit der ich Fortschrittsinformationen in einer XbpListbox() ausgeben kann.

Lasse ich das Programm im Debugger laufen, wird die Datei komplett gelesen und verarbeitet.

Lasse ich das Programm ohne Debugger laufen, hängt das Programm bei der 28. Zeilen und reagiert nicht mehr.

Die Excel-Datei wird durch einen Export aus einem DWH erzeugt und lässt sich in MS Office 2010 ohne Probleme oder Fehlerhinweise laden.

Nun brauche ich eine gute Idee ...
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11421
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Excel-Datei einlesen - mit Debugger geht, ohne hängt das Programm

Beitrag von AUGE_OHR » Mo, 26. Feb 2018 20:52

ich hatte auch mal die Situation das es nur mit Debugger lief
https://xbaseforum.de/viewtopic.php?f=32&t=8612&p=97058

Frage : Xbase++ v1.9x oder v2.x ?

liest du die Excel Datei via ActiveX ?

p.s. eine XbpListbox() würde ich auf o:hide() schalten wenn ich mehr o:AddItem() habe als ich anzeigen kann (ohne Scrollbar).
gruss by OHR
Jimmy

georg
Foren-Administrator
Foren-Administrator
Beiträge: 2200
Registriert: Fr, 08. Feb 2008 21:29

Re: Excel-Datei einlesen - mit Debugger geht, ohne hängt das Programm

Beitrag von georg » Mo, 26. Feb 2018 21:05

Hallo, Jimmy -


also, Xbase++ 2.0 (Version 886). Die Excel-Datei wird via Office-Automation geöffnet, also CreateObject("Excel.Application").

Im Gegensatz zu Deinem damaligen Problem lässt sich das Programm starten und bedienen. Nur beim Einlesen der Daten aus der Excel-Datei hängt es sich ohne Debugger auf.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.

Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1541
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: Excel-Datei einlesen - mit Debugger geht, ohne hängt das Programm

Beitrag von Werner_Bayern » Mo, 26. Feb 2018 22:01

Hört sich nach einem notwendigen sleep(1) an, wenns nicht ursächlich an dieser Excel-Datei liegt?
es grüßt euch

Werner

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11421
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Excel-Datei einlesen - mit Debugger geht, ohne hängt das Programm

Beitrag von AUGE_OHR » Mo, 26. Feb 2018 22:19

was ist wenn du den Progressbar weg lässt :?:

überhaupt was für ein Progressbar ist es :?:
wenn es der "grüne" Progressbar von Alaska oder DXE_Progressbar sein sollten : die laufen in einen eigenen GUI Thread :!:

---

Frage : warum nimmt du eine Schleife um das Excel Sheet zu "lesen" :?:

wenn du den Berech (Range) markierst (SELECT) kannst du doch alles in ein Array schaufeln mit

Code: Alles auswählen

   aExcel := oSheet:range( "A1:"+cEnde+LTRIM(STR(numRows)) ):value
gruss by OHR
Jimmy

georg
Foren-Administrator
Foren-Administrator
Beiträge: 2200
Registriert: Fr, 08. Feb 2008 21:29

Re: Excel-Datei einlesen - mit Debugger geht, ohne hängt das Programm

Beitrag von georg » Di, 27. Feb 2018 7:58

Guten Morgen -


die Reaktionen auf solche Fragen sind immer wieder interessant. So habe ich geschrieben, dass die Fortschrittsanzeige eine XbpListBox() ist (also kein XbpprogressBar()). Die im Code gezeigte Information habe ich eingefügt, um festzustellen, an welcher Stelle es hakt, die war vorher dort nicht drin, aber der Hänger kam trotzdem.

Die Funktion WriteLineIntegra() übernimmt die Daten aus einer Zeile, ändert aber auch (abhängig von bestimmten Faktoren) Werte in der Excel-Datei. Dabei scheint es - sporadisch und an verschiedenen Stellen - zu dem Hänger zu kommen. (Hintergrund: ich habe einen Daten-Import aus einer Text-Datei auf Excel umgestellt).

Hier erscheint mir Jimmy's Vorschlag hilfreich, es mit einer Range zu versuchen und dann mit dem Array zu arbeiten (das Ändern in der Excel-Datei ist eigentlich nicht erforderlich, es müssen nur die importierten Daten angepasst werden).

Also danke erst einmal für das Feedback und die Hinweise. Ich werde weiter berichten.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 14502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Re: Excel-Datei einlesen - mit Debugger geht, ohne hängt das Programm

Beitrag von Martin Altmann » Di, 27. Feb 2018 8:01

Nun,
im Allgemeinen kann man (wie von Werner angemerkt) davon ausgehen, dass der Garbage Collector etwas Zeit braucht - sofern etwas mit aktivem Debugger funktioniert, ohne aber nicht.
In diesem speziellen Fall wirst Du mit Jimmys Vorschlag sicherlich besser dran sein, weil schneller (kein Bremsen des Ablaufs).

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
stellv. Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2422
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Kontaktdaten:

Re: Excel-Datei einlesen - mit Debugger geht, ohne hängt das Programm

Beitrag von Wolfgang Ciriack » Di, 27. Feb 2018 8:12

wenn du den Berech (Range) markierst (SELECT) kannst du doch alles in ein Array schaufeln mit
Markieren ist doch gar nicht notwendig, wenn man

Code: Alles auswählen

      oWorkBook := oExcel:workbooks:open(meineexecdatei)
      aValues := oWorkBook:workSheets(1):usedRange:value
      oWorkBook:close(.F.)
nimmt, hat man alle Werte in einem Array.
Viele Grüße
Wolfgang

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11421
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Excel-Datei einlesen - mit Debugger geht, ohne hängt das Programm

Beitrag von AUGE_OHR » Di, 27. Feb 2018 8:33

Wolfgang Ciriack hat geschrieben:
Di, 27. Feb 2018 8:12
Markieren ist doch gar nicht notwendig, wenn man

Code: Alles auswählen

      aValues := oWorkBook:workSheets(1):usedRange:value
nimmt, hat man alle Werte in einem Array.
hm ... :-k
aus irgend einem Grund lege ich das Array vorher in den Dimensionen an. dabei funktionierte

Code: Alles auswählen

      // nmber Row / Col
         numRows    := oWorkBook:workSheets(1):usedRange:Rows:Count
         numColumns := oWorkBook:workSheets(1):usedRange:Columns:Count
nicht wenn ich nicht vorher ein

Code: Alles auswählen

     // SELECT hole Range
        oWorkBook:workSheets(1):usedRange:Select
stehen hatte.

ich werde die paar Zeilen einfach mal auskommentieren und sehen ob es mit meiner (alten) Excel Version ohne die Zeilen läuft.
Danke für den Tip
gruss by OHR
Jimmy

Antworten