Import von Exeldaten in Xbase++

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

Moderator: Moderatoren

Import von Exeldaten in Xbase++

Beitragvon medmaster » Do, 28. Jul 2016 12:05

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
medmaster
Cut&Paste-Entwickler
Cut&Paste-Entwickler
 
Beiträge: 37
Registriert: Di, 29. Jan 2008 1:43

Re: Import von Exeldaten in Xbase++

Beitragvon Rolf Ramacher » Do, 28. Jul 2016 12:16

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
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 1807
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim

Re: Import von Exeldaten in Xbase++

Beitragvon medmaster » Do, 28. Jul 2016 12:45

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
medmaster
Cut&Paste-Entwickler
Cut&Paste-Entwickler
 
Beiträge: 37
Registriert: Di, 29. Jan 2008 1:43

Re: Import von Exeldaten in Xbase++

Beitragvon brandelh » Do, 28. Jul 2016 12:56

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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13265
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Re: Import von Exeldaten in Xbase++

Beitragvon medmaster » Do, 28. Jul 2016 21:03

das war sehr hilfreich Hubert - danke - funktioniert ...
medmaster
Cut&Paste-Entwickler
Cut&Paste-Entwickler
 
Beiträge: 37
Registriert: Di, 29. Jan 2008 1:43

Re: Import von Exeldaten in Xbase++

Beitragvon medmaster » Do, 22. Sep 2016 12:21

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
medmaster
Cut&Paste-Entwickler
Cut&Paste-Entwickler
 
Beiträge: 37
Registriert: Di, 29. Jan 2008 1:43

Re: Import von Exeldaten in Xbase++

Beitragvon georg » Do, 22. Sep 2016 12:23

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
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 1769
Registriert: Fr, 08. Feb 2008 21:29

Re: Import von Exeldaten in Xbase++

Beitragvon brandelh » Do, 22. Sep 2016 13:04

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: 13265
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Re: Import von Exeldaten in Xbase++

Beitragvon brandelh » Do, 22. Sep 2016 13:13

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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13265
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Re: Import von Exeldaten in Xbase++

Beitragvon medmaster » Do, 22. Sep 2016 13:27

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
Cut&Paste-Entwickler
Cut&Paste-Entwickler
 
Beiträge: 37
Registriert: Di, 29. Jan 2008 1:43

Re: Import von Exeldaten in Xbase++

Beitragvon medmaster » Do, 22. Sep 2016 13:57

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

oSheet := oBook:Sheets("GM ambulant")
oSheet:...
medmaster
Cut&Paste-Entwickler
Cut&Paste-Entwickler
 
Beiträge: 37
Registriert: Di, 29. Jan 2008 1:43

Re: Import von Exeldaten in Xbase++

Beitragvon brandelh » Do, 22. Sep 2016 14:13

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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13265
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Re: Import von Exeldaten in Xbase++

Beitragvon medmaster » Do, 22. Sep 2016 14:34

.. 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
medmaster
Cut&Paste-Entwickler
Cut&Paste-Entwickler
 
Beiträge: 37
Registriert: Di, 29. Jan 2008 1:43


Zurück zu Daten und Tabellen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste