Seite 1 von 1

Excel via ODBC

Verfasst: 05.08.2019 23:31
von HeX0R
Ich muss ein paar Excel Dateien per PB auslesen, das Ganze habe ich per ODBC auch schon halbwegs umgesetzt.
Was ich aber einfach nicht auf die Reihe bekomme, ist die Namen der vorhandenen Sheets/Tabellen auszulesen.
Wenn ich weiss, wie das Sheet heisst, kann ich auch direkt drauf zugreifen, aber ich würde gerne vorher die vorhandenen auslesen.

Mit einem ODBC Viewer kann ich sehen, dass die unter SYSTEM TABLE stehen, aber ich bekomme einfach keine SELECT Anweisung hin, die mir die Sheets auflistet.
Hat das schonmal jemand umgesetzt?

Re: Excel via ODBC

Verfasst: 06.08.2019 17:04
von Mijikai
Mann kann das Excel File entpacken und die Sheets im Workbook auslesen.

Hier ein Beispiel (zeigt den Inhalt des Workbooks):

Code: Alles auswählen

EnableExplicit

UseZipPacker()

Global *worksheet
Global worksheet_size.i
Global xml_node.i
Global index.i

Procedure FillTree(*CurrentNode,CurrentSublevel.i)
  Protected text.s
  Protected *child
  If XMLNodeType(*CurrentNode) = #PB_XML_Normal
    text = GetXMLNodeName(*CurrentNode) + " (Attributes: "
    If ExamineXMLAttributes(*CurrentNode)
      While NextXMLAttribute(*CurrentNode)
        text + XMLAttributeName(*CurrentNode) + "=" + Chr(34) + XMLAttributeValue(*CurrentNode) + Chr(34) + " "
      Wend
    EndIf
    AddGadgetItem(4, -1, text, 0, CurrentSublevel)   
    *child = ChildXMLNode(*CurrentNode)
    While *child
      FillTree(*child, CurrentSublevel + 1)      
      *child = NextXMLNode(*child)
    Wend        
  EndIf
EndProcedure

If OpenPack(0,"dummy.xlsx");<- change!!!
  If ExaminePack(0)
    While NextPackEntry(0)
      If Right(PackEntryName(0),12) = "workbook.xml"
        worksheet_size = PackEntrySize(0,#PB_Packer_UncompressedSize)
        If worksheet_size
          *worksheet = AllocateMemory(worksheet_size)
          If *worksheet
            If UncompressPackMemory(0,*worksheet,worksheet_size) = worksheet_size
              If CatchXML(1,*worksheet,worksheet_size)
                If OpenWindow(3,0,0,600,400, "Excel Worksheet",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
                  TreeGadget(4,10,10,580,380)
                  xml_node = MainXMLNode(1)      
                  If xml_node
                    FillTree(xml_node,0)
                  EndIf
                  For index = 0 To CountGadgetItems(4) - 1
                    SetGadgetItemState(4,index,#PB_Tree_Expanded)
                  Next
                  Repeat
                  Until WaitWindowEvent() = #PB_Event_CloseWindow
                EndIf
                FreeXML(1)
              EndIf 
            EndIf 
          EndIf
        EndIf
        Break
      EndIf
    Wend
  EndIf
  ClosePack(0)
EndIf   

End

Re: Excel via ODBC

Verfasst: 06.08.2019 22:28
von HeX0R
o.k., auch ne Möglichkeit, müsste ich allerdings die Datei zweimal öffnen.
Mir ist vor allem gerade aufgefallen, dass im ODBC Viewer doch nicht alle Sheets in der SYSTEM TABLE aufgelistet werden :shock:

Re: Excel via ODBC

Verfasst: 07.08.2019 08:45
von mk-soft
Müsste mit PB v5.7 immer noch funtionieren...

Link: https://www.purebasic.fr/english/viewto ... 12&t=67180

ExamineTablle...

Re: Excel via ODBC

Verfasst: 07.08.2019 20:54
von HeX0R
Cool, Danke!
Etwas zu aufwändig zwar, aber das kann ich anpassen.