Excel - Einlesen einer Tabelle

Einbindung von Office-Komponenten wie Word, Excel usw.

Moderator: Moderatoren

Antworten
Chris
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 34
Registriert: Fr, 17. Feb 2006 8:51
Wohnort: München

Excel - Einlesen einer Tabelle

Beitrag von Chris » Do, 21. Apr 2011 16:46

Hallo,

also ich habe über Active X das einlesen einer Excel-Tabelle und Umwandeln in eine DBF-Datei gelöst. Jeztt habe ich allerdings ein Problem mit Zellen die Numerische Werte mit mehr als zwei Nachkommastellen haben. Wenn ich diese mit Range("XY"):Value auslese, dann erhalte ich hier einen gerundeten Wert auf zwei Nachkommastellen. Die Formatierung der Zellen steht in Excel bereits auf Numerisch mit drei Nachkommastellen, es wird auch korrekt angezeigt, nur eben beim Einlesen erhalte ich den falschen Wert.

Hat von euch jemand eine Idee wie ich Excel dazu bringe mir die Werte mit allen Nachkommastellen auszugeben?

Danke schon im Voraus.

Gruß,
Chris

Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1857
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Kontaktdaten:

Re: Excel - Einlesen einer Tabelle

Beitrag von Rolf Ramacher » Do, 21. Apr 2011 17:13

Hi Chris.,

das habe ich bei mir so

Code: Alles auswählen

   oExcel := CreateObject("Excel.Application")
   IF Empty( oExcel )
    MsgBox( "Excel ist nicht installiert" )
    RETURN Nil
   ENDIF

   oExcel:DisplayAlerts := .F.
   oExcel:visible       := .f.

	oBook := oExcel:Workbooks:Open(cFile)
	oSheetDat := oBook:Sheets(cWork)
	oSheetDat:Select()

	oRange:=oSheetDat:Range(cVonBis)
	oRange:select()
	aExcelWerte:=oRange:Value()

	For i = 1 to Len(aExcelWerte)
		nZaehler++
		If nZaehler % 1000 == 0
			oAnzStatic:setcaption("Adressn werden gelesen:  "+aExcelwerte[i][3])
			nZaehler:=0
		Endif
		cBemerk:=""

		Do Case
			Case valtype(aExcelwerte[i][5]) = "N"
				cPlz:=alltrim(str(Int(aExcelWerte[i][5])))
			Case 	valtype(aExcelwerte[i][5]) = "C"
				cPlz:=alltrim(aExcelWerte[i][5])
		Endcase

		If cBis ="G" 
			Do Case
				Case valtype(aExcelwerte[i][7])="N"
					cIndex:=strzero(aExcelwerte[i][7],6)
				Case Valtype(aExcelWerte[i][7])="C"
					cIndex:=strzero(val(aExcelwerte[i][7]),6)
				Otherwise
					cIndex:=padr(alltrim(aExcelwerte[i][3])+alltrim(aExcelwerte[i][4])+cPlz,105)
			Endcase
		Else
			cIndex:=padr(alltrim(aExcelwerte[i][3])+alltrim(aExcelwerte[i][4])+cPlz,105)
		Endif
		If Adress->(!DbSeek(cIndex))
			Adress->(DbAppend())
			If cBis="G"	
				If Valtype(aExcelwerte[i][7])="N"
					Adress->Kdnr:=aExcelwerte[i][7]
				Else
					Adress->Kdnr:=val(alltrim(aExcelwerte[i][7]))
				Endif
			Else
				Adress->Kdnr:=nKdnr+1
			Endif
		Endif
		Do While Adress->(!Rlock())
		Enddo
		If aExcelWerte[i][1] <> NIL
			Adress->Ana:=alltrim(aExcelwerte[i][1])
		Endif
		If aExcelwerte[i][2] <> NIL
			Adress->VName:=alltrim(aExcelwerte[i][2])
		Endif
		Adress->Str:=alltrim(aExcelwerte[i][4])
		Adress->NName:=alltrim(aExcelWerte[i][3])
		If valtype(aExcelwerte[i][5]) = "N"
			Adress->Plz:=alltrim(str(Int(aExcelwerte[i][5])))
		Else
			Adress->Plz:=alltrim(aExcelWerte[i][5])
		Endif
		If aExcelWerte[i][6] <> Nil
			Adress->Ort:=alltrim(aExcelWerte[i][6])
		Endif
		If cBis="H"
			If aExcelWerte[i][8] <> NIL
				Do Case
					Case valtype(aExcelWerte[i][8]) = "C"
						cBemerk+=alltrim(aExcelWerte[i][8])
					Case valtype(aExcelWerte[i][8]) = "N"
						cBemerk+=alltrim(str(Int(aExcelWerte[i][8])))
					Otherwise
						cBemerk+=dtoc(aExcelWerte[i][8])
				Endcase
			Endif
		Endif
		If cBis="I"
			If aExcelWerte[i][9] <> NIL
				Do Case
					Case valtype(aExcelWerte[i][9]) = "C"
						cBemerk+=alltrim(aExcelWerte[i][9])
					Case valtype(aExcelWerte[i][9]) = "N"
						cBemerk+=alltrim(str(Int(aExcelWerte[i][9])))
					Otherwise
						cBemerk+=dtoc(aExcelWerte[i][9])
				Endcase
			Endif
			Adress->Bemerk:=cBemerk
		Endif
		If cBis="J"
			If aExcelWerte[i][10] <> NIL
				If valtype(aExcelWerte[i][10]) = "C"
					Adress->Tel:=alltrim(aExcelWerte[i][10])
				Else
					Adress->Tel:=alltrim(str(Int(aExcelWerte[i][10])))
				Endif
			Endif
		Endif
		If cBis="K"
			If aExcelWerte[i][11] <> NIL
				If valtype(aExcelWerte[i][11]) = "C"
					Adress->Tel2:=alltrim(aExcelWerte[i][11])
				Else
					Adress->Tel2:=alltrim(str(Int(aExcelWerte[i][11])))
				Endif
			Endif
		Endif
		Adress->(DbUnlock())
		nKdnr++
	Next i
Hierbei werden Adressen eingelesen. Vielleicht hilft es dir
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de

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

Re: Excel - Einlesen einer Tabelle

Beitrag von Wolfgang Ciriack » Do, 21. Apr 2011 18:04

Hallo Rolf,
tue und doch bitte den Gefallen, und lies dir vor einer Antwort mal die Frage genau durch. Ich weiss natürlich nicht, ob deine Adressen irgendwo 3 Nachkommastellen haben :roll:
Viele Grüße
Wolfgang

Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2084
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Kontaktdaten:

Re: Excel - Einlesen einer Tabelle

Beitrag von Koverhage » Do, 21. Apr 2011 18:17

Hallo Chris,

wie lautet Deine Anweisung zur Sortierung und wann machst Du die ?
Gruß
Klaus

Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2084
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Kontaktdaten:

Re: Excel - Einlesen einer Tabelle

Beitrag von Koverhage » Do, 21. Apr 2011 18:20

bei mir lautet die z.B.

// Liefermenge
oSheet:Cells(nRow,2):Value := strtran(ltrim(str(l_menge)),".",",")
oSheet:Cells(nRow,2):NumberFormat := "#0,000"
oSheet:Cells(nRow,2):HorizontalAlignment = xlRight
Gruß
Klaus

Chris
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 34
Registriert: Fr, 17. Feb 2006 8:51
Wohnort: München

Re: Excel - Einlesen einer Tabelle

Beitrag von Chris » Do, 21. Apr 2011 20:30

Hallo,
danke erstmal für eure Antworten. Inzwischen hab ich mein Problem aber lösen können. Es lag an der Einstellung von

Code: Alles auswählen

SET DECIMALS TO
mit

Code: Alles auswählen

SET(_SET_DECIMALS)
hat diese 2 zurückgegeben. Nachdem ich es auf

Code: Alles auswählen

SET(_SET_DECIMALS, 4)
gesetzt habe, habe ich auch die richtigen Werte aus Excel zurückbekommen.

Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2084
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Kontaktdaten:

Re: Excel - Einlesen einer Tabelle

Beitrag von Koverhage » Sa, 23. Apr 2011 10:04

Hallo Chris,

laut Doku ist dies nur für die Anzeige im Xbase++ Programm, dürfte so mit nicht die Ursache sein.
Werde das aber mal ausprobieren, wenn es so ist, könnte es für
ein bestimmtes Problem sehr hilfreich sein.
Gruß
Klaus

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

Re: Excel - Einlesen einer Tabelle

Beitrag von AUGE_OHR » Sa, 23. Apr 2011 20:24

Koverhage hat geschrieben:laut Doku ist dies nur für die Anzeige im Xbase++ Programm, dürfte so mit nicht die Ursache sein.
Ich kann bestätigen das es für alle activeX Verbindungen gilt die ich bislang ausprobiert habe.
wenn man, mittels DispHpr.DLL und Ot4Xb, einen "Zeit" String mit Dezimal Stellen YYYYMMDDHHMMSS.ccc erhalten möchte muss man

Code: Alles auswählen

SET DECIMALS TO 4
setzen
gruss by OHR
Jimmy

Antworten