# SQL analýza Excelu, CSV a Parquet v prohlížeči na C++ a WebAssembly
WebAssembly umožňuje spouštět kód C++17 pro parsování tabulkových dat přímo v prohlížeči. Řešení na bázi excel_loader zajišťuje virtualizaci souborů jako SQL tabulek: XLSX, Parquet, CSV se namontují bez úplného načtení do paměti. To eliminuje blokování UI a úniky paměti v JS knihovnách, přičemž zachovává soukromí dat na zařízení uživatele.
Architektura kombinuje C++ jádro s Emscripten interopem a JS wrapperem. Engine detekuje formát podle signatury blobu, podporuje JOIN mezi heterogenními soubory v jednom Workbooku.
Architektura: od parsování k SQL dotazům
C++ jádro excel_loader zpracovává parsování s nativními knihovnami, staví virtuální tabulky a plánuje dotazy. Emscripten exportuje třídy ExcelLoaderEngine, Workbook, QueryResult do JS. Klientní vrstva předává ArrayBuffer z inputu a vrací JSON výsledek.
Workbook — centrální abstrakce: kontejner pro více souborů jako jedinou DB. Podpora formátů:
- Excel/Office: XLSX, XLSB, XLS, ODS
- Flat Files: CSV, TSV, TXT
- Columnar/BigData: Parquet, DuckDB, ORC, AVRO
- Legacy DB: SQLite, DBF, MDB, ACCDB
- NoSQL/Docs: JSON, JSONL, XML, HTML
Autodetekce formátu usnadňuje integraci: frontend předá Uint8Array bez předzpracování.
Praktická implementace API
Inicializace WASM a načtení souboru vyžaduje minimální kód. Engine sám rozpozná typ.
// 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;
Vykonání SQL dotazu na namontovaném souboru:
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);
}
Pro multifájlové projekty se používá JSON manifest:
// 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 ...
Metadat a výkon
Metoda getStats() vrací strukturu dat bez provedení dotazů:
{
"name": "sheet1$",
"displayName": "Otchet_Prodazhi",
"fileName": "report_final.xlsx",
"type": "excel-sheet",
"rows": 15400,
"columns": 24,
"memoryUsage": "..."
}
In-Memory operace v C++ minimalizují overhead oproti V8. Parquet se čte efektivně díky kolonárním strukturám a vektorizaci.
Klíčové výhody ve výkonu:
- Žádné blokování UI při parsování souborů 50+ MB
- JOIN mezi XLSX a CSV bez serveru
- Minimální spotřeba paměti oproti JS alternativám (SheetJS, AlaSQL)
- Offline práce s metadaty pro UI
Použití ve vývoji
Řešení je vhodné pro middle/senior vývojáře frontendu a fullstacku.
- Local-First dashboardy: Plně offline analýza bez přenosu dat
- Klientní validace: SQL pravidla pro kontrolu souborů před nahráním
- Konvertory: Parquet → SQL filtr → JSON/CSV v prohlížeči
- Rozšíření kancelářských editorů: SQL podle buněk ve webových verzích
Co je důležité
- Virtuální tabulky namontují soubory bez úplného načtení do RAM
- Autodetekce 15+ formátů podle signatury blobu
- Workbook podporuje JOIN heterogenních zdrojů jako jedinou DB
- C++ přes WASM překonává JS v rychlosti na velkých datasetech
- Plné soukromí: data neopouštějí prohlížeč
— Editorial Team
Zatím žádné komentáře.