xlsxNative - XLSX/XLSM-Dateien ohne Excel öffnen

  • Ich musste letztens xlsx-Dateien einlesen und mochte die Variante über Excel.au3 nicht wirklich, da diese durch Excel selbst ziemlichen Overhead hat und außerdem ist man darauf angewiesen dass Excel auch installiert ist. Also hab ich mir mal so eine xlsx-Datei näher angesehen und daraufhin eine kleine Funktion geschrieben, welche mir direkt mit Bordmitteln ein Worksheet aus der Datei in ein Array einliest.


    Das ganze ist jetzt nicht wahnsinnig auf alle Spezialfälle hin ausgebaut sondern deckt bislang die Fälle ab, welche bei mir bisher aufgetreten sind. Es gibt wohl auch schon andere UDFs die das gleiche machen aber selbst machen, macht mehr Spaß!


    Da die xlsx-Dateien entpackt werden müssen empfehle ich eine >>7za.exe<< mit zum Skript dazuzupacken, sonst wird auf die Shell.Application-Methode ausgewichen und die ist laaaaaaangsam...


    Große Erklärung ist nicht notwendig:

    AutoIt
    #include <Array.au3>
    #include "xlsxNative.au3"
    Global $aWorksheet = _xlsx_2Array("Test.xlsx", 1)
    _ArrayDisplay($aWorksheet)

    Changelog:

    2020/08/07 __xlsxExcel2Date: Stringausgabe (lokal formatiert) der Datums/Zeit-Werte implementiert
    2020/07/31

    Fix: Zellen mit hybriden Zellinhalten wurden ignoriert


    Leere aber gestylte Zellen werden nicht mehr prozessiert (Leerzeilen werden vermieden und etwas schneller)

    2020/07/30 Verbesserung der Namespace-Behandlung
    2020/07/29 Parameter um auf bestimmte Zeilen einzugrenzen hinzugefügt
  • Neue Version hab ich hochgestellt.


    Deine xlsx hat Zellen die keinen Inhalt haben aber einen Style besitzen.

    Für die Ausgabe als Array sollten die also ignoriert werden.
    Nun ist es jedoch so, dass die UDF zwei Wege hat die Ausmaße des Arrays zu bestimmen.

    Zum einen schaut sie ob ein dimension tag existiert, denn dort trägt Excel ein bis wohin die beschriebenen Zellen gehen.

    Problem hierbei: Gestylte, aber leere Zellen werden hier mit reingezählt.

    Wenn kein solches Tag existiert geht die UDF einfach alle Zellen durch und schaut wo das jeweilige Maximum liegt.
    In deinem Fall wäre diese Vorgehensweise aber meiner Meinung nach besser da du sonst am Ende noch einige leere Zeilen hast.


    Vielleicht sollte ich daher prinzipiell auf die Auswertung des dimension-tag verzichten?


    Vielleicht auch und statt oder? ;)

    Ja hab es natürlich mit ergänzt.


    Edit: Ach hab es jetzt einfach komplett auf die empirische Bestimmung der Dimension umgestellt.
    Der dimension-tag ist nun draußen.

    In Verbindung mit den neuen Zeilenauswahlparametern kann man übrigens Headerzeilen und sowas ignorieren.

    Bei deiner Testdatei z.B könnte daher folgendes die Weiterverarbeitung wohl vereinfachen: _xlsx_2Array("text.xlsx", 1, 5)


    Edit 2: Ach und weil ich gerade sehe, dass du Datumswerte mit drin hast - die kannst du im Nachhinein mit der bereits enthaltenen aber etwas versteckten Funktion __xlsxExcel2Date() in ein normales Datum umrechnen.

  • Auch von mir ein großes Dankeschön für dieses Funktionspaket :thumbup:.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."