Analyse SQL d'Excel, CSV et Parquet dans le navigateur avec C++ et WebAssembly
WebAssembly permet d'exécuter du code C++17 pour analyser des données tabulaires directement dans le navigateur. La solution basée sur excel_loader virtualise les fichiers en tant que tables SQL : XLSX, Parquet et CSV sont montés sans les charger entièrement en mémoire. Cela élimine le blocage de l'interface utilisateur et les fuites mémoire courantes dans les bibliothèques JS, tout en gardant les données utilisateur privées sur leur appareil.
L'architecture combine un cœur en C++ avec l'interop Emscripten et un wrapper JS. Le moteur détecte le format à partir de la signature du blob et supporte les JOIN entre fichiers hétérogènes dans un seul Workbook.
Architecture : Du parsing aux requêtes SQL
Le cœur en C++ d'excel_loader gère l'analyse avec des bibliothèques natives, construit des tables virtuelles et planifie les requêtes. Emscripten exporte les classes ExcelLoaderEngine, Workbook et QueryResult vers JS. La couche client passe un ArrayBuffer depuis l'entrée et reçoit des résultats JSON.
Workbook est l'abstraction centrale : un conteneur pour plusieurs fichiers traités comme une seule base de données. Formats supportés :
- Excel/Office : XLSX, XLSB, XLS, ODS
- Fichiers plats : CSV, TSV, TXT
- Fichiers colonnaires/BigData : Parquet, DuckDB, ORC, AVRO
- Bases de données legacy : SQLite, DBF, MDB, ACCDB
- NoSQL/Documents : JSON, JSONL, XML, HTML
La détection automatique du format simplifie l'intégration : le frontend passe un Uint8Array sans aucun prétraitement.
Implémentation pratique de l'API
L'initialisation du module WASM et le chargement d'un fichier nécessitent un code minimal. Le moteur détecte automatiquement le type.
// 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;
Exécution d'une requête SQL sur le fichier monté :
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);
}
Pour les projets multi-fichiers, utilisez un manifeste 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 ...
Métadonnées et performances
La méthode getStats() retourne des structures de données sans exécuter de requêtes :
{
"name": "sheet1$",
"displayName": "Otchet_Prodazhi",
"fileName": "report_final.xlsx",
"type": "excel-sheet",
"rows": 15400,
"columns": 24,
"memoryUsage": "..."
}
Les opérations en mémoire en C++ minimisent la surcharge par rapport à V8. Les lectures Parquet sont efficaces grâce aux structures columnaire et à la vectorisation.
Avantages clés en performances :
- Pas de blocage de l'interface utilisateur lors de l'analyse de fichiers de plus de 50 Mo
- JOINs entre XLSX et CSV sans serveur
- Utilisation mémoire minimale par rapport aux alternatives JS (SheetJS, AlaSQL)
- Accès aux métadonnées hors ligne pour l'interface utilisateur
Applications en développement
Cette solution est idéale pour les développeurs frontend et fullstack intermédiaires/seniors.
- Dashboards local-first : Analytique entièrement hors ligne sans envoyer les données nulle part
- Validation côté client : Règles SQL pour vérifier les fichiers avant envoi
- Convertisseurs : Parquet → filtre SQL → JSON/CSV directement dans le navigateur
- Extensions d'éditeurs Office : Requêtes SQL sur les cellules dans les versions web
Points clés
- Les tables virtuelles montent les fichiers sans les charger entièrement en RAM
- Détection automatique de plus de 15 formats à partir des signatures blob
- Workbook supporte les JOINs sur des sources hétérogènes comme une seule base de données
- C++ via WASM surpasse JS sur les gros ensembles de données
- Confidentialité totale : les données ne quittent jamais le navigateur
— Editorial Team
Aucun commentaire pour le moment.