Probleme beim einlesen von Excel-Zellen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Probleme beim einlesen von Excel-Zellen

Beitrag von Ghosty1967 »

Hallo Leutz....

Ich möchte diverse Zellen einer existierenden Excel-Tabelle zur Übung auswerten und
habe mir dazu den Code von TS kopiert und ein wenig angepasst.
Die Tabelle sieht folgendermaßen aus.

18.08.2007 | 01.09.2007 | 3-KIM-269-IT23_ITR100 | WERK-4357 | IT23/ITR100 | 15423 | 6,60 | 3M Deutschland | 200193460 | 5058466

In einigen der zehn dargestellten Spalten, kann sich aber der Datentyp ändern, so z.B wo "6,60" steht kann auch "ohne" stehen.

Wenn ich nun eine Zelle einlese und den Datentyp der Zelle mittels
DatabaseColumnType() ermitteln möchte, bekomme ich z.B. für die Zelle
mit der "6,60" als Datentyp "2" also String zurück. Lese ich diese Zelle dann über GetDatabaseString() ein, so ist der Rückgabestring LEER...
Ähnlich verhalten sich auch andere Zellen. Woran liegt das wohl?
Kann mir einer sagen, was ich so gravierendes falsch mache?denn falsch?

Code: Alles auswählen

Enumeration 1
  #ODBC_ADD_DSN             ; // Add data source
  #ODBC_CONFIG_DSN          ; // Configure (edit) Data source
  #ODBC_REMOVE_DSN          ; // Remove data source
  #ODBC_ADD_SYS_DSN         ; // add a system DSN
  #ODBC_CONFIG_SYS_DSN      ; // Configure a system DSN
  #ODBC_REMOVE_SYS_DSN      ; // remove a system DSN
  #ODBC_REMOVE_DEFAULT_DSN  ; // remove the default DSN
EndEnumeration

Procedure.s AddDSN(databasename.s, user.s = "", pass.s = "", driver.s = "") ; Result DSN
  Protected name.s, strDriver.s, strAttributes.s
  Protected l.l, result.l
  Protected *buffer.Character
  name.s = GetFilePart(databasename)
  name = Left(name.s, Len(name.s) - 4)
  name = "Pure" + name
  If driver = ""
    driver = GetExtensionPart(databasename)
  EndIf
  Select UCase(driver)
    Case "ACCESS", "MDB"
      strDriver.s = "Microsoft Access Driver (*.mdb)"
    Case "EXCEL", "XLS"
      strDriver.s = "Microsoft Excel Driver (*.xls)"
    Case "DBASE", "DBF"
      strDriver.s = "Microsoft dBase Driver (*.dbf)"
    Case "TEXT", "TXT", "CSV"
      strDriver.s = "Microsoft Text Driver (*.txt; *.csv)"
    Default
      strDriver.s = driver
  EndSelect
  strAttributes.s = "Server=APServer;Description=" + name
  strAttributes.s + ";DSN=" + name
  strAttributes.s + ";DBQ=" + databasename
  strAttributes.s + ";UID=" + user
  strAttributes.s + ";PWD=" + pass + ";"
  *buffer = @strAttributes
  For l = 0 To Len(strAttributes) - 1
    If *buffer\c = ';'
      *buffer\c = 0
    EndIf
    *buffer + 1
  Next l
  result = SQLConfigDataSource_(0, #ODBC_ADD_DSN, strDriver, @strAttributes)
  If result: ProcedureReturn name: Else: ProcedureReturn "": EndIf
EndProcedure

Procedure.l RemoveDSN(databasename.s, user.s = "", pass.s = "", driver.s = "")
  Protected name.s, strDriver.s, strAttributes.s
  Protected l.l, result.l
  Protected *buffer.Character
  name = GetFilePart(databasename)
  name = Left(name, Len(name) - 4)
  name = "Pure" + name
  If driver = ""
    driver = GetExtensionPart(databasename)
  EndIf
  Select UCase(driver)
    Case "ACCESS", "MDB"
      strDriver = "Microsoft Access Driver (*.mdb)"
    Case "EXCEL", "XLS"
      strDriver = "Microsoft Excel Driver (*.xls)"
    Case "DBASE", "DBF"
      strDriver = "Microsoft dBase Driver (*.dbf)"
    Case "TEXT", "TXT", "CSV"
      strDriver = "Microsoft Text Driver (*.txt; *.csv)"
    Default
      strDriver = driver
  EndSelect
  strAttributes = "DSN=" + name + ";"
  *buffer = @strAttributes
  For l = 0 To Len(strAttributes) - 1
    If *buffer\c = ';'
      *buffer\c = 0
    EndIf
    *buffer + 1
  Next l
  result = SQLConfigDataSource_(0, #ODBC_REMOVE_DSN, strDriver, @strAttributes)
  ProcedureReturn result
EndProcedure
 
Procedure ReadCellValue(excelDB.s, excelSheet.s, excelRow.l ,excelColumn.l)
  Base.s = AddDSN(excelDB)
  If Base
    If OpenDatabase(0, Base, "", "")
      excelSheet="["+excelSheet+"$]"
      sql.s = "Select * From "+excelSheet
      If DatabaseQuery(0, sql)
        For y=1 To excelRow-1:  NextDatabaseRow(0): Next y
        datatype.l=DatabaseColumnType(0,excelColumn-1)
        Select datatype
          Case 1: ProcedureReturn GetDatabaseLong(0, excelColumn-1)
          Case 2: ProcedureReturn GetDatabaseString(0, excelColumn-1)
          Case 3: ProcedureReturn GetDatabaseFloat(0, excelColumn-1)
          Case 4: ProcedureReturn GetDatabaseDouble(0, excelColumn-1)
          Case 5: ProcedureReturn GetDatabaseQuad(0, excelColumn-1)
        EndSelect
      EndIf
    EndIf
  EndIf
  RemoveDSN(excelDB, "", "")
EndProcedure

InitDatabase()
ReadCellValue("E:\Daten\Testdaten.xls", "Blatt1", 10, 6)
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Das die Procedure nicht als String declariert ist kann auch kein String zurückkommen.
Die Procedure wandelt automatisch alles in Long um.


Hinweis:
Es ist nicht sinnvoll AddDSN und RemoveDSN innerhalb dieser Procedure zu legen.
Sollte am Anfang und an Ende des Hauptprogramm erfolgen, da sonst unnötig viel im System geschrieben wird.

FF :wink:

P.S. Lade dir mal ExDatabase LIB von ts-soft und meiner seit
http://www.purebasic.fr/german/viewtopi ... c&start=10
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten