Daten aus Excel einlesen

Nutzung, Komponenten, .NET

Moderator: Moderatoren

Antworten
Wilfried Boos

Daten aus Excel einlesen

Beitrag von Wilfried Boos »

Hallo,
hat von euch jemand ein Beispiel wie ich aus Excel Daten
in eine dBase oder ADS Datenbank einlesen kann?

Benutze Xbase Vers. 1.9 + XClass Vers. 4
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Daten aus Excel einlesen

Beitrag von AUGE_OHR »

hi,
Wilfried Boos hat geschrieben: hat von euch jemand ein Beispiel wie ich aus Excel Daten
in eine dBase oder ADS Datenbank einlesen kann?
Benutze Xbase Vers. 1.9 + XClass Vers. 4
zunächst willkommen im deutschen Xbase-Forum.

grundsätzlich kannst du unter Xbase++ v1.9x per activeX zugreifen, ABER
sowohl lesen als auch schreiben ist "extrem langsam" ...

hier ein Beispiel wie ich aus einer chinesischen Excel Tabelle auslese und
dabei die chinesischen Schriftzeichen als Bitmap "fotographiere" und in
die *.FPT abspeichere :

Code: Alles auswählen

#pragma library( "ascom10.lib" )
#include "XBP.CH"

// This one was created with:
// tlb2ch Excel.Application > excel.ch
#include "Excel.ch"

PROCEDURE Main( )
LOCAL oClipBoard, oRange, aFormats, nFormat, nPos
LOCAL oXbpBitmap, oExcel
LOCAL cFile := CurDrive()+":"+CurDir()+"\CHINA.XLS"

IF !FILE("CHINABMP.DBF")
   CRE_CHINABMP()
ENDIF

   USE CHINABMP EXCLUSIV
   ZAP

   // Create Excel object and open document
   oExcel := GetObject( , "Excel.Application" )
   oExcel:Workbooks:open( cFile )

   FOR nRow       := 1 TO 847 // row_of_bottomrightcell
      APPEND BLANK
      FOR nCol    := 1 TO 2   // column_of_bottomrightcell
          IF nCol == 1
             cdummy := "A"

             oWorkSheet := oExcel:Worksheets( "Tabelle1" ) //:range( "A"+nRow+":"+"A"+nRow )
             * oRange:copyPicture(, xlBitmap)
             oRange := oWorksheet:cells
             oCells := oRange:cells
             osinglecell:=ocells:cells(nrow,ncol):value
             IF osinglecell != NIL
                IF !EMPTY(osinglecell)
                   DO CASE
                      CASE VALTYPE(osinglecell) = "N"
                          REPLACE BILDNR  WITH STR(osinglecell,10,0)
                      CASE VALTYPE(osinglecell) = "C"
                          REPLACE BILDNR  WITH osinglecell
                   ENDCASE
                   ? cdummy := BILDNR
                ENDIF
             ENDIF
          ELSE
              // Copy a range to clipboard in bitmap format
              // :copyPicture() without parameter will save as Metafile
*              oRange := oExcel:Worksheets( "Tabelle1" ):range( "A4:C6" )
              cRange := "B"+LTRIM(STR(nRow))            //+":"+"C"+LTRIM(STR(nRow))
              oRange := oExcel:Worksheets( "Tabelle1" ):range( cRange )
              oRange:copyPicture(, xlBitmap)

              // Create a clipboardobject and read the image from
              // clipboard. Thereafter destroy the object
              oClipBoard := XbpClipBoard():new():create()
              oClipBoard:open()
              aFormats := oClipBoard:queryFormats()
              nFormat := XBPCLPBRD_BITMAP
              IF 0 != ( nPos := AScan( aFormats, nFormat ) )
                oXbpBitmap := oClipBoard:getBuffer( aFormats[ nPos ] )
              ENDIF
              oClipBoard:close()
              oClipBoard:destroy()

              REPLACE BITMAP WITH oXbpBitmap:setBuffer()

              IF VAL(cdummy) > 0

              ELSE
                 cdummy := "B"+LTRIM(STR(RECNO()))
              ENDIF

              // Save Bitmap to file
              oXbpBitmap:saveFile( TRIM(cdummy)+".bmp" )

              // cleanup
              oXbpBitmap:destroy()

          ENDIF
      NEXT
   NEXT

   // End Automationserver and destroy connection
   oExcel:quit()
   oExcel:destroy()

  RETURN

PROCEDURE CRE_CHINABMP()

   // New table, store bitmap to memofield using FOXDBE
   DbCreate( "CHINABMP", {{ "BILDNR"  , "C",  6, 0 }, ;
                                         { "BILDNAME", "C", 40, 0 }, ;
                                         { "BITMAP"  , "M", 10, 0}}, "FOXCDX" )

RETURN
wie schon gesagt es geht sehr langsam ... ich würde immer zu einem CVS
Export aus Excel raten und die dann per FOpen/FRead einlesen , aber ich
kann in diesem Fall (chinesich = Unicode) keine CVS Format verwenden.

gruss by OHR
Jimmy
Alfred
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 476
Registriert: Do, 03. Mai 2007 12:37
Wohnort: München

Beitrag von Alfred »

Hallo Wilfried,

Jimmy war schneller: :)

Code: Alles auswählen

#include "activex.ch"
#include "excel.ch"   // siehe samples\activex\msexcel
PROCEDURE main
  LOCAL oExcel, oBook, oSheet1, buchtext
  // Create the "Excel.Application" object
  oExcel := CreateObject("Excel.Application")
  oExcel:visible := .T.
  IF Empty( oExcel )
    MsgBox( "Excel is not installed" )
    RETURN
  ENDIF
oBook := oExcel:Workbooks:Open("test_datei1.xls")
oSheet1 := oBook:Worksheets("Tabelle2")
oSheet1:Activate
buchtext := ALLTRIM(oSheet1:cells(1,7):value) 
msgbox(buchtext)
oExcel:Quit()
oExcel:Destroy()
RETURN


Gruß
Alfred
Wilfried Boos

Beitrag von Wilfried Boos »

Hallo Jimmy, Hallo Alfred,
vielen Dank für die Beitäge.

Werde diese im laufe der Woche testen.
CSV geht bei mir leider nicht aus ähnlichen Gründen wie bei Jimmy.

Noch eine Frage:

Wie kann ich geziehlt Felder, Zeilen und Spalten ansprechen
die ich einlesen will und eventuell die Formatierung ändern.

Gruß
Wilfried
Alfred
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 476
Registriert: Do, 03. Mai 2007 12:37
Wohnort: München

Beitrag von Alfred »

Hallo Wilfried,

mein Programm habe ich extra für dich abgespeckt, damit Du die Grund-
lagen dir erarbeiten kannst und ist für Testzwecke voll lauffähig.

Du must nur eine entsprechende Exceldatei anlegen und in der
Tabelle 2 in der Zeile 1 Spalte 7 einen Text eingeben und im Programm
einen Pfad zu der Exceltabelle angeben.

Somit hast Du bereits den Zugriff auf eine Datei, ein Arbeitsblatt und eine
Zelle.

Für den Zugriff gelten die ganz normalen Office Automationsregeln
für Excel.

Du solltest konkret beschreiben was Du tun möchtest, dann kann man
gezielt Ratschläge geben. Auch wäre wichtig mit welcher Excelversion
Du arbeitest.

Gruß
Alfred
Wilfried Boos

Beitrag von Wilfried Boos »

Hallo Alfred,

habe mit Activx und Office Automationsregeln
keinerlei Erfahrung

Werde diese Woche mal anfangen um mich einzuarbeiten
Ich verwende Office Version 2003XP

Ich glaube mit den Beispielen komme ich klar

Nochmals vielen Dank an alle
Berichte dan über meine Ergebnsse

Gruß
Wilfried
Antworten