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 .. :cry:
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:

Code: Alles auswählen

    oSheet := oBook:Sheets("GM ambulant")
    oSheet:...

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