# SQL-Analyse von Excel, CSV und Parquet im Browser mit C++ und WebAssembly
WebAssembly ermöglicht das Ausführen von C++17-Code zum Parsen tabellarischer Daten direkt im Browser. Die auf excel_loader basierende Lösung virtualisiert Dateien als SQL-Tabellen: XLSX, Parquet und CSV werden gemountet, ohne sie vollständig in den Speicher zu laden. Dadurch entfallen UI-Blockierungen und Speicherlecks, die in JS-Bibliotheken üblich sind, und die Benutzerdaten bleiben privat auf dem Gerät.
Die Architektur kombiniert einen C++-Kern mit Emscripten-Interop und einem JS-Wrapper. Der Engine erkennt das Format anhand der Blob-Signatur und unterstützt JOINs zwischen heterogenen Dateien in einem einzigen Workbook.
Architektur: Vom Parsing zu SQL-Abfragen
Der C++-Kern von excel_loader übernimmt das Parsing mit nativen Bibliotheken, baut virtuelle Tabellen auf und plant Abfragen. Emscripten exportiert die Klassen ExcelLoaderEngine, Workbook und QueryResult nach JS. Die Client-Schicht übergibt einen ArrayBuffer aus der Eingabe und erhält JSON-Ergebnisse.
Workbook ist die zentrale Abstraktion: ein Container für mehrere Dateien, die als einzige Datenbank behandelt werden. Unterstützte Formate:
- Excel/Office: XLSX, XLSB, XLS, ODS
- Flache Dateien: CSV, TSV, TXT
- Spaltenorientiert/BigData: Parquet, DuckDB, ORC, AVRO
- Legacy-DBs: SQLite, DBF, MDB, ACCDB
- NoSQL/Dokumente: JSON, JSONL, XML, HTML
Die automatische Format-Erkennung vereinfacht die Integration: Das Frontend übergibt einen Uint8Array ohne Vorverarbeitung.
Praktische API-Implementierung
Die Initialisierung des WASM-Moduls und das Laden einer Datei erfordert minimalen Code. Die Engine erkennt den Typ automatisch.
// Initialization WASM-modulya
const module = await ExcelLoaderModule();
const engine = new module.ExcelLoaderEngine();
// Poluchaem file from standartnogo input
const fileInput = document.getElementById("fileUploader");
const file = fileInput.files[0];
const arrayBuffer = await file.arrayBuffer();
// Otkryvaem file how Workbook
const workbook = engine.openSingleFile(
file.name,
new Uint8Array(arrayBuffer)
);
window.currentWorkbook = workbook;
Ausführung einer SQL-Abfrage auf der gemounteten Datei:
const sql = "SELECT * FROM 'Sheet1' WHERE Amount > 1000 ORDER BY Date DESC LIMIT 10";
try {
const result = window.currentWorkbook.executeQuery(sql);
const data = result.toJSON();
console.table(data);
} catch (e) {
console.error("SQL Error:", e);
}
Für Multi-File-Projekte ein JSON-Manifest verwenden:
// manifest.json
{
"files": [
{ "name": "data_2023.parquet", "alias": "History" },
{ "name": "new_orders.csv", "alias": "Current" }
]
}
const workbook = openProjectFromManifest(engine, manifestJson, fileBuffers);
// Dostupno: SELECT * FROM History JOIN Current ...
Metadaten und Performance
Die Methode getStats() liefert Datenstrukturen ohne Abfragen auszuführen:
{
"name": "sheet1$",
"displayName": "Otchet_Prodazhi",
"fileName": "report_final.xlsx",
"type": "excel-sheet",
"rows": 15400,
"columns": 24,
"memoryUsage": "..."
}
In-Memory-Operationen in C++ minimieren den Overhead im Vergleich zu V8. Parquet liest effizient dank spaltenorientierter Strukturen und Vektorisierung.
Wichtige LeistungsVorteile:
- Keine UI-Blockierung beim Parsen von 50+ MB-Dateien
- JOINs zwischen XLSX und CSV ohne Server
- Minimaler Speicherverbrauch im Vergleich zu JS-Alternativen (SheetJS, AlaSQL)
- Offline-Metadatenzugriff für die UI
Anwendungen in der Entwicklung
Diese Lösung eignet sich ideal für Middle-/Senior-Frontend- und Fullstack-Entwickler.
- Local-First-Dashboards: Vollständig offline Analytics ohne Datenübertragung
- Clientseitige Validierung: SQL-Regeln zum Prüfen von Dateien vor dem Upload
- Converter: Parquet → SQL-Filter → JSON/CSV direkt im Browser
- Office-Editor-Erweiterungen: SQL-Abfragen auf Zellen in Webversionen
Wichtige Punkte
- Virtuelle Tabellen mounten Dateien ohne vollständiges Laden in den RAM
- Automatische Erkennung von 15+ Formaten anhand von Blob-Signaturen
- Workbook unterstützt JOINs über heterogene Quellen als einzige Datenbank
- C++ über WASM übertrifft JS bei großen Datensätzen
- Volle Privatsphäre: Daten verlassen nie den Browser
— Editorial Team
Noch keine Kommentare.