Excel Parser
Syntax
$input.parseExcel()
Beschreibung
Liest die eingegebene Excel-Datei und erzeugt daraus eine Datenstruktur. Hierbei wird der Sheetname als Schlüssel für die Map verwendet. Die zugehörigen Listen ergeben sich aus den Inhalten des Sheets. Standardmäßig wird das erste Sheet importiert, aber Sie können auch alle Sheets, das aktive Sheet oder bestimmte Sheets nach Index oder Namen auswählen.
Parameter
| Name | Typ | Beschreibung | Pflicht | Default |
|---|---|---|---|---|
| input | Binärwert | Excel Datei (.xls bzw. .xlsx). | ja | - |
| importAllSheets | Boolean | Ob alle Sheets aus der Datei importiert werden sollen. | Nein | false |
| importSheets | List |
Liste von Sheets, die importiert werden sollen. Zulässig sind Sheetnamen als Strings und/oder Sheetpositionen in der Datei (beginnend mit 0). Zum Beispiel werden bei der Eingabe importSheets : [0, "1", "Tabelle2"] das erste Sheet und die Sheets mit den Namen "1" bzw. "Tabelle2" importiert. |
Nein | null |
| headers | Map / List |
Map mit Sheetnamen als Schlüssel und Positionen der Header im Sheet als Wert. Als zulässiger Wert sind einzelne Positionen oder Bereiche (z.B: "B2:F2") bzw. eine Liste von Positionen und/oder Bereichen erlaubt. Wenn man keinen Sheetnamen angibt, so wird der angegebene Wert (z.B Liste von Bereichen) für alle Sheets als Header verwendet. |
Nein | null |
| importActiveSheet | Boolean |
Ob das aktive Sheet importiert werden soll. Das aktive Sheet ist, das zu letzt bearbeitete und gespeicherte Sheet, welche auch (zu mindest in Windows) beim öffnen der Excel-Datei dann direkt angezeigt wird. |
Nein | false |
| raw | Boolean |
Ob die Funktion die Rohdaten als Liste von Zeilen zurückliefern soll, wobei jede Zeile als Liste von Spaltenwerten dargestellt wird. Wenn Im Falle |
Nein | false |
| evaluateFormulas | Boolean |
Ob Formeln in der Excel-Datei ausgewertet werden sollen. Wenn |
Nein | true |
Rückgabewert
Typ: Map<Object, List> / eine Liste
- Pro Zeile wird eine Liste (bei
raw:true) oder eine Map (beiraw:false) mit Spaltenwerten erzeugt - Diese Zeilen-Objekte werden pro Sheet in einer Liste zusammengefasst
- Pro Sheet wird ein Map-Eintrag mit Sheetname/Sheetnummer als Schlüssel und der Liste als Wert erzeugt
- Wird nur ein Sheet geparst, dann wird nur die entsprechende Liste zurückgegeben (keine Map mit einem Eintrag)
Hinweise zum Verhalten
Die Priorität der Parameter ist wie folgt:
- Wenn
importAllSheets:trueist, werden alle verfügbaren Sheets importiert, unabhängig von den anderen Parametern. - Wenn
importAllSheets:falseundimportSheetsnicht leer ist, werden nur die inimportSheetsangegebenen Sheets importiert. - Wenn
importAllSheets:false,importSheetsleer ist undimportActiveSheet:trueist, wird das aktive Sheet importiert. - Wenn
importAllSheets:false,importSheetsleer ist undimportActiveSheet:falseist, wird das erste Sheet importiert.
Der Standardfall (ohne Parameter) entspricht Fall 4: Es wird das erste Sheet importiert.
Header-Spezifikation:
Die Header können auf verschiedene Arten definiert werden:
- Einzelne Zelle: z.B. "A1", "B2" - Importiert den Wert an dieser Position als Header
- Zellbereich: z.B. "A1:C1" - Importiert alle Werte in diesem Bereich als Header
- Übergeordneter Header: z.B. "A1->B2:C2" - Verwendet den Wert von A1 als übergeordneten Header für die Werte in B2 bis C2
Der Schlüssel "all" kann verwendet werden, um die Header-Definitionen auf alle Sheets anzuwenden:
headers: {"all": ["B2:F2"]}
Man kann die Header auch als eine Liste angeben. In diesem Fall wird die Header-Definitionen auf alle Sheets angewendet:
headers: ["B2:F2"]
headers: {
"all": ["A1", "B1:C1"], // für allen anderen Sheets
0: ["A2", "B2"] // für das Sheet mit Index 0
}
headers: {
"Sheet1": ["A1", "B1:C1"],
0: ["A2", "B2"] // für das Sheet mit Index 0
}
Beispiele
Im Folgenden wird der Aufbau einer Beispiel-Excel-Datei beschrieben. Die Datei hat drei Sheets: "Test", "0" und "Vergleich". Sheet "0" ist das aktive Sheet.
Ferner sei Angenommen, dass diese Datei in einer Variablen importedData bereits gespeichert ist.
Beispiel 1: Standard-Import des ersten Sheets
{
...
$importedData.parseExcel();
}
Ausgabe:
{
"0": [
{
"A": "",
"B": "",
"C": "",
"D": "",
"E": "",
"F": "",
"G": "",
"H": "",
"I": "",
"J": "",
"K": "",
"L": ""
},
{
"A": "",
"B": "Date",
"C": "Integer",
"D": "Float",
"E": "Percent",
"F": "Währung",
"G": "",
"H": "",
"I": "I2",
"J": "",
"K": "",
"L": ""
},
{
"A": "",
"B": "Thu Aug 01 00:00:00 CEST 2024",
"C": 120.0,
"D": 12.85,
"E": 0.1070833,
"F": 5.35,
"G": "",
"H": "",
"I": "",
"J": "J3",
"K": "",
"L": ""
},
{
"A": "",
"B": "Fri Aug 02 00:00:00 CEST 2024",
"C": 200.0,
"D": 20.2,
"E": "0.101",
"F": 5.05,
"G": "",
"H": "",
"I": "",
"J": "",
"K": "K4",
"L": ""
},
{
"A": "",
"B": "Sat Aug 03 00:00:00 CEST 2024",
"C": 300.0,
"D": 66.6,
"E": 0.222,
"F": 11.1,
"G": "",
"H": "",
"I": "",
"J": "",
"K": "",
"L": "L5"
},
{
"A": "",
"B": "",
"C": "",
"D": "",
"E": "",
"F": "",
"G": "",
"H": "",
"I": "",
"J": "",
"K": "",
"L": ""
},
{
"A": "",
"B": "Summe",
"C": 620.0,
"D": 99.65,
"E": 0.4300833,
"F": 21.5,
"G": "",
"H": "",
"I": "I7",
"J": "J7",
"K": "K7",
"L": "L7"
}
]
}
Beim Aufruf von $importedData.parseExcel() wird das erste Sheet der Excel-Datei importiert. Hierbei wird zuerst eine Liste von Headern erzeugt. Die Breite der Spalten entsprechen dem längsten Spaltennamen. Anschließend werden die Einträge aus den Spalten entsprechend gemappt, wobei fehlenden Einträge mit leeren Strings aufgefüllt werden. Bei verbundenen Zellen (hier B1 - C1) wird der Wert für den kleinsten Spaltennamen eingetragen. Da
Beispiel 2: Import eines spezifischen Sheets nach Index
{
...
$importedData.parseExcel(importSheets: 1);
}
Ausgabe:
[
{
"A": "",
"B": "Verbundene Zellen",
"C": "",
"D": ""
},
{
"A": "A2",
"B": "B2",
"C": "C2",
"D": "D2"
},
{
"A": "A3",
"B": "B3",
"C": "C3",
"D": "D3"
},
{
"A": "A4",
"B": "B4",
"C": "C4",
"D": "D4"
}
]
Beispiel 3: Import mehrerer Sheets
{
...
$importedData.parseExcel(importSheets: [0, "0"]);
}
Ausgabe: {0=[...], "0"=[...]}
Hier wird beim Aufruf von parseExcel() angegeben, dass das erste Sheet und das Sheet mit den Namen 0 importiert werden sollen.
Beispiel 4: Import mit komplexen Header-Definitionen
{
...
$importedData.parseExcel(importSheets: "Vergleich",
headers:{"Vergleich": ["C3", "D3", "E3->E4:F4", "G3->G4:H4"]});
}
Ausgabe:
{
"Vergleich": [
{
"Aktuelles Jahr": {
"Ausgaben": "W15",
"Einnahmen": "W14"
},
"Vorjahr": {
"Ausgaben": "W13_2",
"Einnahmen": "W13_1"
},
"H1": "W11",
"H2": "W12"
},
{
"Aktuelles Jahr": {
"Ausgaben": "",
"Einnahmen": "W24"
},
"Vorjahr": {
"Ausgaben": "",
"Einnahmen": "W23_1"
},
"H1": "W21",
"H2": "W22"
},
{
"Aktuelles Jahr": {
"Ausgaben": "W35",
"Einnahmen": ""
},
"Vorjahr": {
"Ausgaben": "W33_2",
"Einnahmen": ""
},
"H1": "W31",
"H2": "W32"
},
{
"Aktuelles Jahr": {
"Ausgaben": "",
"Einnahmen": "W44"
},
"Vorjahr": {
"Ausgaben": "",
"Einnahmen": ""
},
"H1": "",
"H2": "W42"
},
{
"Aktuelles Jahr": {
"Ausgaben": "",
"Einnahmen": ""
},
"Vorjahr": {
"Ausgaben": "W53_2",
"Einnahmen": "W53_1"
},
"H1": "",
"H2": ""
}
]
}
Hier wird beim Aufruf von parseExcel() angegeben, dass das Sheet mit den Namen "Vergleich" importiert werden sollen und die Header in diesem Sheet auf Positionen C3, D3, E3 (als Hauptheader) mit Unterheader E4 und F4, G3 (als Hauptheader) mit Unterheader G4 und H4 zu finden sind. Nun werden alle Zeilen ab der fünften Zeile und nur die Spalten C bis H importiert und entsprechend gemappt.
Beispiel 5: Import mit Header-Bereich
{
...
$importedData.parseExcel(importSheets: "Test",
headers:{"Test": "B2:F2"});
}
Ausgabe:
{
"Test": [
{
"Integer": 120.0,
"Float": 12.85,
"Percent": 0.1070833,
"Währung": 5.35,
"Date": "Thu Aug 01 00:00:00 CEST 2024"
},
{
"Integer": 200.0,
"Float": 20.2,
"Percent": 0.101,
"Währung": 5.05,
"Date": "Fri Aug 02 00:00:00 CEST 2024"
},
{
"Integer": 300.0,
"Float": 66.6,
"Percent": 0.222,
"Währung": 11.1,
"Date": "Sat Aug 03 00:00:00 CEST 2024"
},
{
"Integer": "",
"Float": "",
"Percent": "",
"Währung": "",
"Date": ""
},
{
"Integer": 620.0,
"Float": 99.65,
"Percent": 0.4300833,
"Währung": 21.5,
"Date": "Summe"
}
]
}
Hier wird beim Aufruf von parseExcel() angegeben, dass das Sheet mit den Namen "Test" importiert werden sollen und die Header in diesem Sheet auf den Positionen B2 bis F2 zu finden sind. Nun werden alle Zeilen ab der dritten Zeile und nur die Spalten B bis F importiert und entsprechend gemappt.
Beispiel 6: Import mit Rohdaten
{
...
$importedData.parseExcel(importSheets: "Test", raw:true);
}
Ausgabe:
{
"Test": [
[],
[
null,
"Date",
"Integer",
"Float",
"Percent",
"Währung",
null,
null,
"I2"
],
[
null,
"Thu Aug 01 00:00:00 CEST 2024",
120.0,
12.85,
0.1070833,
5.35,
null,
null,
null,
"J3"
],
[
null,
"Fri Aug 02 00:00:00 CEST 2024",
200.0,
20.2,
0.101,
5.05,
null,
null,
null,
null,
"K4"
],
[
null,
"Sat Aug 03 00:00:00 CEST 2024",
300.0,
66.6,
0.222,
11.1,
null,
null,
null,
null,
null,
"L5"
],
[],
[
null,
"Summe",
620.0,
99.65,
0.4300833,
21.5,
null,
null,
"I7",
"J7",
"K7",
"L7"
]
]
}
Der Aufruf von parseExcel(importSheers: "Test", raw:true) liefert eine Map von Listen von Listen für das Sheet "Test".
Beispiel 7: Import mit Formelauswertung
In diesem Beispiel zeigt die Excel-Datei eine einfache Tabelle mit drei Spalten:
- Spalte A enthält feste Werte (10, 15, 20)
- Spalte B enthält Formeln, die den Wert aus Spalte A verdoppeln (=A2*2, =A3*2, =A4*2)
- Spalte C enthält Formeln, die die Werte aus Spalte A und B addieren (=A2+B2, =A3+B3, =A4+B4)
{
// Mit Formelauswertung (Standard)
$importedData.parseExcel(importSheets: "Formeln",
headers:{"Formeln": ["A1", "B1", "C1"]});
}
Ausgabe:
{
"Formeln": [
{
"Wert": 10,
"Formel": 20,
"Summe": 30
},
{
"Wert": 15,
"Formel": 30,
"Summe": 45
},
{
"Wert": 20,
"Formel": 40,
"Summe": 60
}
]
}
Mit evaluateFormulas:true werden die Formeln ausgewertet und die berechneten Ergebnisse zurückgegeben.
{
// Ohne Formelauswertung
$importedData.parseExcel(importSheets: "Formeln",
headers:{"Formeln": ["A1", "B1", "C1"]},
evaluateFormulas: false);
}
Ausgabe:
{
"Formeln": [
{
"Wert": 10,
"Formel": "=A2*2",
"Summe": "=A2+B2"
},
{
"Wert": 15,
"Formel": "=A3*2",
"Summe": "=A3+B3"
},
{
"Wert": 20,
"Formel": "=A4*2",
"Summe": "=A4+B4"
}
]
}
Mit evaluateFormulas:false werden die Formeln selbst als Text zurückgegeben.