🧩.xlsm · .xlsb · .xltx
Alle drei sind ZIP-Pakete wie die .xlsx – sie unterscheiden sich im Content-Type des Hauptteils und darin, was im Paket liegen darf.
🧾Der Unterschied steht in [Content_Types].xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"><Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/><Default Extension="xml" ContentType="application/xml"/><Default Extension="bin" ContentType="application/vnd.ms-office.vbaProject"/><Override PartName="/xl/workbook.xml" ContentType="application/vnd.ms-excel.sheet.macroEnabled.main+xml"/><Override PartName="/xl/worksheets/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/><Override PartName="/xl/sharedStrings.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml"/><Override PartName="/xl/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"/><Override PartName="/xl/theme/theme1.xml" ContentType="application/vnd.openxmlformats-officedocument.theme+xml"/><Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml"/><Override PartName="/docProps/app.xml" ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml"/></Types>
Gelb: Zeilen, die sich gegenüber der normalen .xlsx unterscheiden. Die Dateiendung allein reicht nicht – Excel prüft den Content-Type des Hauptteils.
📚 Quelle: ECMA-376 Teil 1 §18 und Teil 2; [MS-OFFMACRO] (makrofähige Office-Dateien, vbaProject-Beziehung); [MS-XLSB] (Paketteile); geprüfte Content-Types siehe Tests.
⚙️.xlsm – Makros in vbaProject.bin
umsatz.xlsm (ZIP)
├─ [Content_Types].xml Hauptteil: application/vnd.ms-excel.sheet.macroEnabled.main+xml
├─ xl/workbook.xml
├─ xl/_rels/workbook.xml.rels
│ └─ Type=".../office/2006/relationships/vbaProject" Target="vbaProject.bin"
└─ xl/vbaProject.bin ◄── wieder ein Compound File (D0 CF 11 E0 …)!
├─ PROJECT, PROJECTwm Projekteigenschaften (Text)
└─ VBA/
├─ dir Modulverzeichnis (komprimiert)
├─ _VBA_PROJECT Versions-/P-Code-Infos
└─ Modul1, DieseArbeitsmappe … Quelltext (MS-OVBA-komprimiert) + P-Codeolevba umsatz.xlsm (oletools) – es entpackt den Quelltext, ohne ihn auszuführen._VBA_PROJECT_CUR neben dem Stream „Workbook“. In .xlsm wurde genau dieses Compound File als vbaProject.bin ins ZIP gelegt.📚 Quelle: [MS-OVBA] (VBA-Projektstruktur, Kompression); [MS-XLS] (Storage _VBA_PROJECT_CUR); oletools-Dokumentation (olevba).
🧱.xlsb – BIFF12, Records mit variabler Länge
umsatz.xlsb (ZIP – gleiche Paketstruktur wie .xlsx) ├─ [Content_Types].xml Hauptteil: application/vnd.ms-excel.sheet.binary.macroEnabled.main ├─ xl/workbook.bin BrtBeginBook … BrtBundleSh (Blätter) … BrtEndBook ├─ xl/worksheets/sheet1.bin BrtBeginSheet · BrtWsDim · BrtBeginSheetData · BrtRowHdr · BrtCell… · … ├─ xl/sharedStrings.bin BrtBeginSst · BrtSSTItem… · BrtEndSst └─ xl/styles.bin
Kopf: FD 04 C8 01 (4 Byte). Zum Vergleich BIFF8: immer genau 4 Byte, Länge höchstens 8224.
Typ 129 (81 01) · Größe 0 (00)
Klammer-Record ohne Daten
Zellen-Records tragen nur die Spalte – die Zeile kommt aus dem vorangehenden BrtRowHdr. Texte liegen wie bei .xlsx in einer Shared String Table (xl/sharedStrings.bin).
pyxlsb.📚 Quelle: [MS-XLSB] 2.1.4 Record (Kodierung von Typ und Größe, Beispiel BrtCommentText 637/200), 2.3 Record Enumeration, BrtRowHdr, Struktur Cell.