Seite 1 von 1
Import von Exeldaten in Xbase++
Verfasst: Do, 28. Jul 2016 13:05
von medmaster
Hallo zum, Thema Excelansprache :
leider steig ich in Xbase++ nicht so tief ein ..
Gibt es eine "einfache"
Methode-/ Code-Beispiel für :
(Xbase++ 1.9)
1. Öffnen einer Exceldatei
2. Auslesen der Daten z.B. in einen Array
oder Einzelansprache der Spalten und Zellen
oder
1. Öffnen einer Exceltabelle ?
2. Sofortiges speichern als .CSV ?
3. Einlesen dieser .CSV in Array (bekannte Methode)
Die Datei kann vorher nicht manuell in eine .CSV umgewandelt werden, kann dies
vielleicht Xbase++ automatisiert machen und diese dann normal öffnen ?
Danke fürs Überdenken
Rainer
Re: Import von Exeldaten in Xbase++
Verfasst: Do, 28. Jul 2016 13:16
von Rolf Ramacher
dies geht z.B. 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()
Allerdings muss vorher feststehen, welches Arbeitsblatt und von welcher Größe
cFile ist die Datei , cWork der Name des Arbeitsblattes cVonBis behinhaltet z.B: A1:K2000
zum schluss nur noch oExcel:quit() und oExcel:destroy()
Re: Import von Exeldaten in Xbase++
Verfasst: Do, 28. Jul 2016 13:45
von medmaster
Rolf- danke - ein Anfang ....
Kennst Du auch die 2. Methode -> Öffnen und sofort wieder speichern als .csv ?
Erscheint mir erstmal einfacher oder ... ?
Die Größe ist immer variabel, die Werte müssen ? in einen Array zur weiteren Bearbeitung.
Gruß
Rainer
Re: Import von Exeldaten in Xbase++
Verfasst: Do, 28. Jul 2016 13:56
von brandelh
Unter Xbase gibt es ein Beispiel, das mit Excel eine DBF öffnet und als XLS abspeichert, genauso geht das auch mit CSV, nur die Namen und der Parameter muss angepaßt werden.
D:\...\XPPW32\source\samples\activex\msexcel
hier Beispiel 1
Code: Alles auswählen
//////////////////////////////////////////////////////////////////////
PROCEDURE main
LOCAL oExcel, oBook
LOCAL cSDir, cTDir
// Erzeugen eines "Excel.Application"-Objektes
oExcel := CreateObject("Excel.Application")
IF Empty( oExcel )
MsgBox( "Excel ist nicht installiert" )
RETURN
else
MsgBox( "Excel (Version: "+var2char(oExcel:version)+") ist installiert !" )
ENDIF
// Vermeiden von Nachrichten wie "Die Datei
// existiert bereits". Sicherstellen, dass
// die Excel-Anwendung sichtbar ist.
oExcel:DisplayAlerts := .F.
oExcel:visible := .T.
// Das Quellverzeichnis ist das Verzeichnis mit
// den DBF-Tabellen der Xbase++-Beispielkollektion.
// Das Zielverzeichnis ist das Verzeichnis der
// Anwendung.
cTDir := CurDrive()+":\"+CurDir()
cSDir := cTDir + "\..\..\data"
// Eine DBF-Tabelle in einem Workbook oeffnen.
oBook := oExcel:workbooks:Open(cSDir+"\customer.dbf") // hier einfach XLS angeben, Excel kennt den Typ
// Das Workbook wird mit einem neuen Namen abgespeichert.
// Ein voll qualifizierter Pfad muss angegeben werden.
// xlWorkbookNormal erzeugt eine normale Excel-Datei.
oBook:SaveAs( cTDir+"\MyExcel.xls" , xlWorkbookNormal ) // hier als Endung CSV und als Typ ... vermutlich eines von diesen xlCSV, xlCSVMSDOS, xlCSVWindows
// Beenden von Excel und Zerstoeren des Anwendungs-
// objektes
oExcel:Quit()
oExcel:Destroy()
WAIT
RETURN
Re: Import von Exeldaten in Xbase++
Verfasst: Do, 28. Jul 2016 22:03
von medmaster
das war sehr hilfreich Hubert - danke - funktioniert ...
Re: Import von Exeldaten in Xbase++
Verfasst: Do, 22. Sep 2016 13:21
von medmaster
Noch ein blödes Syntax-Problem ....
Ich will ein bestimmtes Arbeitsblatt ansprechen
So kommt Fehlermeldung .. hmmm
Code: Alles auswählen
oSheet := oExcel:Workbooks:Open(cExcelfile):ActiveSheet // Exceltabelle laden
oSheet:=oExcel:workbooks:("GM ambulant"):Select <----- hier kommt der Syntaxfehler
oSheet :SaveAs("F:\ambulant.csv" , 24 )
eine Idee ?
Gruß
Rainer
Re: Import von Exeldaten in Xbase++
Verfasst: Do, 22. Sep 2016 13:23
von georg
Hallo, Rainer -
also, ich gehe wie folgt vor:
Makro aufzeichen
Schritte durchlaufen, die mein Programm machen soll
Makroaufzeichnung beenden
Makro ansehen
Damit klären sich oft und schnell Fragen nach Objekten, Methoden oder Syntax bei dem Namen eines Tabellenblattes.
Re: Import von Exeldaten in Xbase++
Verfasst: Do, 22. Sep 2016 14:04
von brandelh
Ein Workbook ist die XLS(X) Datei selbst.
Das Arbeitsblatt ist ein sheet, wenn ich von einer Zelle auf eine auf einem anderen Arbeitsblatt verweise und das Macro aufzeichne, dann kommt das dabei raus:
Code: Alles auswählen
Range("A6").Select
ActiveCell.FormulaR1C1 = "45" ' 45 eingetippt ... dumm, + vergessen
Sheets("Tabelle2").Select
Range("B12").Select
Sheets("Tabelle1").Select
Range("A6").Select
ActiveCell.FormulaR1C1 = "=45+Tabelle2!R[2]C[2]" ' so sieht eine Formel über zwei Sheets aus
Range("A7").Select
Application.Goto Reference:="Makro1"
das mit dem Verketten geht in Xbase++ nicht so gut, daher sauber die Objekte trennen:
Code: Alles auswählen
// Erzeugen eines "Excel.Application"-Objektes
oExcel := CreateObject("Excel.Application")
IF Empty( oExcel )
MsgBox( "Excel ist nicht installiert" )
RETURN
else
MsgBox( "Excel (Version: "+var2char(oExcel:version)+") ist installiert !" )
ENDIF
oBook := oExcel:Workbooks:Open(cExcelfile)
oSheet := oBook:ActiveSheet
// querformat
oSheet:PageSetup:Orientation := xlLandscape
// Die Spalten werden formatiert. Die erste Spalte
// soll den Namen beinhalten. Alle anderen Spalten
// beinhalten numerische Zahlenwerte
oSheet:Columns( 2 ):NumberFormat := "0.00"
oSheet:Columns( 3 ):NumberFormat := "0.00"
... Werte füllen in Zellen, man kann das auch schneller über die Zwischenablage
// Die Daten werden aus der DBF Tabelle in die
// Zellen des Arbeitsblattes uebertragen
? "Werte aus der DBF Tabelle uebertragen"
DO WHILE !EOF()
oSheet:Cells(nRow,1):Value := FIELD->PARTNAME
oSheet:Cells(nRow,2):Value := FIELD->PURCHASE
oSheet:Cells(nRow,3):Value := FIELD->SELLPRICE
nRow++
DbSkip(1)
ENDDO
// Die Breite der ersten Spalte wird dem Inhalt der
// Zellen angepasst.
oSheet:Columns( 1 ):AutoFit()
? oBook:FullName
deine Fehlerzeile würde ich aus dem Stand so übersetzen:
Re: Import von Exeldaten in Xbase++
Verfasst: Do, 22. Sep 2016 14:13
von brandelh
Sheets("Tabelle1").Select
Das .Select (soweit ich das verstanden habe) speichert ein Ergebnis-Objekt (dieses Select-Befehls)
in einer Art von globaler Umgebungsvariable für alle folgenden Befehle (bis eine Aufhebung erfolgt ...)
wir müssen das Ergebnis in einer Objektvariablen speichern:
oSheet := Sheets("Tabelle1")
Dafür können wir sehr genau auf die verschiedenen Objekte zugreifen, auch gemischt.
Re: Import von Exeldaten in Xbase++
Verfasst: Do, 22. Sep 2016 14:27
von medmaster
danke - aber kam dann doch nicht weiter - ich will einfach ein anderes sheet abspeichern hmmm
das ist jetzt mal der Code ... der nicht sauber arbeitet
oSheet := oExcel:workbooks:Open(cExcelfile):ActiveSheet // Exceltabelle laden
oSheet :SaveAs("F:\stationär.csv" , 24 )
-------> oSheet := oExcel:workbooks:Sheets("GM ambulant") Fehler
osheet :SaveAs("F:\ambulant.csv" , 24 )
Gruß
rainer
Re: Import von Exeldaten in Xbase++
Verfasst: Do, 22. Sep 2016 14:57
von medmaster
das kommt auch mit Fehler hoch ... kennt sheets zum Objekt nicht
oSheet := oBook:Sheets("GM ambulant")
oSheet:...
Re: Import von Exeldaten in Xbase++
Verfasst: Do, 22. Sep 2016 15:13
von brandelh
Ich habe hier eine andere Funktion, welche über die Nummer auf die Sheets zugreift (Namen suche ich normal nicht):
Code: Alles auswählen
oBook := oExcel:workbooks:Open(cXLS)
for s := 1 to 2
oSheet := oBook:worksheets(s)
? "Aktuelles Arbeitsblatt: ",oSheet:name
oSheet:activate()
oSheet:visible := .t.
oSheet:Columns(2):NumberFormat := "@" // Phoenics-AZ -> TEXT Format !
oSheet:Columns(3):NumberFormat := "@" // Phoenics-AZ -> TEXT Format !
nMaxX := len(oSheet:usedRange:value) // Anzahl der Datenzeilen
Ob sich aber ein Sheet einzeln Speichern läßt, das weiß ich nicht
Re: Import von Exeldaten in Xbase++
Verfasst: Do, 22. Sep 2016 15:34
von medmaster
.. danke so arbeitet es sauber ........... und speichert das angesprochene sheet
.............
Code: Alles auswählen
obook := oExcel:Workbooks:Open(cExcelfile)
oSheet := oBook:activesheet
oSheet :SaveAs("F:\station.csv" , 24 )
oSheet := oBook:worksheets("GM ambulant")
osheet :SaveAs("F:\ambulant.csv" , 24 )
.............
Eine csv lässt sich dann gut verarbeiten ....
Gruß
Rainer