Excel - Einlesen einer Tabelle

Einbindung von Office-Komponenten wie Word, Excel usw.

Moderator: Moderatoren

Antworten
Chris
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 49
Registriert: Fr, 17. Feb 2006 8:51
Wohnort: München
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Excel - Einlesen einer Tabelle

Beitrag von Chris »

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: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Excel - Einlesen einer Tabelle

Beitrag von Rolf Ramacher »

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: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Excel - Einlesen einer Tabelle

Beitrag von Wolfgang Ciriack »

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: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Excel - Einlesen einer Tabelle

Beitrag von Koverhage »

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: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Excel - Einlesen einer Tabelle

Beitrag von Koverhage »

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: 49
Registriert: Fr, 17. Feb 2006 8:51
Wohnort: München
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Excel - Einlesen einer Tabelle

Beitrag von Chris »

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: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Excel - Einlesen einer Tabelle

Beitrag von Koverhage »

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: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Excel - Einlesen einer Tabelle

Beitrag von AUGE_OHR »

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