Import von Exeldaten in Xbase++

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
medmaster
UDF-Programmierer
UDF-Programmierer
Beiträge: 58
Registriert: Di, 29. Jan 2008 1:43

Import von Exeldaten in Xbase++

Beitrag 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
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: Import von Exeldaten in Xbase++

Beitrag 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()
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
medmaster
UDF-Programmierer
UDF-Programmierer
Beiträge: 58
Registriert: Di, 29. Jan 2008 1:43

Re: Import von Exeldaten in Xbase++

Beitrag 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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Import von Exeldaten in Xbase++

Beitrag 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
Gruß
Hubert
medmaster
UDF-Programmierer
UDF-Programmierer
Beiträge: 58
Registriert: Di, 29. Jan 2008 1:43

Re: Import von Exeldaten in Xbase++

Beitrag von medmaster »

das war sehr hilfreich Hubert - danke - funktioniert ...
medmaster
UDF-Programmierer
UDF-Programmierer
Beiträge: 58
Registriert: Di, 29. Jan 2008 1:43

Re: Import von Exeldaten in Xbase++

Beitrag 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
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Import von Exeldaten in Xbase++

Beitrag 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.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Import von Exeldaten in Xbase++

Beitrag 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:...
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Import von Exeldaten in Xbase++

Beitrag 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.
Gruß
Hubert
medmaster
UDF-Programmierer
UDF-Programmierer
Beiträge: 58
Registriert: Di, 29. Jan 2008 1:43

Re: Import von Exeldaten in Xbase++

Beitrag 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
medmaster
UDF-Programmierer
UDF-Programmierer
Beiträge: 58
Registriert: Di, 29. Jan 2008 1:43

Re: Import von Exeldaten in Xbase++

Beitrag von medmaster »

das kommt auch mit Fehler hoch ... kennt sheets zum Objekt nicht

oSheet := oBook:Sheets("GM ambulant")
oSheet:...
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Import von Exeldaten in Xbase++

Beitrag 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
Gruß
Hubert
medmaster
UDF-Programmierer
UDF-Programmierer
Beiträge: 58
Registriert: Di, 29. Jan 2008 1:43

Re: Import von Exeldaten in Xbase++

Beitrag 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
Antworten