hucre

Nom du projet en grandes lettres sur fond sombre, entouré d'une grille de tableur, de lignes CSV, de formules et d'un graphique en barres

XLSX, ODS et CSV dans un paquet npm sans dépendance

hucre lit et écrit des classeurs XLSX et ODS, du CSV, du JSON, du NDJSON et du XML, et lit aussi les formats binaires XLS et XLSB. Le paquet est écrit en TypeScript sans aucune dépendance, et son cœur n'appelle ni fs, ni crypto, ni Buffer. Le même code produit ou lit un fichier Excel sous Node 24 et plus, Bun, dans un navigateur, un Cloudflare Worker ou une Vercel Edge Function.

Écriture en flux et retouche des classeurs à l'octet près

  • Chaque format a son point d'entrée (hucre/xlsx, hucre/csv, hucre/ods, hucre/json, hucre/xml). Le README mesure 3,7 Ko gzippés pour le CSV seul et 129 Ko pour tout le paquet, et la CI échoue dès qu'une de ces tailles dépasse son budget.
  • writeXlsxStream tire ses lignes d'un itérable, un curseur de base de données par exemple, et renvoie un ReadableStream. Sa mémoire suit le nombre de styles distincts, pas celui des lignes : le banc d'essai du dépôt plafonne à 67 Mo de tas pour un million de lignes.
  • openXlsx et saveXlsx recopient à l'identique chaque partie que hucre ne régénère pas, si bien que graphiques, macros VBA et thèmes survivent à une retouche. Le chemin readXlsx puis writeXlsx reconstruit au contraire le classeur et perd ce que son modèle ne décrit pas, macros comprises.
  • Les classeurs protégés par mot de passe (chiffrement Agile d'Excel 2010 et suivants) se lisent et s'écrivent avec WebCrypto.
  • validateWithSchema convertit les types, applique required, pattern, min, max, enum ou des validateurs maison, et range à part les erreurs, chacune avec sa ligne, son champ et sa valeur.
  • La ligne de commande npx hucre convertit, inspecte et valide un fichier, y compris depuis l'entrée standard.

Formules laissées à Excel, XLS et XLSB en lecture seule

hucre ne calcule aucune formule. Il écrit la formule et, si on la lui fournit, sa valeur en cache, mais chaque classeur produit demande à Excel de tout recalculer à l'ouverture : une valeur passée dans formulaResult ne sert qu'aux autres outils. La feuille de route range le moteur de formules parmi ce qui n'est pas encore implémenté.

XLS et XLSB se lisent sans s'écrire, et seules leurs valeurs passent. Les lecteurs rendent noms de feuilles, valeurs, dates et cellules fusionnées. Une conversion en XLSX fige donc chaque formule en valeur, perd styles et dimensions et rend visibles les feuilles masquées (docs/PARITY.md du dépôt).

L'ODS ne porte que six propriétés de style : gras, italique, taille et couleur de police, couleur de fond, format numérique. Un XLSX converti en ODS perd sans avertissement ses bordures, ses largeurs de colonnes, ses volets figés et ses validations.

La lecture en flux reste gourmande quand les chaînes varient. streamXlsxRows charge d'abord toute la table des chaînes partagées. Sur 100 000 lignes de 12 colonnes, le README relève 556 Mo avec 400 000 chaînes distinctes contre 90 Mo avec 10 : un export de noms ou de références produits tombe dans le premier cas.

Le projet se compare lui-même à SheetJS et à ExcelJS. Son README rappelle que SheetJS a quitté npm et réserve le style à son offre payante, et qu'ExcelJS tire neuf dépendances et ne livre que du CommonJS.

La version 1.3.0 est sortie le 26 octobre 2026. La 1.0.0 du 4 août a fait de l'API publique un engagement de stabilité, dont seul le point d'entrée hucre/ooxml est exclu. Le dépôt compte treize versions, la première (0.1.0) en mars 2026. Le README désigne le dépôt GitHub et le paquet npm hucre comme seules sources officielles : le site hucre.dev n'a aucun lien avec le projet.