Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
xlsx — SheetJS xlsx 0.18.5 fork with CVE-2023-30533 and CVE-2024-22363 fixes | Kitploit
Outils/GitHubGitHub/weareu/xlsx
General Purpose UtilitiesEncryption/Decryption ToolsData RecoveryUtilities & Frameworks
GitHubweareu/xlsx

xlsx

SheetJS xlsx 0.18.5 fork with CVE-2023-30533 and CVE-2024-22363 fixes

Voir le dépôt
il y a 6 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

SheetJS

La version Community de SheetJS propose des solutions open-source éprouvées pour extraire des données exploitables de presque tous les tableurs complexes et générer de nouvelles feuilles de calcul compatibles avec les logiciels anciens et modernes.

SheetJS Pro offre des solutions au-delà du traitement des données : modifiez facilement des modèles complexes ; libérez votre Picasso intérieur avec le style ; créez des feuilles personnalisées avec des images/graphiques/tableaux croisés dynamiques ; évaluez des expressions de formules et portez des calculs vers des applications web ; automatisez les tâches courantes des tableurs, et bien plus encore !

Licence Statut de build Vulnérabilités Snyk Téléchargements npm Analytiques

Matrice de test et de support pour navigateurs

Statut de build

Formats de fichiers supportés

graphe circulaire des formats supportés

légende du graphe

Table des matières

Développer pour afficher la table des matières
  • Démarrage
    • Installation
    • Utilisation
    • La philosophie Zen de SheetJS
    • Démos pour l'écosystème JS
  • Acquisition et extraction de données
    • Analyse des classeurs
    • Traitement des données JSON et JS
    • Traitement des tableaux HTML
  • Traitement des données
    • Modification de la structure du classeur
    • Modification des valeurs de cellules
    • Modification d'autres propriétés de feuille / classeur / cellule
  • Conditionnement et publication des données
    • Écriture des classeurs
    • Exemples d'écriture
    • Écriture en flux
    • Génération de données JSON et JS
    • Génération de tableaux HTML
    • Génération d'instantanés de feuille unique
  • Interface
    • Fonctions d'analyse
    • Fonctions d'écriture
    • Utilitaires
  • Format de tableur commun
    • Structures générales
    • Objet cellule
      • Types de données
      • Dates
    • Objets feuille
      • Objet feuille de calcul
      • Objet graphique
      • Objet macro
      • Objet boîte de dialogue

Démarrage

Installation

Scripts autonomes pour navigateur

La compilation autonome complète pour navigateur est enregistrée dans dist/xlsx.full.min.js et peut être directement ajoutée à une page avec une balise script :```html

root@kitploit:~
<details>
  <summary><b>Disponibilité CDN</b> (cliquez pour afficher)</summary>

|    CDN     | URL                                        |
|-----------:|:-------------------------------------------|
|    `unpkg` | <https://unpkg.com/xlsx/>                  |
| `jsDelivr` | <https://jsdelivr.com/package/npm/xlsx>    |
|    `CDNjs` | <https://cdnjs.com/libraries/xlsx>         |

Par exemple, `unpkg` met la dernière version à disposition à l'adresse :```html
<script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script>
Compilations pour navigateur (cliquez pour afficher)

La version complète en un seul fichier est générée à dist/xlsx.full.min.js

dist/xlsx.core.min.js omet la bibliothèque de pages de codes (pas de prise en charge des encodages XLS)

Une compilation plus légère est générée à dist/xlsx.mini.min.js. Comparé à la compilation complète :

  • bibliothèque de pages de codes omise (pas de prise en charge des encodages XLS)
  • pas de prise en charge pour XLSB / XLS / Lotus 1-2-3 / SpreadsheetML 2003 / Numbers
  • utilitaires de flux node supprimés

Avec bower :```bash $ bower install js-xlsx

root@kitploit:~
**ECMAScript Modules**

La version ECMAScript Module est sauvegardée dans `xlsx.mjs` et peut être directement ajoutée à une page avec une balise `script` utilisant `type=module`:```html
<script type="module">
import { read, writeFileXLSX } from "./xlsx.mjs";

/* load the codepage support library for extended support with older formats  */
import { set_cptable } from "./xlsx.mjs";
import * as cptable from './dist/cpexcel.full.mjs';
set_cptable(cptable);
</script>

Le paquet npm expose également le module avec le paramètre module, pris en charge dans Angular et autres projets :```ts import { read, writeFileXLSX } from "xlsx";

/* load the codepage support library for extended support with older formats */ import { set_cptable } from "xlsx"; import * as cptable from 'xlsx/dist/cpexcel.full.mjs'; set_cptable(cptable);

root@kitploit:~
**Deno**

`xlsx.mjs` peut être importé dans Deno.  Il est disponible depuis `unpkg`:```ts
// @deno-types="https://unpkg.com/xlsx/types/index.d.ts"
import * as XLSX from 'https://unpkg.com/xlsx/xlsx.mjs';

/* load the codepage support library for extended support with older formats  */
import * as cptable from 'https://unpkg.com/xlsx/dist/cpexcel.full.mjs';
XLSX.set_cptable(cptable);

NodeJS

Avec npm:```bash $ npm install xlsx

root@kitploit:~
Par défaut, le module supporte `require`:```js
var XLSX = require("xlsx");

Le module est également livré avec xlsx.mjs pour une utilisation avec import :```js import * as XLSX from 'xlsx/xlsx.mjs';

/* load 'fs' for readFile and writeFile support */ import * as fs from 'fs'; XLSX.set_fs(fs);

/* load 'stream' for stream support */ import { Readable } from 'stream'; XLSX.stream.set_readable(Readable);

/* load the codepage support library for extended support with older formats */ import * as cpexcel from 'xlsx/dist/cpexcel.full.mjs'; XLSX.set_cptable(cpexcel);

root@kitploit:~
**Photoshop et InDesign**

`dist/xlsx.extendscript.js` est une version ExtendScript pour Photoshop et InDesign qui est incluse dans le package `npm`.  Elle peut être directement référencée avec une directive `#include` :```extendscript
#include "xlsx.extendscript.js"
Internet Explorer et compatibilité ECMAScript 3 (cliquer pour afficher)

Pour une large compatibilité avec les moteurs JavaScript, la bibliothèque est écrite en utilisant le dialecte ECMAScript 3 ainsi que certaines fonctionnalités ES5 comme Array#forEach. Les navigateurs plus anciens nécessitent des shims pour fournir les fonctions manquantes.

Pour utiliser le shim, ajoutez le shim avant la balise script qui charge xlsx.js :```html

root@kitploit:~
Le script inclut également `IE_LoadFile` et `IE_SaveFile` pour charger et enregistrer des fichiers dans les versions 6 à 9 d'Internet Explorer. Le script `xlsx.extendscript.js` regroupe le shim dans un format adapté à Photoshop et autres produits Adobe.

</details>

### Utilisation

La plupart des scénarios impliquant des feuilles de calcul et des données peuvent être décomposés en 5 parties :

1) **Acquérir des données** :  Les données peuvent être stockées n'importe où : fichiers locaux ou distants, bases de données, TABLEAU HTML, ou même générées par programmation dans le navigateur web.

2) **Extraire des données** :  Pour les fichiers de feuille de calcul, cela implique l'analyse des octets bruts pour lire les données des cellules. Pour les données JS générales, cela implique une restructuration des données.

3) **Traiter les données** :  De la génération de statistiques récapitulatives au nettoyage des enregistrements de données, cette étape est le cœur du problème.

4) **Packager les données** :  Cela peut impliquer la création d'une nouvelle feuille de calcul ou la sérialisation avec `JSON.stringify` ou l'écriture de XML ou simplement l'aplatissement des données pour les outils d'interface utilisateur.

5) **Publier les données** :  Les fichiers de feuille de calcul peuvent être téléchargés vers un serveur ou écrits localement. Les données peuvent être présentées aux utilisateurs dans un TABLEAU HTML ou une grille de données.

Un problème courant consiste à générer une exportation valide de feuille de calcul à partir de données stockées dans un tableau HTML. Dans cet exemple, un tableau HTML présent sur la page sera récupéré, une ligne sera ajoutée en bas avec la date du rapport, et un nouveau fichier sera généré et téléchargé localement. `XLSX.writeFile` se charge de packager les données et de tenter un téléchargement local :

```javascript
/* get first worksheet */
var ws = XLSX.utils.table_to_sheet(document.getElementById('tableau'));
/* add data at the end */
XLSX.utils.sheet_add_aoa(ws, [["Créé le ", new Date().toISOString()]], {origin: -1});
/* create workbook */
var wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, "Feuille1");
/* export */
XLSX.writeFile(wb, "Rapport.xlsx");
``````js
// Acquire Data (reference to the HTML table)
var table_elt = document.getElementById("my-table-id");

// Extract Data (create a workbook object from the table)
var workbook = XLSX.utils.table_to_book(table_elt);

// Process Data (add a new row)
var ws = workbook.Sheets["Sheet1"];
XLSX.utils.sheet_add_aoa(ws, [["Created "+new Date().toISOString()]], {origin:-1});

// Package and Release Data (`writeFile` tries to write and save an XLSB file)
XLSX.writeFile(workbook, "Report.xlsb");
Télécharger l’outil
  • Objet classeur
    • Propriétés du fichier classeur
  • Attributs au niveau du classeur
    • Noms définis
    • Vues du classeur
    • Propriétés diverses du classeur
  • Fonctionnalités du document
    • Formules
    • Propriétés des lignes et colonnes
    • Formats de nombre
    • Hyperliens
    • Commentaires de cellule
    • Visibilité des feuilles
    • VBA et macros
  • Options d'analyse
    • Type d'entrée
    • Deviner le type de fichier
  • Options d'écriture
    • Formats de sortie supportés
    • Type de sortie
  • Fonctions utilitaires
    • Entrée tableau de tableaux
    • Entrée tableau d'objets
    • Entrée tableau HTML
    • Sortie de formules
    • Sortie séparée par délimiteur
      • Texte Unicode UTF-16
    • Sortie HTML
    • JSON
  • Formats de fichiers
  • Tests
    • Node
    • Navigateur
    • Environnements testés
    • Fichiers de test
  • Contribuer
    • OSX/Linux
    • Windows
    • Tests
  • Licence
  • Références
  • Cette bibliothèque tente de simplifier les étapes 2 et 4 avec des fonctions pour extraire des données utiles à partir de fichiers de feuilles de calcul (read / readFile) et générer de nouveaux fichiers de feuilles de calcul à partir de données (write / writeFile). Des fonctions utilitaires supplémentaires comme table_to_book fonctionnent avec d'autres sources de données courantes, telles que les tableaux HTML.

    Cette documentation et divers projets de démonstration couvrent un certain nombre de scénarios et d'approches courants pour les étapes 1 et 5.

    Les fonctions utilitaires aident à l'étape 3.

    "Acquérir et extraire des données" décrit des solutions pour les scénarios courants d'importation de données.

    "Conditionner et publier des données" décrit des solutions pour les scénarios courants d'exportation de données.

    "Traiter des données" décrit des solutions pour les scénarios courants de traitement et de manipulation de classeurs.

    "Fonctions utilitaires" détaille les fonctions utilitaires pour traduire les tableaux JSON et autres structures JS courantes en objets de feuille de calcul.

    Le Zen de SheetJS

    Le traitement des données doit s'adapter à n'importe quel flux de travail

    La bibliothèque n'impose pas de cycle de vie distinct. Elle s'intègre facilement dans les sites web et les applications construits avec n'importe quel framework. Les objets de données JS simples fonctionnent bien avec les Web Workers et les API futures.

    JavaScript est un langage puissant pour le traitement des données

    Le "Format de feuille de calcul courant" est une représentation objet simple des concepts fondamentaux d'un classeur. Les différentes fonctions de la bibliothèque fournissent des outils de bas niveau pour travailler avec cet objet.

    Pour un traitement JS convivial, il existe des fonctions utilitaires pour convertir des parties d'une feuille de calcul en/à partir d'un tableau de tableaux. L'exemple suivant combine des méthodes puissantes de tableau JS avec une bibliothèque de requêtes réseau pour télécharger des données, sélectionner les informations souhaitées et créer un fichier de classeur :

    Obtenir des données à partir d'un point de terminaison JSON et générer un classeur (cliquez pour afficher)

    L'objectif est de générer un classeur XLSB contenant les noms et les dates de naissance des présidents des États-Unis.

    Acquérir des données

    Données brutes

    https://theunitedstates.io/congress-legislators/executive.json contient les données souhaitées. Par exemple, John Adams :```js { "id": { /* (data omitted) / }, "name": { "first": "John", // <-- first name "last": "Adams" // <-- last name }, "bio": { "birthday": "1735-10-19", // <-- birthday "gender": "M" }, "terms": [ { "type": "viceprez", / (other fields omitted) / }, { "type": "viceprez", / (other fields omitted) / }, { "type": "prez", / (other fields omitted) */ } // <-- look for "prez" ] }

    root@kitploit:~
    _Filtrage pour les Présidents_
    
    Le jeu de données inclut Aaron Burr, un Vice-Président qui n'a jamais été Président !
    
    `Array#filter` crée un nouveau tableau avec les lignes souhaitées.  Un Président a servi
    au moins un mandat avec `type` défini sur `"prez"`.  Pour tester si une ligne particulière a
    au moins un mandat `"prez"`, `Array#some` est une autre fonction native JS.  Le
    filtre complet serait :```js
    const prez = raw_data.filter(row => row.terms.some(term => term.type === "prez"));
    

    Lining up the data

    Pour cet exemple, le nom sera le prénom combiné avec le nom de famille (row.name.first + " " + row.name.last) et la date de naissance sera le sous-champ row.bio.birthday. En utilisant Array#map, l'ensemble de données peut être traité en un seul appel :```js const rows = prez.map(row => ({ name: row.name.first + " " + row.name.last, birthday: row.bio.birthday }));

    root@kitploit:~
    Le résultat est un tableau d'objets "simples" sans imbrication :```js
    [
      { name: "George Washington", birthday: "1732-02-22" },
      { name: "John Adams", birthday: "1735-10-19" },
      // ... one row per President
    ]
    

    Extraire les données

    Avec le jeu de données nettoyé, XLSX.utils.json_to_sheet génère une feuille de calcul :```js const worksheet = XLSX.utils.json_to_sheet(rows);

    root@kitploit:~
    `XLSX.utils.book_new` crée un nouveau classeur et `XLSX.utils.book_append_sheet`
    ajoute une feuille de calcul au classeur. La nouvelle feuille de calcul s'appellera "Dates" :```js
    const workbook = XLSX.utils.book_new();
    XLSX.utils.book_append_sheet(workbook, worksheet, "Dates");
    

    Process Data

    Correction des en-têtes

    Par défaut, json_to_sheet crée une feuille de calcul avec une ligne d'en-tête. Dans ce cas, les en-têtes proviennent des clés de l'objet JS : "name" et "birthday".

    Les en-têtes se trouvent dans les cellules A1 et B1. XLSX.utils.sheet_add_aoa peut écrire des valeurs textuelles dans la feuille de calcul existante à partir de la cellule A1 :```js XLSX.utils.sheet_add_aoa(worksheet, [["Name", "Birthday"]], { origin: "A1" });

    root@kitploit:~
    _Correction des largeurs de colonnes_
    
    Certains noms sont plus longs que la largeur de colonne par défaut.  Les largeurs de colonnes sont
    définies en [définissant la propriété `"!cols"` de la feuille de calcul](#row-and-column-properties).
    
    La ligne suivante définit la largeur de la colonne A à environ 10 caractères :```js
    worksheet["!cols"] = [ { wch: 10 } ]; // set column A width to 10 characters
    

    Un appel Array#reduce sur rows peut calculer la largeur maximale :```js const max_width = rows.reduce((w, r) => Math.max(w, r.name.length), 10); worksheet["!cols"] = [ { wch: max_width } ];

    root@kitploit:~
    Remarque : Si le point de départ était un fichier ou un tableau HTML, `XLSX.utils.sheet_to_json` générera un tableau d'objets JS.
    
    **Données du paquet et de la version**
    
    `XLSX.writeFile` crée un fichier de feuille de calcul et tente de l'écrire sur le système. Dans le navigateur, il tentera de demander à l'utilisateur de télécharger le fichier. Dans NodeJS, il écrira dans le répertoire local.```js
    XLSX.writeFile(workbook, "Presidents.xlsx");
    

    Exemple complet```js // Uncomment the next line for use in NodeJS: // const XLSX = require("xlsx"), axios = require("axios");

    (async() => { /* fetch JSON data and parse */ const url = "https://theunitedstates.io/congress-legislators/executive.json"; const raw_data = (await axios(url, {responseType: "json"})).data;

    /* filter for the Presidents */ const prez = raw_data.filter(row => row.terms.some(term => term.type === "prez"));

    /* flatten objects */ const rows = prez.map(row => ({ name: row.name.first + " " + row.name.last, birthday: row.bio.birthday }));

    /* generate worksheet and workbook */ const worksheet = XLSX.utils.json_to_sheet(rows); const workbook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(workbook, worksheet, "Dates");

    /* fix headers */ XLSX.utils.sheet_add_aoa(worksheet, [["Name", "Birthday"]], { origin: "A1" });

    /* calculate column width */ const max_width = rows.reduce((w, r) => Math.max(w, r.name.length), 10); worksheet["!cols"] = [ { wch: max_width } ];

    /* create an XLSX file and try to save to Presidents.xlsx */ XLSX.writeFile(workbook, "Presidents.xlsx"); })();

    root@kitploit:~
    Pour une utilisation dans le navigateur web, en supposant que l'extrait soit sauvegardé sous `snippet.js`, des balises script devraient être utilisées pour inclure les versions autonomes de `axios` et `xlsx` :```html
    <script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script src="snippet.js"></script>
    

    Les formats de fichiers sont des détails d'implémentation

    L'analyseur couvre un large éventail de formats de fichiers de feuilles de calcul courants pour garantir que les fichiers "HTML-enregistré-en-XLS" fonctionnent aussi bien que les fichiers XLS ou XLSX réels.

    L'écrivain prend en charge un certain nombre de formats de sortie courants pour une large compatibilité avec l'écosystème de données.

    Dans la mesure du possible, le code de traitement des données ne devrait pas avoir à se soucier des formats de fichiers spécifiques impliqués.

    Démonstrations de l'écosystème JS

    Le répertoire demos contient des exemples de projets pour :

    Frameworks et API

    • angularjs
    • angular et ionic
    • knockout
    • meteor
    • react et react-native
    • vue 2.x et weex
    • XMLHttpRequest et fetch
    • serveur nodejs
    • bases de données et magasins clé/valeur
    • tableaux typés et mathématiques

    Regroupeurs et outils

    • browserify
    • fusebox
    • parcel
    • requirejs
    • rollup
    • systemjs
    • typescript
    • webpack 2.x

    Plateformes et intégrations

    • deno
    • application electron
    • application nw.js
    • extensions Chrome / Chromium
    • Télécharger une feuille Google localement
    • Adobe ExtendScript
    • Navigateurs sans tête
    • canvas-datagrid
    • x-spreadsheet
    • react-data-grid
    • vue3-table-light
    • Swift JSC et autres moteurs
    • fonctions "serverless"
    • internet explorer

    D'autres exemples sont inclus dans la vitrine.

    https://sheetjs.com/demos/modify.html montre un exemple complet de lecture, modification et écriture de fichiers.

    https://github.com/SheetJS/sheetjs/blob/HEAD/bin/xlsx.njs est l'outil en ligne de commande inclus avec les installations node, lisant les fichiers de feuilles de calcul et exportant le contenu dans divers formats.

    Acquisition et extraction des données

    Analyse des classeurs

    API

    Extraire les données des octets d'une feuille de calcul```js var workbook = XLSX.read(data, opts);

    root@kitploit:~
    La méthode `read` peut extraire des données à partir d'octets de feuille de calcul stockés dans une chaîne JS, une "chaîne binaire", un buffer NodeJS ou un tableau typé (`Uint8Array` ou `ArrayBuffer`).
    
    _Lire les octets d'une feuille de calcul à partir d'un fichier local et extraire les données_```js
    var workbook = XLSX.readFile(filename, opts);
    

    La méthode readFile tente de lire un fichier tableur à partir du chemin fourni. Les navigateurs n'autorisent généralement pas la lecture de fichiers de cette manière (cela est considéré comme un risque de sécurité), et les tentatives de lecture de fichiers de cette manière lèveront une erreur.

    Le second argument opts est facultatif. "Options d'analyse" couvre les propriétés et comportements pris en charge.

    Exemples

    Voici quelques scénarios courants (cliquez sur chaque sous-titre pour voir le code) :

    Fichier local dans un serveur NodeJS (cliquez pour afficher)

    readFile utilise fs.readFileSync en interne :```js var XLSX = require("xlsx");

    var workbook = XLSX.readFile("test.xlsx");

    root@kitploit:~
    Pour Node ESM, l'assistant `readFile` n'est pas activé. À la place, `fs.readFileSync` doit être utilisé pour lire les données du fichier sous forme de `Buffer` pour utilisation avec `XLSX.read` :```js
    import { readFileSync } from "fs";
    import { read } from "xlsx/xlsx.mjs";
    
    const buf = readFileSync("test.xlsx");
    /* buf is a Buffer */
    const workbook = read(buf);
    
    Fichier local dans une application Deno (cliquez pour afficher)

    readFile utilise Deno.readFileSync en interne :```js // @deno-types="https://deno.land/x/sheetjs/types/index.d.ts" import * as XLSX from 'https://deno.land/x/sheetjs/xlsx.mjs'

    const workbook = XLSX.readFile("test.xlsx");

    root@kitploit:~
    Applications reading files must be invoked with the `--allow-read` flag.  The
    [`deno` demo](https://github.com/weareu/xlsx/blob/HEAD/demos/deno/) has more examples
    
    </details>
    
    <details>
      <summary><b>Fichier soumis par l'utilisateur dans une page web (« Glisser-déposer »)</b> (cliquez pour afficher)</summary>
    
    Pour les sites web modernes ciblant Chrome 76+, `File#arrayBuffer` est recommandé :```js
    // XLSX is a global from the standalone script
    
    async function handleDropAsync(e) {
      e.stopPropagation(); e.preventDefault();
      const f = e.dataTransfer.files[0];
      /* f is a File */
      const data = await f.arrayBuffer();
      /* data is an ArrayBuffer */
      const workbook = XLSX.read(data);
    
      /* DO SOMETHING WITH workbook HERE */
    }
    drop_dom_element.addEventListener("drop", handleDropAsync, false);
    

    Pour une compatibilité maximale, l'API FileReader doit être utilisée :```js function handleDrop(e) { e.stopPropagation(); e.preventDefault(); var f = e.dataTransfer.files[0]; /* f is a File / var reader = new FileReader(); reader.onload = function(e) { var data = e.target.result; / reader.readAsArrayBuffer(file) -> data will be an ArrayBuffer */ var workbook = XLSX.read(data);

    root@kitploit:~
    /* DO SOMETHING WITH workbook HERE */
    

    }; reader.readAsArrayBuffer(f); } drop_dom_element.addEventListener("drop", handleDrop, false);

    root@kitploit:~
    <https://oss.sheetjs.com/sheetjs/> démontre la technique FileReader.
    
    </details>
    
    <details>
      <summary><b>Fichier soumis par l'utilisateur avec un élément HTML INPUT</b> (cliquez pour afficher)</summary>
    
    En commençant par un élément HTML INPUT avec `type="file"` :```html
    <input type="file" id="input_dom_element">
    

    Pour les sites web modernes ciblant Chrome 76+, Blob#arrayBuffer est recommandé:```js // XLSX is a global from the standalone script

    async function handleFileAsync(e) { const file = e.target.files[0]; const data = await file.arrayBuffer(); /* data is an ArrayBuffer */ const workbook = XLSX.read(data);

    /* DO SOMETHING WITH workbook HERE */ } input_dom_element.addEventListener("change", handleFileAsync, false);

    root@kitploit:~
    Pour une compatibilité plus large (y compris IE10+), l'approche `FileReader` est recommandée :```js
    function handleFile(e) {
      var file = e.target.files[0];
      var reader = new FileReader();
      reader.onload = function(e) {
        var data = e.target.result;
        /* reader.readAsArrayBuffer(file) -> data will be an ArrayBuffer */
        var workbook = XLSX.read(e.target.result);
    
        /* DO SOMETHING WITH workbook HERE */
      };
      reader.readAsArrayBuffer(file);
    }
    input_dom_element.addEventListener("change", handleFile, false);
    

    Le oldie démo montre un scénario de repli compatible IE.

    Récupération d'un fichier dans le navigateur web ("Ajax") (click to show)

    Pour les sites web modernes ciblant Chrome 42+, fetch est recommandé :```js // XLSX is a global from the standalone script

    (async() => { const url = "http://oss.sheetjs.com/test_files/formula_stress_test.xlsx"; const data = await (await fetch(url)).arrayBuffer(); /* data is an ArrayBuffer */ const workbook = XLSX.read(data);

    /* DO SOMETHING WITH workbook HERE */ })();

    root@kitploit:~
    Pour une compatibilité plus large, l'approche `XMLHttpRequest` est recommandée :```js
    var url = "http://oss.sheetjs.com/test_files/formula_stress_test.xlsx";
    
    /* set up async GET request */
    var req = new XMLHttpRequest();
    req.open("GET", url, true);
    req.responseType = "arraybuffer";
    
    req.onload = function(e) {
      var workbook = XLSX.read(req.response);
    
      /* DO SOMETHING WITH workbook HERE */
    };
    
    req.send();
    

    La xhr démo inclut une discussion plus longue et plus d'exemples.

    http://oss.sheetjs.com/sheetjs/ajax.html montre des approches de repli pour IE6+.

    Fichier local dans un plugin PhotoShop ou InDesign (cliquez pour afficher)

    readFile encapsule la logique File dans Photoshop et d'autres cibles ExtendScript. Le chemin spécifié doit être un chemin absolu :```js #include "xlsx.extendscript.js"

    /* Read test.xlsx from the Documents folder */ var workbook = XLSX.readFile(Folder.myDocuments + "/test.xlsx");

    root@kitploit:~
    La [démo `extendscript`](https://github.com/weareu/xlsx/blob/HEAD/demos/extendscript/) inclut un exemple plus complexe.
    
    </details>
    
    <details>
      <summary><b>Fichier local dans une application Electron</b> (cliquer pour afficher)</summary>
    
    `readFile` peut être utilisé dans le processus de rendu :```js
    /* From the renderer process */
    var XLSX = require("xlsx");
    
    var workbook = XLSX.readFile(path);
    

    Electron APIs have changed over time. The electron demo shows a complete example and details the required version-specific settings.

    Fichier local dans une application mobile avec React Native (cliquez pour afficher)

    La démo react inclut un exemple d'application React Native.

    Étant donné que React Native ne permet pas de lire des fichiers du système de fichiers, une bibliothèque tierce doit être utilisée. Les bibliothèques suivantes ont été testées :

    • react-native-file-access

    L'encodage base64 renvoie des chaînes compatibles avec le type base64 :```js import XLSX from "xlsx"; import { FileSystem } from "react-native-file-access";

    const b64 = await FileSystem.readFile(path, "base64"); /* b64 is a base64 string */ const workbook = XLSX.read(b64, {type: "base64"});

    root@kitploit:~
    - [`react-native-fs`](https://npm.im/react-native-fs)
    
    Le codage `ascii` renvoie des chaînes binaires compatibles avec le type `binary` :```js
    import XLSX from "xlsx";
    import { readFile } from "react-native-fs";
    
    const bstr = await readFile(path, "ascii");
    /* bstr is a binary string */
    const workbook = XLSX.read(bstr, {type: "binary"});
    
    Téléchargements de fichiers serveur NodeJS (cliquez pour afficher)

    read peut accepter un buffer NodeJS. readFile peut lire les fichiers générés par un analyseur de corps de requête HTTP POST comme formidable:```js const XLSX = require("xlsx"); const http = require("http"); const formidable = require("formidable");

    const server = http.createServer((req, res) => { const form = new formidable.IncomingForm(); form.parse(req, (err, fields, files) => { /* grab the first file */ const f = Object.entries(files)[0][1]; const path = f.filepath; const workbook = XLSX.readFile(path);

    root@kitploit:~
    /* DO SOMETHING WITH workbook HERE */
    

    }); }).listen(process.env.PORT || 7262);

    root@kitploit:~
    The [`server` demo](https://github.com/weareu/xlsx/blob/HEAD/demos/server) contains des exemples plus avancés.
    
    </details>
    
    <details>
      <summary><b>Télécharger des fichiers dans un processus NodeJS</b> (cliquez pour afficher)</summary>
    
    Node 17.5 et 18.0 offrent un support natif pour fetch :```js
    const XLSX = require("xlsx");
    
    const data = await (await fetch(url)).arrayBuffer();
    /* data is an ArrayBuffer */
    const workbook = XLSX.read(data);
    

    Pour une compatibilité plus large, des modules tiers sont recommandés.

    request nécessite un encodage null pour produire des Buffers :```js var XLSX = require("xlsx"); var request = require("request");

    request({url: url, encoding: null}, function(err, resp, body) { var workbook = XLSX.read(body);

    /* DO SOMETHING WITH workbook HERE */ });

    root@kitploit:~
    [`axios`](https://npm.im/axios) fonctionne de la même manière dans le navigateur et dans NodeJS :```js
    const XLSX = require("xlsx");
    const axios = require("axios");
    
    (async() => {
      const res = await axios.get(url, {responseType: "arraybuffer"});
      /* res.data is a Buffer */
      const workbook = XLSX.read(res.data);
    
      /* DO SOMETHING WITH workbook HERE */
    })();
    
    Télécharger des fichiers dans une application Electron (cliquez pour afficher)

    Le module net dans le processus principal peut effectuer des requêtes HTTP/HTTPS vers des ressources externes. Les réponses doivent être concaténées manuellement en utilisant Buffer.concat :```js const XLSX = require("xlsx"); const { net } = require("electron");

    const req = net.request(url); req.on("response", (res) => { const bufs = []; // this array will collect all of the buffers res.on("data", (chunk) => { bufs.push(chunk); }); res.on("end", () => { const workbook = XLSX.read(Buffer.concat(bufs));

    root@kitploit:~
    /* DO SOMETHING WITH workbook HERE */
    

    }); }); req.end();

    root@kitploit:~
    </details>
    
    <details>
      <summary><b>Readable Streams in NodeJS</b> (cliquez pour afficher)</summary>
    
    Lorsqu'il s'agit de Readable Streams, l'approche la plus simple consiste à mettre en mémoire tampon le flux et à traiter l'ensemble à la fin :```js
    var fs = require("fs");
    var XLSX = require("xlsx");
    
    function process_RS(stream, cb) {
      var buffers = [];
      stream.on("data", function(data) { buffers.push(data); });
      stream.on("end", function() {
        var buffer = Buffer.concat(buffers);
        var workbook = XLSX.read(buffer, {type:"buffer"});
    
        /* DO SOMETHING WITH workbook IN THE CALLBACK */
        cb(workbook);
      });
    }
    
    ReadableStream dans le navigateur (cliquez pour afficher)

    Lorsqu'on traite avec ReadableStream, l'approche la plus simple est de mettre en mémoire tampon le flux et de traiter l'ensemble à la fin :```js // XLSX is a global from the standalone script

    async function process_RS(stream) { /* collect data */ const buffers = []; const reader = stream.getReader(); for(;;) { const res = await reader.read(); if(res.value) buffers.push(res.value); if(res.done) break; }

    /* concat */ const out = new Uint8Array(buffers.reduce((acc, v) => acc + v.length, 0));

    let off = 0; for(const u8 of arr) { out.set(u8, off); off += u8.length; }

    return out; }

    const data = await process_RS(stream); /* data is Uint8Array */ const workbook = XLSX.read(data);

    root@kitploit:~
    </details>
    
    Des exemples plus détaillés sont couverts dans les [démos incluses](https://github.com/weareu/xlsx/blob/HEAD/demos/)
    
    ### Traitement des données JSON et JS
    
    Les données JSON et JS représentent généralement des feuilles de calcul uniques.  Cette section utilisera quelques fonctions utilitaires pour générer des classeurs.
    
    _Créer un nouveau classeur_```js
    var workbook = XLSX.utils.book_new();
    

    La fonction utilitaire book_new crée un classeur vide sans feuilles de calcul.

    Les logiciels de tableur exigent généralement au moins une feuille de calcul et imposent cette exigence dans l'interface utilisateur. Cette bibliothèque impose l'exigence au moment de l'écriture, générant des erreurs si un classeur vide est passé aux fonctions d'écriture.

    API

    Créer une feuille de calcul à partir d'un tableau de tableaux de valeurs JS```js var worksheet = XLSX.utils.aoa_to_sheet(aoa, opts);

    root@kitploit:~
    La fonction utilitaire `aoa_to_sheet` parcourt un "array of arrays" dans l'ordre ligne-majeur, générant un objet de feuille de calcul. L'extrait suivant génère une feuille avec la cellule `A1` définie sur la chaîne `A1`, la cellule `B1` sur `B1`, etc:```js
    var worksheet = XLSX.utils.aoa_to_sheet([
      ["A1", "B1", "C1"],
      ["A2", "B2", "C2"],
      ["A3", "B3", "C3"]
    ]);
    

    "Array of Arrays Input" décrit la fonction et l'argument optionnel opts plus en détail.

    Créer une feuille de calcul à partir d'un tableau d'objets JS```js var worksheet = XLSX.utils.json_to_sheet(jsa, opts);

    root@kitploit:~
    La fonction utilitaire `json_to_sheet` parcourt un tableau d'objets JS dans l'ordre,
    générant un objet de feuille de calcul. Par défaut, elle génère une ligne d'en-tête et
    une ligne par objet dans le tableau. L'argument optionnel `opts` a des paramètres pour
    contrôler l'ordre des colonnes et la sortie d'en-tête.
    
    ["Entrée d'un tableau d'objets"](#entrée-dun-tableau-de-tableaux) décrit la fonction et
    l'argument optionnel `opts` plus en détail.
    
    **Exemples**
    
    ["La Zen de SheetJS"](#la-zen-de-sheetjs) contient un exemple détaillé "Obtenir des données
    d'un point de terminaison JSON et générer un classeur"
    
    [`x-spreadsheet`](https://github.com/myliang/x-spreadsheet) est une grille de données interactive
    pour prévisualiser et modifier des données structurées dans le navigateur web. La
    [démo `xspreadsheet`](https://github.com/weareu/xlsx/blob/HEAD/demos/xspreadsheet) inclut un script d'exemple avec la
    fonction `xtos` pour convertir d'un objet de données x-spreadsheet en classeur.
    <https://oss.sheetjs.com/sheetjs/x-spreadsheet> est une démo en direct.
    
    <details>
      <summary><b>Enregistrements d'une requête de base de données (SQL ou no-SQL)</b> (cliquez pour afficher)</summary>
    
    La [`démo database`](https://github.com/weareu/xlsx/blob/HEAD/demos/database/) inclut des exemples de travail avec
    des bases de données et des résultats de requêtes.
    
    </details>
    
    <details>
      <summary><b>Calculs numériques avec TensorFlow.js</b> (cliquez pour afficher)</summary>
    
    [`@tensorflow/tfjs`](https://github.com/weareu/xlsx/blob/HEAD/@tensorflow/tfjs) et d'autres bibliothèques attendent des données sous forme de tableaux simples,
    bien adaptés aux feuilles de calcul où chaque colonne est un vecteur de données. C'est
    la transposée de la façon dont la plupart des gens utilisent les tableurs, où chaque ligne est un vecteur.
    
    Lors de la récupération des données de `tfjs`, les points de données renvoyés sont stockés dans un tableau
    typé. Un tableau de tableaux peut être construit avec des boucles. `Array#unshift` peut
    ajouter une ligne de titre en préfixe avant la conversion :```js
    const XLSX = require("xlsx");
    const tf = require('@tensorflow/tfjs');
    
    /* suppose xs and ys are vectors (1D tensors) -> tfarr will be a typed array */
    const tfdata = tf.stack([xs, ys]).transpose();
    const shape = tfdata.shape;
    const tfarr = tfdata.dataSync();
    
    /* construct the array of arrays */
    const aoa = [];
    for(let j = 0; j < shape[0]; ++j) {
      aoa[j] = [];
      for(let i = 0; i < shape[1]; ++i) aoa[j][i] = tfarr[j * shape[1] + i];
    }
    /* add headers to the top */
    aoa.unshift(["x", "y"]);
    
    /* generate worksheet */
    const worksheet = XLSX.utils.aoa_to_sheet(aoa);
    

    La démo array montre un exemple complet.

    Traitement des tableaux HTML

    API

    Créer une feuille de calcul en extrayant un tableau HTML de la page```js var worksheet = XLSX.utils.table_to_sheet(dom_element, opts);

    root@kitploit:~
    La fonction utilitaire `table_to_sheet` prend un élément DOM TABLE et parcourt les lignes pour générer une feuille de calcul.  L'argument `opts` est facultatif.
    ["HTML Table Input"](#html-table-input) décrit la fonction plus en détail.
    
    _Créer un classeur en extrayant un tableau HTML dans la page_```js
    var workbook = XLSX.utils.table_to_book(dom_element, opts);
    

    La fonction utilitaire table_to_book suit la même logique que table_to_sheet. Après avoir généré une feuille de calcul, elle crée un classeur vide et y ajoute la feuille.

    L'argument options prend en charge les mêmes options que table_to_sheet, avec l'ajout d'une propriété sheet pour contrôler le nom de la feuille. Si la propriété est absente ou si aucune option n'est spécifiée, le nom par défaut Sheet1 est utilisé.

    Exemples

    Voici quelques scénarios courants (cliquez sur chaque sous-titre pour voir le code) :

    Élément TABLE HTML dans une page web (cliquez pour afficher)```html
    SheetJS
    1234567
    root@kitploit:~
    Plusieurs tableaux sur une page web peuvent être convertis en feuilles de calcul individuelles:```js
    /* create new workbook */
    var workbook = XLSX.utils.book_new();
    
    /* convert table "table1" to worksheet named "Sheet1" */
    var sheet1 = XLSX.utils.table_to_sheet(document.getElementById("table1"));
    XLSX.utils.book_append_sheet(workbook, sheet1, "Sheet1");
    
    /* convert table "table2" to worksheet named "Sheet2" */
    var sheet2 = XLSX.utils.table_to_sheet(document.getElementById("table2"));
    XLSX.utils.book_append_sheet(workbook, sheet2, "Sheet2");
    
    /* workbook now has 2 worksheets */
    

    Alternativement, le code HTML peut être extrait et analysé:```js var htmlstr = document.getElementById("tableau").outerHTML; var workbook = XLSX.read(htmlstr, {type:"string"});

    root@kitploit:~
    </details>
    
    <details>
      <summary><b>Extension Chrome/Chromium</b> (cliquez pour afficher)</summary>
    
    La [`chrome` demo](https://github.com/weareu/xlsx/blob/HEAD/demos/chrome/) montre un exemple complet et détaille les
    autorisations requises et autres paramètres.
    
    Dans une extension, il est recommandé de générer le classeur dans un script de contenu
    et de renvoyer l'objet à l'extension :```js
    /* in the worker script */
    chrome.runtime.onMessage.addListener(function(msg, sender, cb) {
      /* pass a message like { sheetjs: true } from the extension to scrape */
      if(!msg || !msg.sheetjs) return;
      /* create a new workbook */
      var workbook = XLSX.utils.book_new();
      /* loop through each table element */
      var tables = document.getElementsByTagName("table")
      for(var i = 0; i < tables.length; ++i) {
        var worksheet = XLSX.utils.table_to_sheet(tables[i]);
        XLSX.utils.book_append_sheet(workbook, worksheet, "Table" + i);
      }
      /* pass back to the extension */
      return cb(workbook);
    });
    
    Tableaux HTML côté serveur avec Headless Chrome (cliquez pour afficher)

    La démo headless inclut une démo complète pour convertir des fichiers HTML en classeurs XLSB. L'idée principale est d'ajouter le script à la page, d'analyser le tableau dans le contexte de la page, de générer un classeur base64 et de le renvoyer pour traitement ultérieur :```js const XLSX = require("xlsx"); const { readFileSync } = require("fs"), puppeteer = require("puppeteer");

    const url = https://sheetjs.com/demos/table;

    /* get the standalone build source (node_modules/xlsx/dist/xlsx.full.min.js) */ const lib = readFileSync(require.resolve("xlsx/dist/xlsx.full.min.js"), "utf8");

    (async() => { /* start browser and go to web page */ const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto(url, {waitUntil: "networkidle2"});

    /* inject library */ await page.addScriptTag({content: lib});

    /* this function s5s will be called by the script below, receiving the Base64-encoded file */ await page.exposeFunction("s5s", async(b64) => { const workbook = XLSX.read(b64, {type: "base64" });

    root@kitploit:~
    /* DO SOMETHING WITH workbook HERE */
    

    });

    /* generate XLSB file in webpage context and send back result / await page.addScriptTag({content: ` / call table_to_book on first table */ var workbook = XLSX.utils.table_to_book(document.querySelector("TABLE"));

    root@kitploit:~
    /* generate XLSX file */
    var b64 = XLSX.write(workbook, {type: "base64", bookType: "xlsb"});
    
    /* call "s5s" hook exposed from the node process */
    window.s5s(b64);
    

    `});

    /* cleanup */ await browser.close(); })();

    root@kitploit:~
    </details>
    
    <details>
      <summary><b>Tableaux HTML côté serveur avec WebKit sans tête</b> (cliquer pour afficher)</summary>
    
    La [démo `headless`](https://github.com/weareu/xlsx/blob/HEAD/demos/headless/) inclut une démonstration complète pour convertir des fichiers HTML en classeurs XLSB en utilisant [PhantomJS](https://phantomjs.org/). L'idée principale est d'ajouter le script à la page, d'analyser le tableau dans le contexte de la page, de générer un classeur `binary` et de le renvoyer pour un traitement ultérieur :```js
    var XLSX = require('xlsx');
    var page = require('webpage').create();
    
    /* this code will be run in the page */
    var code = [ "function(){",
      /* call table_to_book on first table */
      "var wb = XLSX.utils.table_to_book(document.body.getElementsByTagName('table')[0]);",
    
      /* generate XLSB file and return binary string */
      "return XLSX.write(wb, {type: 'binary', bookType: 'xlsb'});",
    "}" ].join("");
    
    page.open('https://sheetjs.com/demos/table', function() {
      /* Load the browser script from the UNPKG CDN */
      page.includeJs("https://unpkg.com/xlsx/dist/xlsx.full.min.js", function() {
        /* The code will return an XLSB file encoded as binary string */
        var bin = page.evaluateJavaScript(code);
    
        var workbook = XLSX.read(bin, {type: "binary"});
        /* DO SOMETHING WITH workbook HERE */
    
        phantom.exit();
      });
    });
    
    Tables HTML NodeJS sans navigateur (cliquez pour afficher)

    NodeJS n'inclut pas d'implémentation DOM et Puppeteer nécessite une lourde build Chromium. jsdom est une alternative légère :```js const XLSX = require("xlsx"); const { readFileSync } = require("fs"); const { JSDOM } = require("jsdom");

    /* obtain HTML string. This example reads from test.html / const html_str = fs.readFileSync("test.html", "utf8"); / get first TABLE element / const doc = new JSDOM(html_str).window.document.querySelector("table"); / generate workbook */ const workbook = XLSX.utils.table_to_book(doc);

    root@kitploit:~
    </details>
    
    ## Traitement des données
    
    Le ["Common Spreadsheet Format"](#common-spreadsheet-format) est une représentation simple sous forme d'objet des concepts fondamentaux d'un classeur. Les fonctions utilitaires travaillent avec cette représentation objet et sont conçues pour gérer les cas d'utilisation courants.
    
    ### Modification de la structure du classeur
    
    **API**
    
    _Ajouter une feuille de calcul à un classeur_```js
    XLSX.utils.book_append_sheet(workbook, worksheet, sheet_name);
    

    La fonction utilitaire book_append_sheet ajoute une feuille de calcul au classeur. Le troisième argument spécifie le nom souhaité de la feuille de calcul. Plusieurs feuilles de calcul peuvent être ajoutées à un classeur en appelant la fonction plusieurs fois. Si le nom de la feuille de calcul est déjà utilisé dans le classeur, une erreur sera levée.

    Ajouter une feuille de calcul à un classeur et trouver un nom unique```js var new_name = XLSX.utils.book_append_sheet(workbook, worksheet, name, true);

    root@kitploit:~
    Si le quatrième argument est `true`, la fonction commencera avec le nom de feuille de calcul spécifié. Si le nom de feuille existe dans le classeur, un nouveau nom de feuille de calcul sera choisi en trouvant la racine du nom et en incrémentant le compteur :```js
    XLSX.utils.book_append_sheet(workbook, sheetA, "Sheet2", true); // Sheet2
    XLSX.utils.book_append_sheet(workbook, sheetB, "Sheet2", true); // Sheet3
    XLSX.utils.book_append_sheet(workbook, sheetC, "Sheet2", true); // Sheet4
    XLSX.utils.book_append_sheet(workbook, sheetD, "Sheet2", true); // Sheet5
    

    Lister les noms des feuilles de calcul dans l'ordre des onglets```js var wsnames = workbook.SheetNames;

    root@kitploit:~
    La propriété `SheetNames` de l'objet workbook est une liste des noms de feuilles de calcul dans « l'ordre des onglets ». Les fonctions API examineront ce tableau.
    
    _Remplacer une feuille de calcul sur place_```js
    workbook.Sheets[sheet_name] = new_worksheet;
    

    La propriété Sheets de l'objet workbook est un objet dont les clés sont des noms et dont les valeurs sont des objets worksheet. En réaffectant une propriété de l'objet Sheets, l'objet worksheet peut être modifié sans perturber le reste de la structure du classeur.

    Exemples

    Ajouter une nouvelle feuille de calcul à un classeur (cliquer pour afficher)

    Cet exemple utilise XLSX.utils.aoa_to_sheet.```js var ws_name = "SheetJS";

    /* Create worksheet */ var ws_data = [ [ "S", "h", "e", "e", "t", "J", "S" ], [ 1 , 2 , 3 , 4 , 5 ] ]; var ws = XLSX.utils.aoa_to_sheet(ws_data);

    /* Add the worksheet to the workbook */ XLSX.utils.book_append_sheet(wb, ws, ws_name);

    root@kitploit:~
    </details>
    
    ### Modification des valeurs de cellule
    
    **API**
    
    _Modifier une seule valeur de cellule dans une feuille de calcul_```js
    XLSX.utils.sheet_add_aoa(worksheet, [[new_value]], { origin: address });
    

    Modifier plusieurs valeurs de cellules dans une feuille de calcul```js XLSX.utils.sheet_add_aoa(worksheet, aoa, opts);

    root@kitploit:~
    La fonction utilitaire `sheet_add_aoa` modifie les valeurs des cellules dans une feuille de calcul.  Le premier argument est l'objet de la feuille de calcul.  Le deuxième argument est un tableau de tableaux de valeurs.  La clé `origin` du troisième argument contrôle l'emplacement d'écriture des cellules.  L'extrait suivant définit `B3=1` et `E5="abc"` :```js
    XLSX.utils.sheet_add_aoa(worksheet, [
      [1],                             // <-- Write 1 to cell B3
      ,                                // <-- Do nothing in row 4
      [/*B5*/, /*C5*/, /*D5*/, "abc"]  // <-- Write "abc" to cell E5
    ], { origin: "B3" });
    

    "Entrée sous forme de tableau de tableaux" décrit la fonction et l'argument facultatif opts plus en détail.

    Options d'analyse

    Les fonctions exportées read et readFile acceptent un argument d'options :

    • Même si cellNF est faux, le texte formaté sera généré et sauvegardé dans .w
    • Dans certains cas, les feuilles peuvent être analysées même si bookSheets est faux.
    • Excel essaie agressivement d'interpréter les valeurs provenant de CSV et d'autres textes bruts. Cela provoque un comportement surprenant ! L'option raw supprime l'analyse des valeurs.
    • bookSheets et bookProps se combinent pour fournir les deux ensembles d'informations
    • Deps sera un objet vide si bookDeps est faux
    • Le comportement de bookFiles dépend du type de fichier :
      • tableau keys (chemins dans le ZIP) pour les formats basés sur ZIP
      • hachage files (mappage des chemins vers des objets représentant les fichiers) pour ZIP
      • objet cfb pour les formats utilisant des conteneurs CFB

    Type d'entrée

    Les chaînes peuvent être interprétées de plusieurs manières. Le paramètre type pour read indique à la bibliothèque comment analyser l'argument de données :

    Deviner le type de fichier

    Détails d'implémentation (cliquez pour afficher)

    Excel et autres outils de tableur lisent les premiers octets et appliquent d'autres heuristiques pour déterminer un type de fichier. Cela permet le punning de type de fichier : renommer les fichiers avec l'extension .xls indiquera à votre ordinateur d'utiliser Excel pour ouvrir le fichier mais Excel saura comment le gérer. Cette bibliothèque applique une logique similaire :

    Pourquoi des fichiers texte aléatoires sont-ils valides ? (cliquez pour afficher)

    Excel est extrêmement agressif dans la lecture des fichiers. Ajouter une extension XLS à n'importe quel fichier texte affiché (où les seuls caractères sont des caractères d'affichage ANSI) trompe Excel en lui faisant penser que le fichier est potentiellement un fichier CSV ou TSV, même s'il n'a qu'une seule colonne ! Cette bibliothèque tente de reproduire ce comportement.

    La meilleure approche est de valider la feuille de calcul souhaitée et de s'assurer qu'elle a le nombre attendu de lignes ou de colonnes. L'extraction de la plage est extrêmement simple :```js var range = XLSX.utils.decode_range(worksheet['!ref']); var ncols = range.e.c - range.s.c + 1, nrows = range.e.r - range.s.r + 1;

    root@kitploit:~
    </details>
    
    ## Options d'écriture
    
    Les fonctions exportées `write` et `writeFile` acceptent un argument d'options :
    
    | Nom de l'option |  Défaut | Description                                         |
    | :-------------- | ------: | :-------------------------------------------------- |
    |`type`           |          | Encodage des données de sortie (voir Type de sortie ci-dessous) |
    |`cellDates`      |  `false` | Stocke les dates sous le type `d` (par défaut `n`)  |
    |`bookSST`        |  `false` | Génère une table de chaînes partagées **            |
    |`bookType`       | `"xlsx"` | Type de classeur (voir ci-dessous pour les formats pris en charge) |
    |`sheet`          |     `""` | Nom de la feuille de calcul pour les formats à une seule feuille ** |
    |`compression`    |  `false` | Utilise la compression ZIP pour les formats basés sur ZIP ** |
    |`Props`          |          | Remplace les propriétés du classeur lors de l'écriture ** |
    |`themeXLSX`      |          | Remplace le XML du thème lors de l'écriture XLSX/XLSB/XLSM ** |
    |`ignoreEC`       |   `true` | Supprime les erreurs « nombre comme texte » **      |
    |`numbers`        |          | Charge utile pour l'exportation NUMBERS **          |
    
    - `bookSST` est plus lent et plus gourmand en mémoire, mais offre une meilleure compatibilité avec les anciennes versions d'iOS Numbers
    - Les données brutes sont les seules garanties d'être sauvegardées. Les fonctionnalités non décrites dans ce README peuvent ne pas être sérialisées.
    - `cellDates` ne s'applique qu'à la sortie XLSX et n'est pas garanti de fonctionner avec des lecteurs tiers. Excel lui-même n'écrit généralement pas de cellules de type `d`, donc les outils non-Excel peuvent ignorer les données ou générer une erreur en présence de dates.
    - `Props` est un objet reflétant le champ `Props` du classeur. Voir le tableau de la section [Propriétés du fichier classeur](#workbook-file-properties).
    - Si spécifié, la chaîne de `themeXLSX` sera sauvegardée comme thème principal pour les fichiers XLSX/XLSB/XLSM (vers `xl/theme/theme1.xml` dans le ZIP)
    - En raison d'un bug dans le programme, certaines fonctionnalités comme « Convertir en colonnes » planteront Excel sur les feuilles de calcul où les conditions d'erreur sont ignorées. L'écrivain marquera les fichiers pour ignorer l'erreur par défaut. Définissez `ignoreEC` à `false` pour supprimer cela.
    - En raison de la taille des données, les données NUMBERS ne sont pas incluses par défaut. Les scripts inclus `xlsx.zahl.js` et `xlsx.zahl.mjs` contiennent les données.
    
    ### Formats de sortie pris en charge
    

    Exemples

    Ajout de lignes à une feuille de calcul (cliquer pour afficher)

    La valeur spéciale d'origine -1 indique à sheet_add_aoa de commencer dans la colonne A de la ligne après la dernière ligne de la plage, en ajoutant les données :```js XLSX.utils.sheet_add_aoa(worksheet, [ ["first row after data", 1], ["second row after data", 2] ], { origin: -1 });

    root@kitploit:~
    </details>
    
    
    ### Modification des autres propriétés de feuille de calcul / classeur / cellule
    
    La section ["Common Spreadsheet Format"](#common-spreadsheet-format) décrit les structures d'objet plus en détail.
    
    ## Emballage et publication des données
    
    ### Écriture des classeurs
    
    **API**
    
    _Générer des octets de feuille de calcul (fichier) à partir des données_```js
    var data = XLSX.write(workbook, opts);
    

    La méthode write tente de regrouper les données du classeur dans un fichier en mémoire. Par défaut, des fichiers XLSX sont générés, mais cela peut être contrôlé avec la propriété bookType de l'argument opts. Selon l'option type, les données peuvent être stockées sous forme de « chaîne binaire », chaîne JS, Uint8Array ou Buffer.

    Le deuxième argument opts est requis. Options d'écriture couvre les propriétés et comportements pris en charge.

    Générer et tenter d'enregistrer le fichier```js XLSX.writeFile(workbook, filename, opts);

    root@kitploit:~
    La méthode `writeFile` empaquette les données et tente de sauvegarder le nouveau fichier. Le format du fichier exporté est déterminé par l'extension de `filename` (`SheetJS.xlsx` signale une exportation XLSX, `SheetJS.xlsb` signale une exportation XLSB, etc).
    
    La méthode `writeFile` utilise des API spécifiques à la plateforme pour initier la sauvegarde du fichier. Dans NodeJS, `fs.readFileSync` peut créer un fichier. Dans le navigateur web, un téléchargement est tenté en utilisant l'attribut `download` HTML5, avec des solutions de repli pour IE.
    
    _Générer et tenter de sauvegarder un fichier XLSX_```js
    XLSX.writeFileXLSX(workbook, filename, opts);
    

    La méthode writeFile intègre un certain nombre de fonctions d'exportation différentes. C'est excellent pour l'expérience développeur mais pas adapté à l'élimination des exports inutilisés (tree shaking) avec les outils de développement actuels. Lorsque seules les exportations XLSX sont nécessaires, cette méthode évite de référencer les autres fonctions d'exportation.

    Le second argument opts est facultatif. "Writing Options" décrit les propriétés et comportements pris en charge.

    Exemples

    Fichier local dans un serveur NodeJS (cliquez pour afficher)

    writeFile utilise fs.writeFileSync dans les environnements serveur :```js var XLSX = require("xlsx");

    /* output format determined by filename */ XLSX.writeFile(workbook, "out.xlsb");

    root@kitploit:~
    Pour Node ESM, l’assistant `writeFile` n’est pas activé. À la place, `fs.writeFileSync` devrait être utilisé pour écrire les données du fichier dans un `Buffer`, destiné à être utilisé avec `XLSX.write` :```js
    import { writeFileSync } from "fs";
    import { write } from "xlsx/xlsx.mjs";
    
    const buf = write(workbook, {type: "buffer", bookType: "xlsb"});
    /* buf is a Buffer */
    const workbook = writeFileSync("out.xlsb", buf);
    
    Fichier local dans une application Deno (cliquez pour afficher)

    writeFile utilise Deno.writeFileSync sous le capot :```js // @deno-types="https://deno.land/x/sheetjs/types/index.d.ts" import * as XLSX from 'https://deno.land/x/sheetjs/xlsx.mjs'

    XLSX.writeFile(workbook, "test.xlsx");

    root@kitploit:~
    Applications writing files must be invoked with the `--allow-write` flag.  La
    [`deno` demo](https://github.com/weareu/xlsx/blob/HEAD/demos/deno/) contient plus d'exemples
    
    </details>
    
    <details>
      <summary><b>Fichier local dans un plugin PhotoShop ou InDesign</b> (cliquez pour afficher)</summary>
    
    `writeFile` encapsule la logique `File` dans Photoshop et autres cibles ExtendScript.
    Le chemin spécifié doit être un chemin absolu :```js
    #include "xlsx.extendscript.js"
    
    /* output format determined by filename */
    XLSX.writeFile(workbook, "out.xlsx");
    /* at this point, out.xlsx is a file that you can distribute */
    

    La démo extendscript inclut un exemple plus complexe.

    Télécharger un fichier dans le navigateur vers la machine de l'utilisateur (cliquez pour afficher)

    XLSX.writeFile encapsule plusieurs techniques pour déclencher la sauvegarde d'un fichier :

    • L'API URL du navigateur crée une URL d'objet pour le fichier, que la bibliothèque utilise en créant un lien et en forçant un clic. Elle est prise en charge dans les navigateurs modernes.
    • msSaveBlob est une API IE10+ pour déclencher la sauvegarde d'un fichier.
    • IE_FileSave utilise VBScript et ActiveX pour écrire un fichier dans IE6+ sous Windows XP et Windows 7. Le shim doit être inclus dans la page HTML conteneur.

    Il n'existe pas de méthode standard pour déterminer si le fichier a réellement été téléchargé.```js /* output format determined by filename / XLSX.writeFile(workbook, "out.xlsb"); / at this point, out.xlsb will have been downloaded */

    root@kitploit:~
    </details>
    
    <details>
      <summary><b>Télécharger un fichier dans les navigateurs anciens</b> (cliquez pour afficher)</summary>
    
    Les techniques de `XLSX.writeFile` fonctionnent pour la plupart des navigateurs modernes ainsi que pour les anciens IE.
    Pour les navigateurs beaucoup plus anciens, il existe des contournements implémentés par des bibliothèques wrapper.
    
    [`FileSaver.js`](https://github.com/eligrey/FileSaver.js/) implémente `saveAs`.
    Note : `XLSX.writeFile` appellera automatiquement `saveAs` si disponible.```js
    /* bookType can be any supported output type */
    var wopts = { bookType:"xlsx", bookSST:false, type:"array" };
    
    var wbout = XLSX.write(workbook,wopts);
    
    /* the saveAs call downloads a file on the local machine */
    saveAs(new Blob([wbout],{type:"application/octet-stream"}), "test.xlsx");
    
    Génération de fichiers PhantomJS (Webkit sans tête) (cliquez pour afficher)

    La démo headless inclut une démo complète pour convertir des fichiers HTML en classeurs XLSB à l'aide de PhantomJS. PhantomJS fs.write prend en charge l'écriture de fichiers à partir du processus principal mais a une interface différente de celle du module fs de NodeJS :```js var XLSX = require('xlsx'); var fs = require('fs');

    /* generate a binary string / var bin = XLSX.write(workbook, { type:"binary", bookType: "xlsx" }); / write to file */ fs.write("test.xlsx", bin, "wb");

    root@kitploit:~
    Remarque : La section [« Traitement des tableaux HTML »](#processing-html-tables) montre comment
    générer un classeur à partir de tableaux HTML dans une page en « WebKit sans tête ».
    
    </details>
    
    
    
    Les [démos incluses](https://github.com/weareu/xlsx/blob/HEAD/demos/) couvrent les applications mobiles et autres déploiements spéciaux.
    
    ### Exemples d'écriture
    
    - <http://sheetjs.com/demos/table.html> exportation d'un tableau HTML
    - <http://sheetjs.com/demos/writexlsx.html> génère un fichier simple
    
    ### Écriture en flux
    
    Les fonctions d'écriture en flux sont disponibles dans l'objet `XLSX.stream`. Elles
    prennent les mêmes arguments que les fonctions d'écriture normales mais retournent un
    flux lisible NodeJS.
    
    - `XLSX.stream.to_csv` est la version en flux de `XLSX.utils.sheet_to_csv`.
    - `XLSX.stream.to_html` est la version en flux de `XLSX.utils.sheet_to_html`.
    - `XLSX.stream.to_json` est la version en flux de `XLSX.utils.sheet_to_json`.
    
    <details>
      <summary><b>Conversion en CSV avec Node.js et écriture dans un fichier</b> (clic pour afficher)</summary>```js
    var output_file_name = "out.csv";
    var stream = XLSX.stream.to_csv(worksheet);
    stream.pipe(fs.createWriteStream(output_file_name));
    
    nodejs écrire un flux JSON à l'écran (cliquez pour afficher)```js /* to_json returns an object-mode stream */ var stream = XLSX.stream.to_json(worksheet, {raw:true});

    /* the following stream converts JS objects to text via JSON.stringify */ var conv = new Transform({writableObjectMode:true}); conv._transform = function(obj, e, cb){ cb(null, JSON.stringify(obj) + "\n"); };

    stream.pipe(conv); conv.pipe(process.stdout);

    root@kitploit:~
    </details>
    
    <details>
      <summary><b>Exportation des fichiers NUMBERS</b> (cliquer pour afficher)</summary>
    
    L'outil d'exportation NUMBERS nécessite une base assez volumineuse. Les scripts
    supplémentaires `xlsx.zahl` fournissent le support. `xlsx.zahl.js` est conçu
    pour une utilisation autonome et NodeJS, tandis que `xlsx.zahl.mjs` convient
    pour ESM.
    
    _Navigateur_```html
    <meta charset="utf8">
    <script src="xlsx.full.min.js"></script>
    <script src="xlsx.zahl.js"></script>
    <script>
    var wb = XLSX.utils.book_new(); var ws = XLSX.utils.aoa_to_sheet([
      ["SheetJS", "<3","விரிதாள்"],
      [72,,"Arbeitsblätter"],
      [,62,"数据"],
      [true,false,],
    ]); XLSX.utils.book_append_sheet(wb, ws, "Sheet1");
    XLSX.writeFile(wb, "textport.numbers", {numbers: XLSX_ZAHL, compression: true});
    </script>
    

    Node```js var XLSX = require("./xlsx.flow"); var XLSX_ZAHL = require("./dist/xlsx.zahl"); var wb = XLSX.utils.book_new(); var ws = XLSX.utils.aoa_to_sheet([ ["SheetJS", "<3","விரிதாள்"], [72,,"Arbeitsblätter"], [,62,"数据"], [true,false,], ]); XLSX.utils.book_append_sheet(wb, ws, "Sheet1"); XLSX.writeFile(wb, "textport.numbers", {numbers: XLSX_ZAHL, compression: true});

    root@kitploit:~
    _Deno_```ts
    import * as XLSX from './xlsx.mjs';
    import XLSX_ZAHL from './dist/xlsx.zahl.mjs';
    
    var wb = XLSX.utils.book_new(); var ws = XLSX.utils.aoa_to_sheet([
      ["SheetJS", "<3","விரிதாள்"],
      [72,,"Arbeitsblätter"],
      [,62,"数据"],
      [true,false,],
    ]); XLSX.utils.book_append_sheet(wb, ws, "Sheet1");
    XLSX.writeFile(wb, "textports.numbers", {numbers: XLSX_ZAHL, compression: true});
    

    https://github.com/sheetjs/sheetaki achemine les flux d'écriture vers la réponse nodejs.

    Génération de données JSON et JS

    Les données JSON et JS ont tendance à représenter des feuilles de calcul individuelles. Les fonctions utilitaires de cette section travaillent avec une seule feuille de calcul.

    La section "Common Spreadsheet Format" décrit la structure de l'objet plus en détail. workbook.SheetNames est une liste ordonnée des noms de feuilles de calcul. workbook.Sheets est un objet dont les clés sont les noms des feuilles et les valeurs sont les objets feuilles de calcul.

    La « première feuille de calcul » est stockée dans workbook.Sheets[workbook.SheetNames[0]].

    API

    Créer un tableau d'objets JS à partir d'une feuille de calcul```js var jsa = XLSX.utils.sheet_to_json(worksheet, opts);

    root@kitploit:~
    _Créer un tableau de tableaux de valeurs JS à partir d'une feuille de calcul_```js
    var aoa = XLSX.utils.sheet_to_json(worksheet, {...opts, header: 1});
    

    La fonction utilitaire sheet_to_json parcourt un classeur ligne par ligne, générant un tableau d'objets. Le second argument opts contrôle un certain nombre de décisions d'exportation, notamment le type de valeurs (valeurs JS ou texte formaté). La section "JSON" décrit l'argument plus en détail.

    Par défaut, sheet_to_json scanne la première ligne et utilise les valeurs comme en-têtes. Avec l'option header: 1, la fonction exporte un tableau de tableaux de valeurs.

    Exemples

    x-spreadsheet est un tableau de données interactif pour prévisualiser et modifier des données structurées dans le navigateur Web. La xspreadsheet démo inclut un script d'exemple avec la fonction stox pour convertir un classeur en objet de données x-spreadsheet. https://oss.sheetjs.com/sheetjs/x-spreadsheet est une démonstration en direct.

    Aperçu des données dans une grille de données React (cliquez pour afficher)

    react-data-grid est une grille de données adaptée pour React. Elle attend deux propriétés : rows d'objets de données et columns qui décrivent les colonnes. Pour manipuler les données afin de les adapter à l'API de la grille de données React, il est plus simple de partir d'un tableau de tableaux.

    Cette démonstration commence par récupérer un fichier distant et utiliser XLSX.read pour extraire :```js import { useEffect, useState } from "react"; import DataGrid from "react-data-grid"; import { read, utils } from "xlsx";

    const url = "https://oss.sheetjs.com/test_files/RkNumber.xls";

    export default function App() { const [columns, setColumns] = useState([]); const [rows, setRows] = useState([]); useEffect(() => {(async () => { const wb = read(await (await fetch(url)).arrayBuffer(), { WTF: 1 });

    root@kitploit:~
    /* use sheet_to_json with header: 1 to generate an array of arrays */
    const data = utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]], { header: 1 });
    
    /* see react-data-grid docs to understand the shape of the expected data */
    setColumns(data[0].map((r) => ({ key: r, name: r })));
    setRows(data.slice(1).map((r) => r.reduce((acc, x, i) => {
      acc[data[0][i]] = x;
      return acc;
    }, {})));
    

    })(); });

    return ; }

    root@kitploit:~
    </details>
    
    <details>
      <summary><b>Aperçu des données dans une grille de données VueJS</b> (cliquer pour afficher)</summary>
    
    [`vue3-table-lite`](https://github.com/linmasahiro/vue3-table-lite) est une simple table de données VueJS 3.  Elle est présentée [dans la démo VueJS](https://github.com/weareu/xlsx/blob/HEAD/demos/vue/modify/).
    
    </details>
    
    <details>
      <summary><b>Remplir une base de données (SQL ou no-SQL)</b> (cliquer pour afficher)</summary>
    
    La démo [`database`](https://github.com/weareu/xlsx/blob/HEAD/demos/database/) inclut des exemples de travail avec des bases de données et des résultats de requêtes.
    
    </details>
    
    <details>
      <summary><b>Calculs numériques avec TensorFlow.js</b> (cliquer pour afficher)</summary>
    
    [`@tensorflow/tfjs`](https://github.com/weareu/xlsx/blob/HEAD/@tensorflow/tfjs) et d'autres bibliothèques s'attendent à des données sous forme de tableaux simples, bien adaptés aux feuilles de calcul où chaque colonne est un vecteur de données.  C'est la transposée de la façon dont la plupart des gens utilisent les tableurs, où chaque ligne est un vecteur.
    
    Un seul `Array#map` peut extraire des lignes nommées individuelles de l'exportation `sheet_to_json` :```js
    const XLSX = require("xlsx");
    const tf = require('@tensorflow/tfjs');
    
    const key = "age"; // this is the field we want to pull
    const ages = XLSX.utils.sheet_to_json(worksheet).map(r => r[key]);
    const tf_data = tf.tensor1d(ages);
    
    Récupération du classeur React et génération d'aperçus de tableaux HTML (cliquez pour afficher)

    Il est généralement recommandé d'utiliser un workflow adapté à React, mais il est possible de générer du HTML et de l'utiliser dans React avec dangerouslySetInnerHTML :```jsx function Tabeller(props) { /* the workbook object is the state */ const [workbook, setWorkbook] = React.useState(XLSX.utils.book_new());

    /* fetch and update the workbook with an effect / React.useEffect(() => { (async() => { / fetch and parse workbook -- see the fetch example for details */ const wb = XLSX.read(await (await fetch("sheetjs.xlsx")).arrayBuffer()); setWorkbook(wb); })(); });

    return workbook.SheetNames.map(name => (<>

    name

    <div dangerouslySetInnerHTML={{ /* this __html mantra is needed to set the inner HTML */ __html: XLSX.utils.sheet_to_html(workbook.Sheets[name]) }} /> </>)); }

    root@kitploit:~
    La [`react` démo](https://github.com/weareu/xlsx/blob/HEAD/demos/react) inclut plus d'exemples React.
    
    </details>
    
    <details>
      <summary><b>VueJS : récupérer un classeur et générer des aperçus de tableau HTML</b> (cliquer pour afficher)</summary>
    
    Il est généralement recommandé d'utiliser un workflow compatible VueJS, mais il est possible
    de générer du HTML et de l'utiliser dans VueJS avec la directive `v-html` :```jsx
    import { read, utils } from 'xlsx';
    import { reactive } from 'vue';
    
    const S5SComponent = {
      mounted() { (async() => {
        /* fetch and parse workbook -- see the fetch example for details */
        const workbook = read(await (await fetch("sheetjs.xlsx")).arrayBuffer());
        /* loop through the worksheet names in order */
        workbook.SheetNames.forEach(name => {
          /* generate HTML from the corresponding worksheets */
          const html = utils.sheet_to_html(workbook.Sheets[name]);
          /* add to state */
          this.wb.wb.push({ name, html });
        });
      })(); },
      /* this state mantra is required for array updates to work */
      setup() { return { wb: reactive({ wb: [] }) }; },
      template: `
      <div v-for="ws in wb.wb" :key="ws.name">
        <h3>{{ ws.name }}</h3>
        <div v-html="ws.html"></div>
      </div>`
    };
    

    Génération d'instantanés de feuille unique

    Les fonctions sheet_to_* acceptent un objet feuille de calcul.

    API

    Générer un CSV à partir d'une seule feuille de calcul```js var csv = XLSX.utils.sheet_to_csv(worksheet, opts);

    root@kitploit:~
    Cet instantané est conçu pour reproduire le type de sortie "CSV UTF8 (`.csv`)".
    ["Sortie séparée par des délimiteurs"](#delimiter-separated-output) décrit la
    fonction et l'argument optionnel `opts` plus en détail.
    
    _Générer "Texte" à partir d'une seule feuille de calcul_```js
    var txt = XLSX.utils.sheet_to_txt(worksheet, opts);
    

    Ce snapshot est conçu pour reproduire le type de sortie "Texte UTF16 (.txt)". "Sortie séparée par des délimiteurs" décrit la fonction et l'argument optionnel opts plus en détail.

    Générer une liste de formules à partir d'une seule feuille de calcul```js var fmla = XLSX.utils.sheet_to_formulae(worksheet);

    root@kitploit:~
    Cet instantané génère un tableau d'entrées représentant les formules intégrées. Les formules matricielles sont rendues sous la forme `range=formule` tandis que les cellules simples sont rendues sous la forme `cell=formule ou valeur`.  Les littéraux de chaîne sont préfixés d'une apostrophe `'`, conformément à l'affichage de la barre de formule d'Excel.
    
    ["Sortie des formules"](#formulae-output) décrit la fonction plus en détail.
    
    ## Interface
    
    `XLSX` est la variable exposée dans le navigateur et la variable exportée de Node.
    
    `XLSX.version` est la version de la bibliothèque (ajoutée par le script de construction).
    
    `XLSX.SSF` est une version intégrée de la [bibliothèque de format](https://git.io/ssf).
    
    ### Fonctions d'analyse
    
    `XLSX.read(data, read_opts)` tente d'analyser `data`.
    
    `XLSX.readFile(filename, read_opts)` tente de lire `filename` et de l'analyser.
    
    Les options d'analyse sont décrites dans la section [Options d'analyse](#parsing-options).
    
    ### Fonctions d'écriture
    
    `XLSX.write(wb, write_opts)` tente d'écrire le classeur `wb`.
    
    `XLSX.writeFile(wb, filename, write_opts)` tente d'écrire `wb` dans `filename`. Dans des environnements basés sur un navigateur, il tentera de forcer un téléchargement côté client.
    
    `XLSX.writeFileAsync(wb, filename, o, cb)` tente d'écrire `wb` dans `filename`. Si `o` est omis, l'écrivain utilisera le troisième argument comme fonction de rappel.
    
    `XLSX.stream` contient un ensemble de fonctions d'écriture en flux.
    
    Les options d'écriture sont décrites dans la section [Options d'écriture](#writing-options).
    
    ### Utilitaires
    
    Les utilitaires sont disponibles dans l'objet `XLSX.utils` et sont décrits dans la section [Fonctions utilitaires](#utility-functions) :
    
    **Construction :**
    
    - `book_new` crée un classeur vide
    - `book_append_sheet` ajoute une feuille de calcul à un classeur
    
    **Importation :**
    
    - `aoa_to_sheet` convertit un tableau de tableaux de données JS en une feuille de calcul.
    - `json_to_sheet` convertit un tableau d'objets JS en une feuille de calcul.
    - `table_to_sheet` convertit un élément DOM TABLE en une feuille de calcul.
    - `sheet_add_aoa` ajoute un tableau de tableaux de données JS à une feuille de calcul existante.
    - `sheet_add_json` ajoute un tableau d'objets JS à une feuille de calcul existante.
    
    **Exportation :**
    
    - `sheet_to_json` convertit un objet feuille de calcul en un tableau d'objets JSON.
    - `sheet_to_csv` génère une sortie de valeurs séparées par un délimiteur.
    - `sheet_to_txt` génère du texte formaté en UTF16.
    - `sheet_to_html` génère une sortie HTML.
    - `sheet_to_formulae` génère une liste des formules (avec des valeurs de repli).
    
    **Manipulation des cellules et des adresses de cellules :**
    
    - `format_cell` génère la valeur textuelle d'une cellule (en utilisant les formats de nombre).
    - `encode_row / decode_row` convertit entre les lignes indexées à 0 et les lignes indexées à 1.
    - `encode_col / decode_col` convertit entre les colonnes indexées à 0 et les noms de colonnes.
    - `encode_cell / decode_cell` convertit les adresses de cellule.
    - `encode_range / decode_range` convertit les plages de cellules.
    
    ## Common Spreadsheet Format
    
    SheetJS est conforme au Common Spreadsheet Format (CSF) :
    
    ### Structures générales
    
    Les objets d'adresse de cellule sont stockés sous la forme `{c:C, r:R}` où `C` et `R` sont respectivement les numéros de colonne et de ligne indexés à 0.  Par exemple, l'adresse de cellule `B5` est représentée par l'objet `{c:1, r:4}`.
    
    Les objets de plage de cellules sont stockés sous la forme `{s:S, e:E}` où `S` est la première cellule et `E` la dernière cellule de la plage.  Les plages sont inclusives.  Par exemple, la plage `A3:B7` est représentée par l'objet `{s:{c:0, r:2}, e:{c:1, r:6}}`.
    Les fonctions utilitaires effectuent un parcours dans l'ordre principal des lignes d'une plage de feuille de calcul :```js
    for(var R = range.s.r; R <= range.e.r; ++R) {
      for(var C = range.s.c; C <= range.e.c; ++C) {
        var cell_address = {c:C, r:R};
        /* if an A1-style address is needed, encode the address */
        var cell_ref = XLSX.utils.encode_cell(cell_address);
      }
    }
    

    Cell Object

    Les objets Cell sont de simples objets JS dont les clés et valeurs suivent la convention suivante :

    Les utilitaires d'exportation intégrés (tels que l'exportateur CSV) utiliseront le texte w s'il est disponible. Pour modifier une valeur, assurez-vous de supprimer cell.w (ou de le définir sur undefined) avant de tenter d'exporter. Les utilitaires régénéreront le texte w à partir du format de nombre (cell.z) et de la valeur brute si possible.

    La formule matricielle réelle est stockée dans le champ f de la première cellule de la plage matricielle. Les autres cellules de la plage omettront le champ f.

    Data Types

    La valeur brute est stockée dans la propriété de valeur v, interprétée en fonction du type t. Cette séparation permet de représenter à la fois des nombres et du texte numérique. Il existe 6 types de cellules valides :

    Valeurs d'erreur et interprétation (cliquer pour afficher)

    Le type n est le type Nombre. Il inclut toutes les formes de données qu'Excel stocke sous forme de nombres, comme les dates/heures et les champs booléens. Excel utilise exclusivement des données pouvant tenir dans un nombre à virgule flottante IEEE754, tout comme le type Number de JS, donc le champ v contient le nombre brut. Le champ w contient le texte formaté. Les dates sont stockées sous forme de nombres par défaut et converties avec XLSX.SSF.parse_date_code.

    Le type d est le type Date, généré uniquement lorsque l'option cellDates est transmise. Comme JSON n'a pas de type Date naturel, les analyseurs sont généralement censés stocker des chaînes de date ISO 8601 comme celles que vous obtiendriez de date.toISOString(). D'autre part, les rédacteurs et exportateurs doivent être capables de traiter les chaînes de date et les objets Date JS. Notez qu'Excel ignore les modificateurs de fuseau horaire et traite toutes les dates dans le fuseau horaire local. La bibliothèque ne corrige pas cette erreur.

    Le type s est le type Chaîne. Les valeurs sont explicitement stockées sous forme de texte. Excel interprétera ces cellules comme "nombre stocké sous forme de texte". Les fichiers Excel générés suppriment automatiquement cette classe d'erreur, mais d'autres formats peuvent provoquer des erreurs.

    Le type z représente les cellules stub vides. Elles sont générées dans les cas où les cellules n'ont pas de valeur attribuée mais contiennent des commentaires ou d'autres métadonnées. Elles sont ignorées par les fonctions utilitaires de traitement de données de la bibliothèque principale. Par défaut, ces cellules ne sont pas générées ; l'option d'analyse sheetStubs doit être définie sur true.

    Dates

    Détails sur le code de date Excel (cliquer pour afficher)

    Par défaut, Excel stocke les dates sous forme de nombres avec un code de format spécifiant le traitement de la date. Par exemple, la date 19-Feb-17 est stockée sous le nombre 42785 avec un format de nombre d-mmm-yy. Le module SSF comprend les formats de nombre et effectue la conversion appropriée.

    XLSX prend également en charge un type de date spécial d où les données sont une chaîne de date ISO 8601. Le formateur convertit la date en un nombre.

    Le comportement par défaut de tous les analyseurs est de générer des cellules numériques. Définir cellDates sur true forcera les générateurs à stocker les dates.

    Fuseaux horaires et dates (cliquer pour afficher)

    Excel n'a pas de concept natif de temps universel. Toutes les heures sont spécifiées dans le fuseau horaire local. Les limitations d'Excel empêchent de spécifier des dates absolues réelles.

    Conformément à Excel, cette bibliothèque traite toutes les dates comme relatives au fuseau horaire local.

    Époques : 1900 et 1904 (cliquer pour afficher)

    Excel prend en charge deux époques (1er janvier 1900 et 1er janvier 1904). L'époque du classeur peut être déterminée en examinant la propriété wb.Workbook.WBProps.date1904 du classeur :```js !!(((wb.Workbook||{}).WBProps||{}).date1904)

    root@kitploit:~
    </details>
    
    ### Objets de feuille
    
    Chaque clé qui ne commence pas par `!` correspond à une cellule (en utilisant la notation `A-1`)
    
    `sheet[address]` renvoie l'objet cellule pour l'adresse spécifiée.
    
    **Clés spéciales de feuille (accessibles sous la forme `sheet[key]`, chacune commençant par `!`):**
    
    - `sheet['!ref']` : Plage basée sur A-1 représentant la plage de la feuille. Les fonctions qui travaillent avec des feuilles doivent utiliser ce paramètre pour déterminer la plage. Les cellules assignées en dehors de la plage ne sont pas traitées. En particulier, lors de la création manuelle d'une feuille, les cellules en dehors de la plage ne sont pas incluses.
    
      Les fonctions qui manipulent les feuilles doivent vérifier la présence du champ `!ref`. Si `!ref` est omis ou n'est pas une plage valide, les fonctions sont libres de traiter la feuille comme vide ou de tenter de deviner la plage. Les utilitaires standards fournis avec cette bibliothèque traitent les feuilles comme vides (par exemple, la sortie CSV est une chaîne vide).
    
      Lors de la lecture d'une feuille de calcul avec la propriété `sheetRows` définie, le paramètre ref utilisera la plage restreinte. La plage d'origine est définie dans `ws['!fullref']`
    
    - `sheet['!margins']` : Objet représentant les marges de la page. Les valeurs par défaut suivent le préréglage « normal » d'Excel. Excel propose également des préréglages « large » et « étroit », mais ils sont stockés sous forme de mesures brutes. Les principales propriétés sont listées ci-dessous :
    
    <details>
      <summary><b>Détails des marges de page</b> (cliquez pour afficher)</summary>
    
    | clé      | description            | "normal" | "large" | "étroit" |
    |----------|------------------------|:---------|:-------|:-------- |
    | `left`   | marge gauche (pouces)   | `0.7`    | `1.0`  | `0.25`   |
    | `right`  | marge droite (pouces)  | `0.7`    | `1.0`  | `0.25`   |
    | `top`    | marge haute (pouces)    | `0.75`   | `1.0`  | `0.75`   |
    | `bottom` | marge basse (pouces) | `0.75`   | `1.0`  | `0.75`   |
    | `header` | marge d'en-tête (pouces) | `0.3`    | `0.5`  | `0.3`    |
    | `footer` | marge de pied de page (pouces) | `0.3`    | `0.5`  | `0.3`    |```js
    /* Set worksheet sheet to "normal" */
    ws["!margins"]={left:0.7, right:0.7, top:0.75,bottom:0.75,header:0.3,footer:0.3}
    /* Set worksheet sheet to "wide" */
    ws["!margins"]={left:1.0, right:1.0, top:1.0, bottom:1.0, header:0.5,footer:0.5}
    /* Set worksheet sheet to "narrow" */
    ws["!margins"]={left:0.25,right:0.25,top:0.75,bottom:0.75,header:0.3,footer:0.3}
    

    Objet Feuille de Calcul

    En plus des clés de base de la feuille, les feuilles de calcul ajoutent également :

    • ws['!cols'] : tableau d'objets de propriétés de colonnes. Les largeurs de colonnes sont en fait stockées dans les fichiers de manière normalisée, mesurées en termes de "Largeur Maximale de Chiffre" (la plus grande largeur des chiffres rendus 0-9, en pixels). Lors de l'analyse, les objets de colonne stockent la largeur en pixels dans le champ wpx, la largeur en caractères dans le champ wch, et la largeur maximale de chiffre dans le champ MDW.

    • ws['!rows'] : tableau d'objets de propriétés de lignes comme expliqué plus loin dans la documentation. Chaque objet ligne encode des propriétés incluant la hauteur de ligne et la visibilité.

    • ws['!merges'] : tableau d'objets de plage correspondant aux cellules fusionnées dans la feuille de calcul. Les formats de texte brut ne supportent pas les cellules fusionnées. L'export CSV écrira toutes les cellules de la plage fusionnée si elles existent, alors assurez-vous que seule la première cellule (en haut à gauche) de la plage est définie.

    • ws['!outline'] : configurer le comportement des plans. Les options par défaut sont les paramètres par défaut d'Excel 2019 :

    cléFonctionnalité Excelpar défaut
    aboveDécocher "Résumé des lignes en dessous du détail"false
    leftDécocher "Résumé des colonnes à droite du détail"
    • ws['!protect'] : objet des propriétés de protection de feuille en écriture. La clé password spécifie le mot de passe pour les formats supportant les feuilles protégées par mot de passe (XLSX/XLSB/XLS). L'écrivain utilise la méthode d'obfuscation XOR. Les clés suivantes contrôlent la protection de la feuille — définir sur false pour activer une fonctionnalité lorsque la feuille est verrouillée ou sur true pour la désactiver :
    Détails de la protection de la feuille de calcul (cliquez pour afficher)
    • ws['!autofilter'] : objet AutoFilter suivant le schéma :```typescript type AutoFilter = { ref:string; // A-1 based range representing the AutoFilter table range }
    root@kitploit:~
    #### Objet Chartsheet
    
    Les Chartsheets sont représentés comme des feuilles standard.  Ils se distinguent avec la propriété `!type` définie à `"chart"`.
    
    Les données sous-jacentes et `!ref` font référence aux données mises en cache dans le chartsheet.  La première ligne du chartsheet est l'en-tête sous-jacent.
    
    #### Objet Macrosheet
    
    Les Macrosheets sont représentés comme des feuilles standard.  Ils se distinguent avec la propriété `!type` définie à `"macro"`.
    
    #### Objet Dialogsheet
    
    Les Dialogsheets sont représentés comme des feuilles standard. Ils se distinguent avec la propriété `!type` définie à `"dialog"`.
    
    ### Objet Workbook
    
    `workbook.SheetNames` est une liste ordonnée des feuilles dans le classeur
    
    `wb.Sheets[sheetname]` renvoie un objet représentant la feuille de calcul.
    
    `wb.Props` est un objet stockant les propriétés standard.  `wb.Custprops` stocke les propriétés personnalisées. Étant donné que les propriétés standard XLS diffèrent de la norme XLSX, l'analyse XLS stocke les propriétés de base dans les deux endroits.
    
    `wb.Workbook` stocke les [attributs au niveau du classeur](#workbook-level-attributes).
    
    #### Propriétés du fichier du classeur
    
    Les différents formats de fichiers utilisent des noms internes différents pour les propriétés de fichier.  L'objet `Props` du classeur normalise les noms :
    
    <details>
      <summary><b>Propriétés du fichier</b> (cliquer pour afficher)</summary>
    
    | Nom JS        | Description Excel                     |
    |:--------------|:--------------------------------------|
    | `Title`       | Onglet Résumé "Titre"                 |
    | `Subject`     | Onglet Résumé "Sujet"                 |
    | `Author`      | Onglet Résumé "Auteur"                |
    | `Manager`     | Onglet Résumé "Responsable"           |
    | `Company`     | Onglet Résumé "Société"               |
    | `Category`    | Onglet Résumé "Catégorie"             |
    | `Keywords`    | Onglet Résumé "Mots-clés"             |
    | `Comments`    | Onglet Résumé "Commentaires"          |
    | `LastAuthor`  | Onglet Statistiques "Dernière sauvegarde par" |
    | `CreatedDate` | Onglet Statistiques "Créé"            |
    
    </details>
    
    Par exemple, pour définir la propriété de titre du classeur :```js
    if(!wb.Props) wb.Props = {};
    wb.Props.Title = "Insert Title Here";
    

    Les propriétés personnalisées sont ajoutées dans l'objet Custprops du classeur :```js if(!wb.Custprops) wb.Custprops = {}; wb.Custprops["Custom Property"] = "Custom Value";

    root@kitploit:~
    Les Writers traiteront la clé `Props` de l'objet options :```js
    /* force the Author to be "SheetJS" */
    XLSX.write(wb, {Props:{Author:"SheetJS"}});
    

    Attributs au niveau du classeur

    wb.Workbook stocke les attributs au niveau du classeur.

    Noms définis

    wb.Workbook.Names est un tableau d'objets de nom définis qui possèdent les clés :

    Propriétés des noms définis (cliquer pour afficher)

    Excel permet à deux noms définis dans la portée d'une feuille de partager le même nom. Cependant, un nom de portée de feuille ne peut pas entrer en collision avec un nom de portée de classeur. Les créateurs de classeurs peuvent ne pas appliquer cette contrainte.

    Vues du classeur

    wb.Workbook.Views est un tableau d'objets de vue du classeur qui possèdent les clés :

    CléDescription
    RTLSi vrai, afficher de droite à gauche

    Propriétés diverses du classeur

    wb.Workbook.WBProps contient d'autres propriétés du classeur :

    CléDescription
    CodeNameNom de code du projet VBA du classeur
    date1904époque : 0/faux pour le système 1900, 1/vrai pour 1904
    filterPrivacy

    Fonctionnalités du document

    Même pour des fonctionnalités de base comme le stockage des dates, les formats Excel officiels stockent le même contenu de différentes manières. Les analyseurs sont censés convertir de la représentation du format de fichier sous-jacent au format Common Spreadsheet Format. Les créateurs sont censés reconvertir du CSF au format de fichier sous-jacent.

    Formules

    La chaîne de formule de style A1 est stockée dans le champ f. Bien que différents formats de fichier stockent les formules de différentes manières, les formats sont traduits. Même si certains formats stockent les formules avec un signe égal en tête, les formules CSF ne commencent pas par =.

    Prise en charge des formats de fichiers de formules (cliquer pour afficher)

    Formules à cellule unique

    Pour les formules simples, la clé f de la cellule souhaitée peut être définie sur le texte réel de la formule. Cette feuille de calcul représente A1=1, A2=2 et A3=A1+A2 :```js var worksheet = { "!ref": "A1:A3", A1: { t:'n', v:1 }, A2: { t:'n', v:2 }, A3: { t:'n', v:3, f:'A1+A2' } };

    root@kitploit:~
    Les utilitaires comme `aoa_to_sheet` acceptent des objets de cellule à la place des valeurs :```js
    var worksheet = XLSX.utils.aoa_to_sheet([
      [ 1 ], // A1
      [ 2 ], // A2
      [ {t: "n", v: 3, f: "A1+A2"} ] // A3
    ]);
    

    Les cellules contenant des entrées de formule mais sans valeur seront sérialisées d'une manière que Excel et d'autres outils de tableur reconnaîtront. Cette bibliothèque ne calculera pas automatiquement les résultats des formules ! Par exemple, la feuille de calcul suivante inclura la fonction BESSELJ mais le résultat ne sera pas disponible en JavaScript :```js var worksheet = XLSX.utils.aoa_to_sheet([ [ 3.14159, 2 ], // Row "1" [ { t:'n', f:'BESSELJ(A1,B1)' } ] // Row "2" will be calculated on file open }

    root@kitploit:~
    Si les résultats réels sont nécessaires en JS, [SheetJS Pro](https://sheetjs.com/pro)
    propose un composant de calcul de formules pour évaluer des expressions, mettre à jour
    les valeurs et les cellules dépendantes, et actualiser des classeurs entiers.
    
    **Formules de tableau**
    
    _Attribuer une formule de tableau_```js
    XLSX.utils.sheet_set_array_formula(worksheet, range, formula);
    

    Les formules matricielles sont stockées dans la cellule en haut à gauche du bloc matriciel. Toutes les cellules d'une formule matricielle ont un champ F correspondant à la plage. Une formule monocellulaire peut être distinguée d'une formule simple par la présence du champ F.

    Par exemple, en définissant la cellule C1 à la formule matricielle {=SUM(A1:A3*B1:B3)} :```js // API function XLSX.utils.sheet_set_array_formula(worksheet, "C1", "SUM(A1:A3*B1:B3)");

    // ... OR raw operations worksheet['C1'] = { t:'n', f: "SUM(A1:A3*B1:B3)", F:"C1:C1" };

    root@kitploit:~
    Pour une formule de tableau multi-cellules, chaque cellule a la même plage de tableau mais seule la première cellule spécifie la formule.  Considérez `D1:D3=A1:A3*B1:B3` :```js
    // API function
    XLSX.utils.sheet_set_array_formula(worksheet, "D1:D3", "A1:A3*B1:B3");
    
    // ... OR raw operations
    worksheet['D1'] = { t:'n', F:"D1:D3", f:"A1:A3*B1:B3" };
    worksheet['D2'] = { t:'n', F:"D1:D3" };
    worksheet['D3'] = { t:'n', F:"D1:D3" };
    

    Les utilitaires et rédacteurs sont censés vérifier la présence d'un champ F et ignorer tout élément de formule f possible dans les cellules autres que la cellule de départ. Ils ne sont pas censés effectuer la validation des formules !

    Formules de matrice dynamique

    Assigner une formule de matrice dynamique```js XLSX.utils.sheet_set_array_formula(worksheet, range, formula, true);

    root@kitploit:~
    Publiées en 2020, les formules de tableau dynamique sont prises en charge dans les formats de fichiers XLSX/XLSM et XLSB.  Elles sont représentées comme des formules matricielles normales mais possèdent des métadonnées de cellule spéciales indiquant que la formule doit pouvoir ajuster la plage.
    
    Une formule matricielle peut être marquée comme dynamique en définissant la propriété `D` de la cellule sur true.  La plage `F` est attendue mais peut être définie sur la cellule actuelle :```js
    // API function
    XLSX.utils.sheet_set_array_formula(worksheet, "C1", "_xlfn.UNIQUE(A1:A3)", 1);
    
    // ... OR raw operations
    worksheet['C1'] = { t: "s", f: "_xlfn.UNIQUE(A1:A3)", F:"C1", D: 1 }; // dynamic
    

    Localisation avec les noms de fonctions

    SheetJS fonctionne au niveau du fichier. Excel stocke les expressions de formule en utilisant les noms de fonctions anglais (États-Unis). Pour les utilisateurs non anglophones, Excel utilise un ensemble localisé de noms de fonctions.

    Par exemple, lorsque la langue et la région de l'ordinateur sont définies sur Français (France), Excel interprète =SOMME(A1:C3) comme si SOMME était la fonction SUM. Cependant, dans le fichier réel, Excel stocke SUM(A1:C3).

    Préfixe des « fonctions futures »

    Les fonctions introduites dans les versions plus récentes d'Excel sont préfixées par _xlfn. lorsqu'elles sont stockées dans les fichiers. Lors de l'écriture d'expressions de formule utilisant ces fonctions, le préfixe est nécessaire pour une compatibilité maximale :```js // Broadest compatibility XLSX.utils.sheet_set_array_formula(worksheet, "C1", "_xlfn.UNIQUE(A1:A3)", 1);

    // Can cause errors in spreadsheet software XLSX.utils.sheet_set_array_formula(worksheet, "C1", "UNIQUE(A1:A3)", 1);

    root@kitploit:~
    Lors de la lecture d'un fichier, l'option `xlfn` préserve les préfixes.
    
    <details>
      <summary><b> Fonctions nécessitant le préfixe `_xlfn.`</b> (cliquer pour afficher)</summary>
    
    Cette liste s'allonge à chaque version d'Excel.```
    ACOT
    ACOTH
    AGGREGATE
    ARABIC
    BASE
    BETA.DIST
    BETA.INV
    BINOM.DIST
    BINOM.DIST.RANGE
    BINOM.INV
    BITAND
    BITLSHIFT
    BITOR
    BITRSHIFT
    BITXOR
    BYCOL
    BYROW
    CEILING.MATH
    CEILING.PRECISE
    CHISQ.DIST
    CHISQ.DIST.RT
    CHISQ.INV
    CHISQ.INV.RT
    CHISQ.TEST
    COMBINA
    CONFIDENCE.NORM
    CONFIDENCE.T
    COT
    COTH
    COVARIANCE.P
    COVARIANCE.S
    CSC
    CSCH
    DAYS
    DECIMAL
    ERF.PRECISE
    ERFC.PRECISE
    EXPON.DIST
    F.DIST
    F.DIST.RT
    F.INV
    F.INV.RT
    F.TEST
    FIELDVALUE
    FILTERXML
    FLOOR.MATH
    FLOOR.PRECISE
    FORMULATEXT
    GAMMA
    GAMMA.DIST
    GAMMA.INV
    GAMMALN.PRECISE
    GAUSS
    HYPGEOM.DIST
    IFNA
    IMCOSH
    IMCOT
    IMCSC
    IMCSCH
    IMSEC
    IMSECH
    IMSINH
    IMTAN
    ISFORMULA
    ISOMITTED
    ISOWEEKNUM
    LAMBDA
    LET
    LOGNORM.DIST
    LOGNORM.INV
    MAKEARRAY
    MAP
    MODE.MULT
    MODE.SNGL
    MUNIT
    NEGBINOM.DIST
    NORM.DIST
    NORM.INV
    NORM.S.DIST
    NORM.S.INV
    NUMBERVALUE
    PDURATION
    PERCENTILE.EXC
    PERCENTILE.INC
    PERCENTRANK.EXC
    PERCENTRANK.INC
    PERMUTATIONA
    PHI
    POISSON.DIST
    QUARTILE.EXC
    QUARTILE.INC
    QUERYSTRING
    RANDARRAY
    RANK.AVG
    RANK.EQ
    REDUCE
    RRI
    SCAN
    SEC
    SECH
    SEQUENCE
    SHEET
    SHEETS
    SKEW.P
    SORTBY
    STDEV.P
    STDEV.S
    T.DIST
    T.DIST.2T
    T.DIST.RT
    T.INV
    T.INV.2T
    T.TEST
    UNICHAR
    UNICODE
    UNIQUE
    VAR.P
    VAR.S
    WEBSERVICE
    WEIBULL.DIST
    XLOOKUP
    XOR
    Z.TEST
    

    Propriétés des lignes et des colonnes

    Support de format (cliquez pour afficher)

    Propriétés des lignes : XLSX/M, XLSB, BIFF8 XLS, XLML, SYLK, DOM

    Propriétés des colonnes : XLSX/M, XLSB, BIFF8 XLS, XLML, SYLK, DOM

    Les propriétés des lignes et des colonnes ne sont pas extraites par défaut lors de la lecture d'un fichier et ne sont pas persistées par défaut lors de l'écriture d'un fichier. L'option cellStyles: true doit être passée à la fonction de lecture ou d'écriture correspondante.

    Propriétés des colonnes

    Le tableau !cols dans chaque feuille de calcul, s'il est présent, est une collection d'objets ColInfo qui possèdent les propriétés suivantes :```typescript type ColInfo = { /* visibility */ hidden?: boolean; // if true, the column is hidden

    /* column width is specified in one of the following ways: / wpx?: number; // width in screen pixels width?: number; // width in Excel's "Max Digit Width", width256 is integral wch?: number; // width in characters

    /* other fields for preserving features from files */ level?: number; // 0-indexed outline / group level MDW?: number; // Excel's "Max Digit Width" unit, always integral };

    root@kitploit:~
    _Propriétés des lignes_
    
    Le tableau `!rows` dans chaque feuille de calcul, s'il est présent, est une collection d'objets `RowInfo` qui possèdent les propriétés suivantes :```typescript
    type RowInfo = {
      /* visibility */
      hidden?: boolean; // if true, the row is hidden
    
      /* row height is specified in one of the following ways: */
      hpx?:    number;  // height in screen pixels
      hpt?:    number;  // height in points
    
      level?:  number;  // 0-indexed outline / group level
    };
    

    Outline / Group Levels Convention

    L'interface utilisateur Excel affiche le niveau de plan de base comme 1 et le niveau maximum comme 8. Suivant les conventions JS, SheetJS utilise des niveaux de plan indexés à partir de 0 où le niveau de base est 0 et le niveau maximum est 7.

    Pourquoi y a-t-il trois types de largeur ? (cliquez pour afficher)

    Il existe trois types de largeur différents correspondant aux trois manières dont les tableurs stockent les largeurs de colonnes :

    Les formats SYLK et autres formats texte brut utilisent un comptage brut de caractères. Les outils contemporains comme Visicalc et Multiplan étaient basés sur les caractères. Puisque les caractères avaient la même largeur, il suffisait de stocker un comptage. Cette tradition s'est poursuivie dans les formats BIFF.

    SpreadsheetML (2003) a tenté de s'aligner sur HTML en standardisant le comptage des pixels à l'écran dans tout le fichier. Les largeurs de colonnes, les hauteurs de lignes et autres mesures utilisent des pixels. Lorsque les comptages de pixels et de caractères ne correspondent pas, Excel arrondit les valeurs.

    XLSX stocke en interne les largeurs de colonnes sous une forme nébuleuse de "Largeur maximale des chiffres" (Max Digit Width). La largeur maximale des chiffres est la largeur du chiffre le plus grand lorsqu'il est rendu (généralement le caractère "0" est le plus large). La largeur interne doit être un multiple entier de la largeur divisée par 256. ECMA-376 décrit une formule pour convertir entre les pixels et la largeur interne. Cela représente une approche hybride.

    Les fonctions de lecture tentent de renseigner les trois propriétés. Les fonctions d'écriture essaieront de convertir les valeurs spécifiées vers le type souhaité. Pour éviter les conflits potentiels, la manipulation doit d'abord supprimer les autres propriétés. Par exemple, lors du changement de la largeur en pixels, supprimez les propriétés wch et width.

    Détails d'implémentation (cliquez pour afficher)

    Hauteurs des lignes

    Excel stocke en interne les hauteurs de lignes en points. La résolution par défaut est 72 DPI ou 96 PPI, donc la taille en pixels et en points devrait correspondre. Pour des résolutions différentes, elles peuvent ne pas correspondre, donc la bibliothèque sépare les concepts.

    Même si toutes les informations sont disponibles, les fonctions d'écriture doivent suivre l'ordre de priorité :

    1. utiliser la hauteur en pixels hpx si disponible
    2. utiliser la hauteur en points hpt si disponible

    Largeurs des colonnes

    Compte tenu des contraintes, il est possible de déterminer le MDW sans inspecter réellement la police ! Les analyseurs devinent la largeur en pixels en convertissant de la largeur en pixels et inversement, en répétant pour tous les MDW possibles et en sélectionnant le MDW qui minimise l'erreur. XLML stocke en réalité la largeur en pixels, donc la devinette fonctionne dans le sens inverse.

    Même si toutes les informations sont disponibles, les fonctions d'écriture doivent suivre l'ordre de priorité :

    1. utiliser le champ width si disponible
    2. utiliser la largeur en pixels wpx si disponible
    3. utiliser le comptage de caractères wch si disponible

    Formats de nombres

    Le texte formaté cell.w pour chaque cellule est produit à partir du format cell.v et cell.z. Si le format n'est pas spécifié, le format General d'Excel est utilisé. Le format peut être spécifié soit comme une chaîne, soit comme un index dans la table des formats. Les analyseurs doivent remplir workbook.SSF avec la table des formats de nombres. Les fonctions d'écriture doivent sérialiser la table.

    Les outils personnalisés doivent s'assurer que la table locale contient chaque chaîne de format utilisée quelque part dans la table. La convention Excel exige que les formats personnalisés commencent à l'index 164. L'exemple suivant crée un format personnalisé à partir de zéro :

    Nouvelle feuille de calcul avec format personnalisé (cliquez pour afficher)```js var wb = { SheetNames: ["Sheet1"], Sheets: { Sheet1: { "!ref":"A1:C1", A1: { t:"n", v:10000 }, // <-- General format B1: { t:"n", v:10000, z: "0%" }, // <-- Builtin format C1: { t:"n", v:10000, z: "\"T\"\ #0.00" } // <-- Custom format } } } ```

    Les règles sont légèrement différentes de la façon dont Excel affiche les formats de nombres personnalisés. En particulier, les caractères littéraux doivent être entourés de guillemets doubles ou précédés d'une barre oblique inverse. Pour plus d'informations, consultez l'article de documentation Excel Create or delete a custom number format ou ECMA-376 18.8.31 (Number Formats)

    Formats de nombres par défaut (cliquer pour afficher)

    Les formats par défaut sont répertoriés dans ECMA-376 18.8.30 :

    IDFormat
    0General
    10
    20.00
    3#,##0
    4#,##0.00
    90%
    100.00%
    110.00E+00
    12# ?/?
    13# ??/??
    14m/d/yy (voir ci-dessous)
    15d-mmm-yy
    16d-mmm
    17mmm-yy
    18h:mm AM/PM
    19h:mm:ss AM/PM
    20h:mm
    21h:mm:ss
    22m/d/yy h:mm
    37#,##0 ;(#,##0)
    38#,##0 ;[Red](#,##0)
    39#,##0.00;(#,##0.00)
    40

    Le format 14 (m/d/yy) est localisé par Excel : même si le fichier spécifie ce format de nombre, il sera affiché différemment en fonction des paramètres système. Cela a du sens lorsque le producteur et le consommateur de fichiers sont dans la même locale, mais ce n'est pas toujours le cas sur Internet. Pour contourner cette ambiguïté, les fonctions d'analyse acceptent l'option dateNF pour remplacer l'interprétation de cette chaîne de format spécifique.

    Hyperliens

    Prise en charge des formats (cliquer pour afficher)

    Hyperliens de cellule : XLSX/M, XLSB, BIFF8 XLS, XLML, ODS

    Infobulles : XLSX/M, XLSB, BIFF8 XLS, XLML

    Les hyperliens sont stockés dans la clé l des objets de cellule. Le champ Target de l' objet hyperlien est la cible du lien, y compris le fragment d'URI. Les infobulles sont stockées dans le champ Tooltip et sont affichées lorsque vous déplacez votre souris sur le texte.

    Par exemple, l'extrait suivant crée un lien depuis la cellule A3 vers https://sheetjs.com avec l'info-bulle "Find us @ SheetJS.com!" :```js ws['A1'].l = { Target:"https://sheetjs.com", Tooltip:"Find us @ SheetJS.com!" };

    root@kitploit:~
    Note that Excel does not automatically style hyperlinks -- they will generally
    be displayed as normal text.
    
    _Liens distants_
    
    Les liens HTTP / HTTPS peuvent être utilisés directement :```js
    ws['A2'].l = { Target:"https://docs.sheetjs.com/#hyperlinks" };
    ws['A3'].l = { Target:"http://localhost:7262/yes_localhost_works" };
    

    Excel supporte également les liens e-mail mailto avec ligne d'objet :```js ws['A4'].l = { Target:"mailto:[email protected]" }; ws['A5'].l = { Target:"mailto:[email protected]?subject=Test Subject" };

    root@kitploit:~
    _Local Links_
    
    Les liens vers des chemins absolus doivent utiliser le schéma d'URI `file://` :```js
    ws['B1'].l = { Target:"file:///SheetJS/t.xlsx" }; /* Link to /SheetJS/t.xlsx */
    ws['B2'].l = { Target:"file:///c:/SheetJS.xlsx" }; /* Link to c:\SheetJS.xlsx */
    

    Les liens vers des chemins relatifs peuvent être spécifiés sans schéma :```js ws['B3'].l = { Target:"SheetJS.xlsb" }; /* Link to SheetJS.xlsb / ws['B4'].l = { Target:"../SheetJS.xlsm" }; / Link to ../SheetJS.xlsm */

    root@kitploit:~
    Les chemins relatifs ont un comportement indéfini dans le format SpreadsheetML 2003. Excel 2019 traitera un marqueur parent `..\` comme deux niveaux vers le haut.
    
    _Liens internes_
    
    Les liens dont la cible est une cellule, une plage ou un nom défini dans le même classeur (« Internal Links ») sont marqués par un caractère dièse en tête :```js
    ws['C1'].l = { Target:"#E2" }; /* Link to cell E2 */
    ws['C2'].l = { Target:"#Sheet2!E2" }; /* Link to cell E2 in sheet Sheet2 */
    ws['C3'].l = { Target:"#SomeDefinedName" }; /* Link to Defined Name */
    

    Commentaires de cellules

    Les commentaires de cellules sont des objets stockés dans le tableau c des objets de cellule. Le contenu réel du commentaire est divisé en blocs selon l'auteur du commentaire. Le champ a de chaque objet de commentaire est l'auteur du commentaire et le champ t est la représentation en texte brut.

    Par exemple, l'extrait suivant ajoute un commentaire de cellule dans la cellule A1 :```js if(!ws.A1.c) ws.A1.c = []; ws.A1.c.push({a:"SheetJS", t:"I'm a little comment, short and stout!"});

    root@kitploit:~
    Note : XLSB impose une limite de 54 caractères pour le nom de l'auteur. Les noms de plus de 54 caractères peuvent causer des problèmes avec d'autres formats.
    
    Pour marquer un commentaire comme normalement caché, définissez la propriété `hidden` :```js
    if(!ws.A1.c) ws.A1.c = [];
    ws.A1.c.push({a:"SheetJS", t:"This comment is visible"});
    
    if(!ws.A2.c) ws.A2.c = [];
    ws.A2.c.hidden = true;
    ws.A2.c.push({a:"SheetJS", t:"This comment will be hidden"});
    

    Commentaires en fil

    Introduits dans Excel 365, les commentaires en fil sont des extraits de commentaires en texte brut avec des métadonnées d'auteur et des références parentes. Ils sont pris en charge dans les fichiers XLSX et XLSB.

    Pour marquer un commentaire comme étant en fil, chaque partie de commentaire doit avoir une propriété T vraie :```js if(!ws.A1.c) ws.A1.c = []; ws.A1.c.push({a:"SheetJS", t:"This is not threaded"});

    if(!ws.A2.c) ws.A2.c = []; ws.A2.c.hidden = true; ws.A2.c.push({a:"SheetJS", t:"This is threaded", T: true}); ws.A2.c.push({a:"JSSheet", t:"This is also threaded", T: true});

    root@kitploit:~
    Il n'y a pas de métadonnées Active Directory ou Office 365 associées aux auteurs dans un fil de discussion.
    
    #### Visibilité des feuilles
    
    Excel permet de masquer des feuilles dans la barre d'onglets inférieure. Les données de la feuille sont stockées dans
    le fichier mais l'interface utilisateur ne les rend pas facilement accessibles. Les feuilles masquées standard
    sont révélées dans le menu "Afficher". Excel propose également des feuilles "très masquées" qui
    ne peuvent pas être révélées dans le menu. Elles ne sont accessibles que dans l'éditeur VBA !
    
    Le paramètre de visibilité est stocké dans la propriété `Hidden` du tableau de propriétés de la feuille.
    
    <details>
      <summary><b>Plus de détails</b> (cliquer pour afficher)</summary>
    
    | Valeur | Définition |
    |:-----:|:-----------|
    |   0   | Visible    |
    |   1   | Masquée    |
    |   2   | Très masquée |
    
    Avec <https://rawgit.com/SheetJS/test_files/HEAD/sheet_visibility.xlsx> :```js
    > wb.Workbook.Sheets.map(function(x) { return [x.name, x.Hidden] })
    [ [ 'Visible', 0 ], [ 'Hidden', 1 ], [ 'VeryHidden', 2 ] ]
    

    Les formats non-Excel ne prennent pas en charge l'état Très caché. La meilleure façon de vérifier si une feuille est visible est de vérifier si la propriété Hidden est logiquement vraie :```js

    wb.Workbook.Sheets.map(function(x) { return [x.name, !x.Hidden] }) [ [ 'Visible', true ], [ 'Hidden', false ], [ 'VeryHidden', false ] ]

    root@kitploit:~
    </details>
    
    #### VBA et macros
    
    Les macros VBA sont stockées dans un bloc de données spécial exposé via la propriété `vbaraw`
    de l'objet classeur lorsque l'option `bookVBA` est `true`. Elles sont
    prises en charge dans les formats `XLSM`, `XLSB` et `BIFF8 XLS`. Les rédacteurs
    de formats pris en charge insèrent automatiquement les blocs de données s'ils sont présents dans le classeur et
    les associent aux noms des feuilles de calcul.
    
    <details>
    	<summary><b>Noms de code personnalisés</b> (cliquer pour afficher)</summary>
    
    Le nom de code du classeur est stocké dans `wb.Workbook.WBProps.CodeName`. Par défaut,
    Excel écrit `ThisWorkbook` ou une phrase traduite comme `DieseArbeitsmappe`.
    Les noms de code des feuilles de calcul et des feuilles de graphiques se trouvent dans l'objet des propriétés de la feuille à
    `wb.Workbook.Sheets[i].CodeName`. Les macrosheets et les feuilles de dialogue sont ignorées.
    
    Les lecteurs et rédacteurs préservent les noms de code, mais ils doivent être définis
    manuellement lors de l'ajout d'un blob VBA à un classeur différent.
    
    </details>
    
    <details>
    	<summary><b>Macrosheets</b> (cliquer pour afficher)</summary>
    
    Les versions plus anciennes d'Excel prenaient également en charge un type de feuille "macrosheet" non-VBA qui
    stockait des commandes d'automatisation. Celles-ci sont exposées dans des objets dont la propriété `!type`
    est définie sur `"macro"`.
    
    </details>
    
    <details>
    	<summary><b>Détection des macros dans les classeurs</b> (cliquer pour afficher)</summary>
    
    Le champ `vbaraw` n'est défini que si des macros sont présentes, donc le test est simple :```js
    function wb_has_macro(wb/*:workbook*/)/*:boolean*/ {
    	if(!!wb.vbaraw) return true;
    	const sheets = wb.SheetNames.map((n) => wb.Sheets[n]);
    	return sheets.some((ws) => !!ws && ws['!type']=='macro');
    }
    
    Nom de l'optionDéfautDescription
    typeEncodage des données d'entrée (voir Type d'entrée ci-dessous)
    rawfalseSi vrai, l'analyse du texte brut n'analysera pas les valeurs **
    codepageSi spécifié, utilise la page de codes lorsque approprié **
    cellFormulatrueSauvegarde les formules dans le champ .f
    cellHTMLtrueAnalyse le texte enrichi et sauvegarde le HTML dans le champ .h
    cellNFfalseSauvegarde la chaîne de format numérique dans le champ .z
    cellStylesfalseSauvegarde les infos de style/thème dans le champ .s
    cellTexttrueGénère le texte formaté dans le champ .w
    cellDatesfalseStocke les dates comme type d (par défaut n)
    dateNFSi spécifié, utilise la chaîne pour le code de date 14 **
    sheetStubsfalseCrée des objets cellule de type z pour les cellules factices
    sheetRows0Si >0, lit les premières sheetRows lignes **
    bookDepsfalseSi vrai, analyse les chaînes de calcul
    bookFilesfalseSi vrai, ajoute les fichiers bruts à l'objet livre **
    bookPropsfalseSi vrai, analyse juste assez pour obtenir les métadonnées du livre **
    bookSheetsfalseSi vrai, analyse juste assez pour obtenir les noms des feuilles
    bookVBAfalseSi vrai, copie le blob VBA dans le champ vbaraw **
    password""Si défini et le fichier est chiffré, utilise le mot de passe **
    WTFfalseSi vrai, lève des erreurs sur les fonctionnalités inattendues du fichier **
    sheetsSi spécifié, n'analyse que les feuilles spécifiées **
    PRNfalseSi vrai, permet l'analyse des fichiers PRN **
    xlfnfalseSi vrai, préserve les préfixes _xlfn. dans les formules **
    FSRemplacement du séparateur de champ DSV
  • sheetRows-1 lignes seront générées lors de l'examen de la sortie de l'objet JSON (car la ligne d'en-tête est comptée comme une ligne lors de l'analyse des données)
  • Par défaut, toutes les feuilles de calcul sont analysées. sheets restreint en fonction du type d'entrée :
    • nombre : index de base zéro de la feuille à analyser (0 est la première feuille)
    • chaîne : nom de la feuille à analyser (insensible à la casse)
    • tableau de nombres et de chaînes pour sélectionner plusieurs feuilles.
  • bookVBA expose simplement l'objet CFB VBA brut. Il n'analyse pas les données. XLSM et XLSB stockent l'objet CFB VBA dans xl/vbaProject.bin. BIFF8 XLS mélange les entrées VBA avec l'entrée principale du classeur, donc la bibliothèque génère un nouveau blob compatible XLSB à partir du conteneur CFB XLS.
  • codepage est appliqué aux fichiers BIFF2 - BIFF5 sans enregistrements CodePage et aux fichiers CSV sans BOM dans type:"binary". BIFF8 XLS utilise toujours 1200 par défaut.
  • PRN affecte l'analyse des fichiers texte sans caractère délimiteur commun.
  • Actuellement, seul le chiffrement XOR est pris en charge. Une erreur non prise en charge sera levée pour les fichiers utilisant d'autres méthodes de chiffrement.
  • Les fonctions Excel plus récentes sont sérialisées avec le préfixe _xlfn., masqué à l'utilisateur. SheetJS supprime normalement _xlfn.. L'option xlfn les préserve.
  • WTF est principalement pour le développement. Par défaut, l'analyseur supprimera les erreurs de lecture sur les feuilles individuelles, vous permettant de lire les feuilles qui s'analysent correctement. Définir WTF:true force ces erreurs à être levées.
  • typeentrée attendue
    "base64"string : encodage Base64 du fichier
    "binary"string : chaîne binaire (l'octet n est data.charCodeAt(n))
    "string"string : chaîne JS (les caractères sont interprétés comme UTF8)
    "buffer"Buffer nodejs
    "array"array : tableau d'entiers non signés 8 bits (l'octet n est data[n])
    "file"string : chemin du fichier à lire (nodejs uniquement)
    Octet 0Type de fichier brutTypes de feuille de calcul
    0xD0Conteneur CFBBIFF 5/8 ou XLSX/XLSB protégé ou WQ3/QPW ou XLR
    0x09Flux BIFFBIFF 2/3/4/5
    0x3CXML/HTMLSpreadsheetML / Flat ODS / UOS1 / HTML / texte brut
    0x50Archive ZIPXLSB ou XLSX/M ou ODS ou UOS2 ou NUMBERS ou texte
    0x49Texte brutSYLK ou texte brut
    0x54Texte brutDIF ou texte brut
    0xEFEncodé UTF8SpreadsheetML / Flat ODS / UOS1 / HTML / texte brut
    0xFFEncodé UTF16SpreadsheetML / Flat ODS / UOS1 / HTML / texte brut
    0x00Flux d'enregistrementsLotus WK* ou Quattro Pro ou texte brut
    0x7BTexte brutRTF ou texte brut
    0x0ATexte brutSpreadsheetML / Flat ODS / UOS1 / HTML / texte brut
    0x0DTexte brutSpreadsheetML / Flat ODS / UOS1 / HTML / texte brut
    0x20Texte brutSpreadsheetML / Flat ODS / UOS1 / HTML / texte brut

    Les fichiers DBF sont détectés en fonction du premier octet ainsi que du troisième et quatrième octet (correspondant au mois et au jour de la date du fichier)

    Les fichiers Works pour Windows sont détectés en fonction de l'enregistrement BOF avec le type 0xFF

    La devinette du format de texte brut suit l'ordre de priorité :

    FormatTest
    XML<?xml apparaît dans les 1024 premiers caractères
    HTMLcommence par < et les balises HTML apparaissent dans les 1024 premiers caractères *
    XMLcommence par < et la première balise est valide
    RTFcommence par {\rt
    DSVcommence par /sep=.$/, le séparateur est le caractère spécifié
    DSVplus de caractères `
    DSVplus de caractères ; non cités que de \t ou , dans les 1024 premiers
    TSVplus de caractères \t non cités que de , dans les 1024 premiers
    CSVl'un des 1024 premiers caractères est une virgule ","
    ETHcommence par socialcalc:version:
    PRNl'option PRN est définie à true
    CSV(fallback)
    • Les balises HTML incluent : html, table, head, meta, script, style, div

    Read more

    Downloadify utilise un bouton Flash SWF pour générer des fichiers locaux, adapté aux environnements où ActiveX n'est pas disponible :```js Downloadify.create(id,{ /* other options are required! read the downloadify docs for more info */ filename: "test.xlsx", data: function() { return XLSX.write(wb, {bookType:"xlsx", type:"base64"}); }, append: false, dataType: "base64" });

    root@kitploit:~
    Le [`oldie` demo](https://github.com/weareu/xlsx/blob/HEAD/demos/oldie/) montre un scénario de repli compatible IE.
    
    </details>
    
    <details>
      <summary><b>Téléchargement de fichier via navigateur (ajax)</b> (cliquez pour afficher)</summary>
    
    Un exemple complet utilisant XHR est [inclus dans la démo XHR](https://github.com/weareu/xlsx/blob/HEAD/demos/xhr/), ainsi
    que des exemples pour fetch et les bibliothèques d'encapsulation. Cet exemple suppose que le serveur
    peut traiter des fichiers encodés en Base64 (voir la démo pour un serveur nodejs basique) :```js
    /* in this example, send a base64 string to the server */
    var wopts = { bookType:"xlsx", bookSST:false, type:"base64" };
    
    var wbout = XLSX.write(workbook,wopts);
    
    var req = new XMLHttpRequest();
    req.open("POST", "/upload", true);
    var formdata = new FormData();
    formdata.append("file", "test.xlsx"); // <-- server expects `file` to hold name
    formdata.append("data", wbout); // <-- `data` holds the base64-encoded data
    req.send(formdata);
    

    Tous les champs peuvent être traités en une fois en utilisant une transposition du tenseur 2D généré avec l'exportation sheet_to_json avec header: 1. La première ligne, si elle contient des étiquettes d'en-tête, doit être supprimée avec une tranche :```js const XLSX = require("xlsx"); const tf = require('@tensorflow/tfjs');

    /* array of arrays of the data starting on the second row / const aoa = XLSX.utils.sheet_to_json(worksheet, {header: 1}).slice(1); / dataset in the "correct orientation" / const tf_dataset = tf.tensor2d(aoa).transpose(); / pull out each dataset with a slice */ const tf_field0 = tf_dataset.slice([0,0], [1,tensor.shape[1]]).flatten(); const tf_field1 = tf_dataset.slice([1,0], [1,tensor.shape[1]]).flatten();

    root@kitploit:~
    La [démo `array`](https://github.com/weareu/xlsx/blob/HEAD/demos/array/) montre un exemple complet.
    
    </details>
    
    
    ### Génération de tableaux HTML
    
    **API**
    
    _Générer un tableau HTML à partir de la feuille de calcul_```js
    var html = XLSX.utils.sheet_to_html(worksheet);
    

    La fonction utilitaire sheet_to_html génère du code HTML basé sur les données de la feuille de calcul. Chaque cellule de la feuille de calcul est mappée à un élément <TD>. Les cellules fusionnées dans la feuille de calcul sont sérialisées en définissant les attributs colspan et rowspan.

    Exemples

    La fonction utilitaire sheet_to_html génère du code HTML qui peut être ajouté à n'importe quel élément DOM en définissant le innerHTML :```js var container = document.getElementById("tavolo"); container.innerHTML = XLSX.utils.sheet_to_html(worksheet);

    root@kitploit:~
    En combinant avec `fetch`, construire un site à partir d'un workbook est simple :
    
    <details>
      <summary><b>JS Vanille + HTML fetch workbook et générer des aperçus de tableaux</b> (cliquer pour afficher)</summary>```html
    <body>
      <style>TABLE { border-collapse: collapse; } TD { border: 1px solid; }</style>
      <div id="tavolo"></div>
      <script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script>
      <script type="text/javascript">
    (async() => {
      /* fetch and parse workbook -- see the fetch example for details */
      const workbook = XLSX.read(await (await fetch("sheetjs.xlsx")).arrayBuffer());
    
      let output = [];
      /* loop through the worksheet names in order */
      workbook.SheetNames.forEach(name => {
    
        /* generate HTML from the corresponding worksheets */
        const worksheet = workbook.Sheets[name];
        const html = XLSX.utils.sheet_to_html(worksheet);
    
        /* add a header with the title name followed by the table */
        output.push(`<H3>${name}</H3>${html}`);
      });
      /* write to the DOM at the end */
      tavolo.innerHTML = output.join("\n");
    })();
      </script>
    </body>
    

    La vuejs démo inclut davantage d'exemples React.

    CléDescription
    vvaleur brute (voir la section Data Types pour plus d'informations)
    wtexte formaté (le cas échéant)
    ttype : b Booléen, e Erreur, n Nombre, d Date, s Texte, z Stub
    fformule de la cellule encodée sous forme de chaîne de style A1 (le cas échéant)
    Fplage du tableau englobant si la formule est une formule matricielle (le cas échéant)
    Dsi vrai, la formule matricielle est dynamique (le cas échéant)
    rencodage de texte enrichi (le cas échéant)
    hrendu HTML du texte enrichi (le cas échéant)
    ccommentaires associés à la cellule
    zchaîne de format de nombre associée à la cellule (si demandé)
    lobjet de lien hypertexte de la cellule (.Target contient le lien, .Tooltip est l'info-bulle)
    sle style/thème de la cellule (le cas échéant)
    TypeDescription
    bBooléen : valeur interprétée comme un booléen JS
    eErreur : la valeur est un code numérique et la propriété w stocke le nom commun **
    nNombre : la valeur est un nombre JS **
    dDate : la valeur est un objet Date JS ou une chaîne à analyser comme Date **
    sTexte : la valeur interprétée comme une chaîne JS et écrite comme texte **
    zStub : cellule stub vide ignorée par les utilitaires de traitement de données **
    ValeurSignification de l'erreur
    0x00#NULL!
    0x07#DIV/0!
    0x0F#VALUE!
    0x17#REF!
    0x1D#NAME?
    0x24#NUM!
    0x2A#N/A
    0x2B#GETTING_DATA
    false
    cléfonction (true=désactivé / false=activé)par défaut
    selectLockedCellsSélectionner les cellules verrouilléesactivé
    selectUnlockedCellsSélectionner les cellules déverrouilléesactivé
    formatCellsFormater les cellulesdésactivé
    formatColumnsFormater les colonnesdésactivé
    formatRowsFormater les lignesdésactivé
    insertColumnsInsérer des colonnesdésactivé
    insertRowsInsérer des lignesdésactivé
    insertHyperlinksInsérer des hyperliensdésactivé
    deleteColumnsSupprimer des colonnesdésactivé
    deleteRowsSupprimer des lignesdésactivé
    sortTrierdésactivé
    autoFilterFiltrerdésactivé
    pivotTablesUtiliser les rapports de tableau croisédésactivé
    objectsModifier les objetsactivé
    scenariosModifier les scénariosactivé
    CléDescription
    SheetPortée du nom. Index de la feuille (0 = première feuille) ou null (Classeur)
    NameNom sensible à la casse. Les règles standard s'appliquent **
    RefRéférence de style A1 ("Sheet1!$A$1:$D$20")
    CommentCommentaire (applicable uniquement pour XLS/XLSX/XLSB)
    Avertir ou supprimer les informations personnelles lors de l'enregistrement
    Représentation de stockageFormatsLectureÉcriture
    Chaînes de style A1XLSX✔✔
    Chaînes de style RCXLML and plain text✔✔
    Formules analysées BIFFXLSB and all XLS formats✔
    Formules OpenFormulaODS/FODS/UOS✔✔
    Formules analysées LotusAll Lotus WK_ formats✔

    Étant donné qu'Excel interdit aux cellules nommées d'entrer en collision avec des noms de références de cellules de style A1 ou RC, une conversion par expression régulière (pas si simple) est possible. Les formules analysées BIFF et les formules analysées Lotus doivent être explicitement développées. Les formules OpenFormula peuvent être converties avec des expressions régulières.

    Les formules partagées sont décompressées et chaque cellule a la formule correspondant à sa cellule. Les créateurs n'essaient généralement pas de générer des formules partagées.

    #,##0.00;[Red](#,##0.00)
    45mm:ss
    46[h]:mm:ss
    47mmss.0
    48##0.0E+0
    49@