Zpět na domů

WebAssembly SQL pro Excel a Parquet v prohlížeči

Článek popisuje C++ SQL motor na WebAssembly pro parsování Excel, CSV, Parquet v prohlížeči. Workbook namapuje soubory jako virtuální tabulky s podporou JOIN. Uvedeny příklady API, metadata a scénáře použití pro offline analýzu.

C++ SQL v prohlížeči: parsování Parquet a Excel na WebAssembly
Advertisement 728x90

# 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.

Google AdInline article slot

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.

Google AdInline article slot
// 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ů:

Google AdInline article slot
{
    "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

Advertisement 728x90

Číst dál