Powrót do strony głównej

WebAssembly SQL dla Excela i Parquet w przeglądarce

Artykuł opisuje silnik C++ SQL na WebAssembly do parsowania Excela, CSV, Parquet w przeglądarce. Workbook montuje pliki jako wirtualne tabele z obsługą JOIN. Podane przykłady API, metadane i scenariusze użycia dla analizy offline.

C++ SQL w przeglądarce: parsowanie Parquet i Excela na WebAssembly
Advertisement 728x90

# Analiza SQL Excela, CSV i Parquet w przeglądarce na C++ i WebAssembly

WebAssembly pozwala uruchamiać kod C++17 do parsowania danych tabelarycznych bezpośrednio w przeglądarce. Rozwiązanie oparte na excel_loader zapewnia wirtualizację plików jako tabel SQL: XLSX, Parquet, CSV są montowane bez pełnego ładowania do pamięci. To eliminuje blokowanie UI i wycieki pamięci w bibliotekach JS, zachowując prywatność danych na urządzeniu użytkownika.

Architektura łączy rdzeń C++ z interoperacją Emscripten i powłoką JS. Silnik rozpoznaje format po sygnaturze blob, obsługuje JOIN między heterogenicznymi plikami w jednym Workbook.

Architektura: od parsowania do zapytań SQL

Rdzeń C++ excel_loader obsługuje parsowanie za pomocą natywnych bibliotek, buduje wirtualne tabele i planuje zapytania. Emscripten eksportuje klasy ExcelLoaderEngine, Workbook, QueryResult do JS. Warstwa kliencka przekazuje ArrayBuffer z inputu i otrzymuje wynik JSON.

Google AdInline article slot

Workbook — centralna abstrakcja: kontener dla kilku plików jako jednej bazy danych. Obsługiwane formaty:

  • 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

Automatyczne rozpoznawanie formatu ułatwia integrację: frontend przekazuje Uint8Array bez wstępnego przetwarzania.

Praktyczna implementacja API

Inicjalizacja WASM i ładowanie pliku wymaga minimum kodu. Silnik sam rozpoznaje 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;

Wykonanie zapytania SQL na zamontowanym pliku:

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);
}

Dla projektów wieloplikowych używany jest manifest JSON:

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

Metadane i wydajność

Metoda getStats() zwraca strukturę danych bez wykonywania zapytań:

Google AdInline article slot
{
    "name": "sheet1$",
    "displayName": "Otchet_Prodazhi",
    "fileName": "report_final.xlsx",
    "type": "excel-sheet",
    "rows": 15400,
    "columns": 24,
    "memoryUsage": "..."
}

Operacje In-Memory w C++ minimalizują narzut w porównaniu z V8. Parquet jest odczytywany efektywnie dzięki strukturom kolumnowym i wektoryzacji.

Kluczowe zalety wydajnościowe:

  • Brak blokowania UI przy parsowaniu plików 50+ MB
  • JOIN między XLSX i CSV bez serwera
  • Minimalne zużycie pamięci w porównaniu z alternatywami JS (SheetJS, AlaSQL)
  • Praca offline z metadanymi dla UI

Zastosowanie w rozwoju

Rozwiązanie nadaje się dla programistów frontend i fullstack na poziomie middle/senior.

  • Local-First dashboardy: Pełna analiza offline bez przekazywania danych
  • Walidacja kliencka: Reguły SQL do sprawdzania plików przed uploadem
  • Konwertery: Parquet → filtr SQL → JSON/CSV w przeglądarce
  • Rozszerzenia edytorów biurowych: SQL po komórkach w wersjach webowych

Co ważne

  • Wirtualne tabele montują pliki bez pełnego ładowania do RAM
  • Automatyczne rozpoznawanie 15+ formatów po sygnaturze blob
  • Workbook obsługuje JOIN heterogenicznych źródeł jako jednej bazy danych
  • C++ przez WASM przewyższa JS prędkością na dużych zbiorach danych
  • Pełna prywatność: dane nie opuszczają przeglądarki

— Editorial Team

Advertisement 728x90

Czytaj dalej