Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
xlsx — Fork di SheetJS xlsx 0.18.5 con correzioni per CVE-2023-30533 e CVE-2024-22363 | Kitploit
Strumenti/GitHubGitHub/weareu/xlsx
Utilità GenericheStrumenti di Crittografia/DecrittografiaRecupero DatiUtilità e Framework
GitHubweareu/xlsx

xlsx

Fork di SheetJS xlsx 0.18.5 con correzioni per CVE-2023-30533 e CVE-2024-22363

Vedi Repository
6 mesi faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

SheetJS

La SheetJS Community Edition offre soluzioni open-source collaudate per estrarre dati utili da quasi qualsiasi foglio di calcolo complesso e generare nuovi fogli di calcolo che funzioneranno con software sia legacy che moderni.

SheetJS Pro offre soluzioni che vanno oltre l'elaborazione dei dati: modifica facilmente modelli complessi; libera il tuo Picasso interiore con lo styling; crea fogli personalizzati con immagini/grafici/tabelle pivot; valuta espressioni di formule e trasporta calcoli in app web; automatizza attività comuni nei fogli di calcolo e molto altro!

License Build Status Snyk Vulnerabilities npm Downloads Analytics

Matrice di test e supporto browser

Build Status

Formati di file supportati

grafico circo del supporto dei formati

legenda del grafico

Sommario

Espandi per mostrare il Sommario
  • Per iniziare
    • Installazione
    • Utilizzo
    • La filosofia di SheetJS
    • Demo dell'ecosistema JS
  • Acquisizione ed estrazione dei dati
    • Analisi delle cartelle di lavoro
    • Elaborazione di dati JSON e JS
    • Elaborazione di tabelle HTML
  • Elaborazione dei dati
    • Modifica della struttura della cartella di lavoro
    • Modifica dei valori delle celle
    • Modifica di altre proprietà del foglio di lavoro / cartella di lavoro / cella
  • Confezionamento e rilascio dei dati
    • Scrittura di cartelle di lavoro
    • Esempi di scrittura
    • Scrittura in streaming
    • Generazione di dati JSON e JS
    • Generazione di tabelle HTML
    • Generazione di istantanee di fogli singoli
  • Interfaccia
    • Funzioni di analisi
    • Funzioni di scrittura
    • Utilità
  • Formato comune del foglio di calcolo
    • Strutture generali
    • Oggetto Cella
      • Tipi di dati
      • Date
    • Oggetti Foglio
      • Oggetto Foglio di lavoro
      • Oggetto Foglio grafico
      • Oggetto Foglio macro
      • Oggetto Foglio finestra di dialogo

Per iniziare

Installazione

Script browser standalone

Il build standalone completo per browser è salvato in dist/xlsx.full.min.js e può essere aggiunto direttamente a una pagina con un tag script:```html

root@kitploit:~
<details>
  <summary><b>Disponibilità CDN</b> (clicca per mostrare)</summary>

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

Per esempio, `unpkg` rende disponibile l'ultima versione all'indirizzo:```html
<script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script>
Build del browser (clicca per mostrare)

La versione completa a file singolo viene generata in dist/xlsx.full.min.js

dist/xlsx.core.min.js omette la libreria di codepage (nessun supporto per codifiche XLS)

Una build più snella viene generata in dist/xlsx.mini.min.js. Rispetto alla build completa:

  • libreria di codepage saltata (nessun supporto per codifiche XLS)
  • nessun supporto per XLSB / XLS / Lotus 1-2-3 / SpreadsheetML 2003 / Numbers
  • utilità di stream Node rimosse

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

root@kitploit:~
**Moduli ECMAScript**

Il build del modulo ECMAScript è salvato in `xlsx.mjs` e può essere direttamente aggiunto a una pagina con un tag `script` usando `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>

Il pacchetto npm espone anche il modulo con il parametro module, supportato in Angular e altri progetti:```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` può essere importato in Deno. È disponibile da `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

Con npm:```bash $ npm install xlsx

root@kitploit:~
Per impostazione predefinita, il modulo supporta `require`:```js
var XLSX = require("xlsx");

Il modulo include anche xlsx.mjs per l'uso con 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 e InDesign**

`dist/xlsx.extendscript.js` è una build ExtendScript per Photoshop e InDesign
che è inclusa nel pacchetto `npm`.  Può essere referenziata direttamente con una
`#include` direttiva:```extendscript
#include "xlsx.extendscript.js"
Compatibilità con Internet Explorer e ECMAScript 3 (clicca per mostrare)

Per un'ampia compatibilità con i motori JavaScript, la libreria è scritta utilizzando il dialetto ECMAScript 3 e alcune funzionalità ES5 come Array#forEach. I browser più vecchi richiedono shim per fornire funzioni mancanti.

Per utilizzare lo shim, aggiungi lo shim prima del tag script che carica xlsx.js:```html

root@kitploit:~
The script also includes `IE_LoadFile` and `IE_SaveFile` for loading and saving
files in Internet Explorer versions 6-9.  The `xlsx.extendscript.js` script
bundles the shim in a format suitable for Photoshop and other Adobe products.

</details>

### Usage

Most scenarios involving spreadsheets and data can be broken into 5 parts:

1) **Acquisire Dati**: I dati possono essere memorizzati ovunque: file locali o remoti,
   database, TABLE HTML, o addirittura generati programmaticamente nel browser.

2) **Estrarre Dati**: Per i file di foglio di calcolo, ciò implica analizzare i byte grezzi per
   leggere i dati delle celle. Per i dati JS generali, ciò implica rimodellare i dati.

3) **Elaborare Dati**: Dal generare statistiche riassuntive alla pulizia dei record di dati,
   questo passaggio è il cuore del problema.

4) **Impacchettare Dati**: Ciò può comportare la creazione di un nuovo foglio di calcolo o la serializzazione
   con `JSON.stringify` o la scrittura di XML o semplicemente l'appiattimento dei dati per strumenti UI.

5) **Rilasciare Dati**: I file di foglio di calcolo possono essere caricati su un server o scritti
   localmente. I dati possono essere presentati agli utenti in una TABLE HTML o in una griglia dati.

Un problema comune riguarda la generazione di un'esportazione valida di foglio di calcolo da dati memorizzati
in una tabella HTML. In questo esempio, una TABLE HTML nella pagina verrà raschiata,
verrà aggiunta una riga in fondo con la data del report, e verrà generato un nuovo file
e scaricato localmente. `XLSX.writeFile` si occupa di impacchettare i dati e tentare un download locale:```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");
Scarica lo strumento
  • Oggetto Cartella di lavoro
    • Proprietà del file della cartella di lavoro
  • Attributi a livello di cartella di lavoro
    • Nomi definiti
    • Viste della cartella di lavoro
    • Proprietà varie della cartella di lavoro
  • Funzionalità del documento
    • Formule
    • Proprietà di righe e colonne
    • Formati numerici
    • Collegamenti ipertestuali
    • Commenti alle celle
    • Visibilità del foglio
    • VBA e macro
  • Opzioni di analisi
    • Tipo di input
    • Identificazione del tipo di file
  • Opzioni di scrittura
    • Formati di output supportati
    • Tipo di output
  • Funzioni di utilità
    • Input come array di array
    • Input come array di oggetti
    • Input da tabella HTML
    • Output di formule
    • Output separato da delimitatore
      • Testo Unicode UTF-16
    • Output HTML
    • JSON
  • Formati di file
  • Test
    • Node
    • Browser
    • Ambienti testati
    • File di test
  • Contribuire
    • OSX/Linux
    • Windows
    • Test
  • Licenza
  • Riferimenti
  • Questa libreria cerca di semplificare i passaggi 2 e 4 con funzioni per estrarre dati utili da file di fogli di calcolo (read / readFile) e generare nuovi file di fogli di calcolo a partire dai dati (write / writeFile). Funzioni di utilità aggiuntive come table_to_book funzionano con altre fonti di dati comuni come le tabelle HTML.

    Questa documentazione e vari progetti dimostrativi coprono una serie di scenari e approcci comuni per i passaggi 1 e 5.

    Le funzioni di utilità aiutano con il passaggio 3.

    "Acquisizione ed Estrazione dei Dati" descrive soluzioni per scenari comuni di importazione dati.

    "Confezionamento e Rilascio dei Dati" descrive soluzioni per scenari comuni di esportazione dati.

    "Elaborazione dei Dati" descrive soluzioni per scenari comuni di elaborazione e manipolazione dei fogli di lavoro.

    "Funzioni di Utilità" descrive in dettaglio le funzioni di utilità per tradurre array JSON e altre strutture JS comuni in oggetti foglio di lavoro.

    La filosofia di SheetJS

    L'elaborazione dei dati dovrebbe adattarsi a qualsiasi flusso di lavoro

    La libreria non impone un ciclo di vita separato. Si integra perfettamente in siti web e applicazioni realizzati con qualsiasi framework. Gli oggetti dati JS puri funzionano bene con Web Workers e API future.

    JavaScript è un linguaggio potente per l'elaborazione dei dati

    Il "Formato Comune dei Fogli di Calcolo" è una semplice rappresentazione a oggetti dei concetti fondamentali di un foglio di lavoro. Le varie funzioni della libreria forniscono strumenti di basso livello per lavorare con l'oggetto.

    Per un'elaborazione JS amichevole, ci sono funzioni di utilità per convertire parti di un foglio di lavoro da/a un Array di Array. L'esempio seguente combina potenti metodi Array JS con una libreria di richieste di rete per scaricare dati, selezionare le informazioni che desideriamo e creare un file di foglio di lavoro:

    Ottieni Dati da un Endpoint JSON e Genera un Foglio di Lavoro (clicca per mostrare)

    L'obiettivo è generare un foglio di lavoro XLSB con i nomi e i compleanni dei Presidenti degli Stati Uniti.

    Acquisisci Dati

    Dati Grezzi

    https://theunitedstates.io/congress-legislators/executive.json contiene i dati desiderati. Ad esempio, 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:~
    _Filtraggio per Presidenti_
    
    Il dataset include Aaron Burr, un Vicepresidente che non è mai stato Presidente!
    
    `Array#filter` crea un nuovo array con le righe desiderate. Un Presidente ha servito almeno un mandato con `type` impostato a `"prez"`. Per verificare se una particolare riga ha almeno un mandato `"prez"`, `Array#some` è un'altra funzione nativa di JS. Il filtro completo sarebbe:```js
    const prez = raw_data.filter(row => row.terms.some(term => term.type === "prez"));
    

    Lining up the data

    Per questo esempio, il nome sarà il nome proprio combinato con il cognome (row.name.first + " " + row.name.last) e la data di nascita sarà il sottocampo row.bio.birthday. Utilizzando Array#map, il dataset può essere elaborato in una singola chiamata:```js const rows = prez.map(row => ({ name: row.name.first + " " + row.name.last, birthday: row.bio.birthday }));

    root@kitploit:~
    Il risultato è un array di oggetti "semplici" senza annidamento:```js
    [
      { name: "George Washington", birthday: "1732-02-22" },
      { name: "John Adams", birthday: "1735-10-19" },
      // ... one row per President
    ]
    

    Estrarre i dati

    Con il dataset pulito, XLSX.utils.json_to_sheet genera un foglio di lavoro:```js const worksheet = XLSX.utils.json_to_sheet(rows);

    root@kitploit:~
    `XLSX.utils.book_new` crea una nuova cartella di lavoro e `XLSX.utils.book_append_sheet` aggiunge un foglio di lavoro alla cartella. Il nuovo foglio di lavoro si chiamerà "Dates":```js
    const workbook = XLSX.utils.book_new();
    XLSX.utils.book_append_sheet(workbook, worksheet, "Dates");
    

    Elabora i dati

    Correggere le intestazioni

    Per impostazione predefinita, json_to_sheet crea un foglio di lavoro con una riga di intestazione. In questo caso, le intestazioni provengono dalle chiavi dell'oggetto JS: "name" e "birthday".

    Le intestazioni sono nelle celle A1 e B1. XLSX.utils.sheet_add_aoa può scrivere valori di testo nel foglio di lavoro esistente a partire dalla cella A1:```js XLSX.utils.sheet_add_aoa(worksheet, [["Name", "Birthday"]], { origin: "A1" });

    root@kitploit:~
    _Fissaggio delle Larghezze delle Colonne_
    
    Alcuni nomi sono più lunghi della larghezza predefinita delle colonne.  Le larghezze delle colonne vengono impostate tramite [l'impostazione della proprietà `"!cols"` del foglio di lavoro](#row-and-column-properties).
    
    La seguente riga imposta la larghezza della colonna A a circa 10 caratteri:```js
    worksheet["!cols"] = [ { wch: 10 } ]; // set column A width to 10 characters
    

    Una chiamata Array#reduce su rows può calcolare la larghezza massima:```js const max_width = rows.reduce((w, r) => Math.max(w, r.name.length), 10); worksheet["!cols"] = [ { wch: max_width } ];

    root@kitploit:~
    **Nota:** Se il punto di partenza era un file o una tabella HTML, `XLSX.utils.sheet_to_json`
    genererà un array di oggetti JS.
    
    **Dati del pacchetto e della release**
    
    `XLSX.writeFile` crea un file di foglio di calcolo e prova a scriverlo nel sistema.
    Nel browser, cercherà di chiedere all'utente di scaricare il file.  In NodeJS,
    scriverà nella directory locale.```js
    XLSX.writeFile(workbook, "Presidents.xlsx");
    

    Esempio Completo```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:~
    Per l'uso nel browser web, supponendo che lo snippet sia salvato come `snippet.js`, si devono usare tag script per includere le build standalone di `axios` e `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>
    

    I formati dei file sono dettagli implementativi

    Il parser copre un'ampia gamma di formati di file di fogli di calcolo comuni per garantire che i file "HTML salvato come XLS" funzionino così come i file XLS o XLSX veri e propri.

    Lo scrittore supporta una serie di formati di output comuni per un'ampia compatibilità con l'ecosistema dei dati.

    Per quanto possibile, il codice di elaborazione dei dati non dovrebbe preoccuparsi dei formati di file specifici coinvolti.

    Demo dell'ecosistema JS

    La directory demos include progetti di esempio per:

    Framework e API

    • angularjs
    • angular and ionic
    • knockout
    • meteor
    • react and react-native
    • vue 2.x and weex
    • XMLHttpRequest and fetch
    • nodejs server
    • databases and key/value stores
    • typed arrays and math

    Bundler e strumenti

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

    Piattaforme e integrazioni

    • deno
    • electron application
    • nw.js application
    • Chrome / Chromium extensions
    • Scaricare un Google Sheet localmente
    • Adobe ExtendScript
    • Headless Browsers
    • canvas-datagrid
    • x-spreadsheet
    • react-data-grid
    • vue3-table-light
    • Swift JSC e altri motori
    • "serverless" functions
    • internet explorer

    Altri esempi sono inclusi nella vetrina.

    https://sheetjs.com/demos/modify.html mostra un esempio completo di lettura, modifica e scrittura di file.

    https://github.com/SheetJS/sheetjs/blob/HEAD/bin/xlsx.njs è lo strumento da riga di comando incluso con le installazioni di Node, che legge file di fogli di calcolo ed esporta i contenuti in vari formati.

    Acquisizione ed Estrazione dei Dati

    Parsing dei Workbook

    API

    Estrarre dati da byte di fogli di calcolo```js var workbook = XLSX.read(data, opts);

    root@kitploit:~
    Il metodo `read` può estrarre dati da byte di foglio di calcolo memorizzati in una stringa JS, "binary string", buffer NodeJS o array tipizzato (`Uint8Array` o `ArrayBuffer`).
    
    _Leggi i byte del foglio di calcolo da un file locale ed estrai i dati_```js
    var workbook = XLSX.readFile(filename, opts);
    

    Il metodo readFile prova a leggere un file di foglio elettronico nel percorso fornito. I browser generalmente non consentono la lettura di file in questo modo (è considerato un rischio per la sicurezza) e i tentativi di lettura genereranno un errore.

    Il secondo argomento opts è opzionale. "Opzioni di Parsing" descrive le proprietà e i comportamenti supportati.

    Esempi

    Ecco alcuni scenari comuni (clicca su ogni sottotitolo per vedere il codice):

    File locale in un server NodeJS (clicca per mostrare)

    readFile usa fs.readFileSync internamente:```js var XLSX = require("xlsx");

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

    root@kitploit:~
    Per Node ESM, l'helper `readFile` non è abilitato. Invece, `fs.readFileSync` dovrebbe essere usato per leggere i dati del file come `Buffer` per l'utilizzo con `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);
    
    File locale in un'applicazione Deno (click per mostrare)

    readFile utilizza Deno.readFileSync internamente:```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>File inviato dall'utente in una pagina web ("Drag-and-Drop")</b> (clicca per visualizzare)</summary>
    
    Per i siti web moderni che targettizzano Chrome 76+, si consiglia `File#arrayBuffer`:```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);
    

    Per una compatibilità massima, dovrebbe essere utilizzata l'API FileReader:```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/> dimostra la tecnica FileReader.
    
    </details>
    
    <details>
      <summary><b>File inviato dall'utente con un elemento INPUT HTML</b> (clicca per mostrare)</summary>
    
    Partendo da un elemento INPUT HTML con `type="file"`:```html
    <input type="file" id="input_dom_element">
    

    Per i siti web moderni che hanno come target Chrome 76+, si consiglia Blob#arrayBuffer:```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:~
    Per un supporto più ampio (incluso IE10+), si consiglia l'approccio `FileReader`:```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);
    

    Il oldie demo mostra uno scenario di fallback compatibile con IE.

    Recupero di un file nel browser web ("Ajax") (clicca per mostrare)

    Per i siti web moderni che hanno come target Chrome 42+, fetch è consigliato:```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:~
    Per un supporto più ampio, l'approccio `XMLHttpRequest` è raccomandato:```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();
    

    The xhr demo include una discussione più approfondita e ulteriori esempi.

    http://oss.sheetjs.com/sheetjs/ajax.html mostra approcci di fallback per IE6+.

    File locale in un plugin PhotoShop o InDesign (clicca per mostrare)

    readFile incapsula la logica File in Photoshop e altri target ExtendScript. Il percorso specificato deve essere un percorso assoluto:```js #include "xlsx.extendscript.js"

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

    root@kitploit:~
    The [`extendscript` demo](https://github.com/weareu/xlsx/blob/HEAD/demos/extendscript/) include un esempio più complesso.
    
    </details>
    
    <details>
      <summary><b>File locale in un'app Electron</b> (clicca per mostrare)</summary>
    
    `readFile` può essere usato nel processo renderer:```js
    /* From the renderer process */
    var XLSX = require("xlsx");
    
    var workbook = XLSX.readFile(path);
    

    Le API di Electron sono cambiate nel tempo. La demo electron mostra un esempio completo e descrive le impostazioni specifiche per versione richieste.

    File locale in un'app mobile con React Native (clicca per mostrare)

    La demo react include un'app React Native di esempio.

    Poiché React Native non fornisce un modo per leggere file dal filesystem, è necessario utilizzare una libreria di terze parti. Le seguenti librerie sono state testate:

    • react-native-file-access

    La codifica base64 restituisce stringhe compatibili con il tipo 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)
    
    La codifica `ascii` restituisce stringhe binarie compatibili con il tipo `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"});
    
    Caricamenti di file su server NodeJS (clicca per mostrare)

    read può accettare un buffer NodeJS. readFile può leggere file generati da un parser del corpo di una richiesta HTTP POST come 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) contiene esempi più avanzati.
    
    </details>
    
    <details>
      <summary><b>Scaricare file in un processo NodeJS</b> (clicca per mostrare)</summary>
    
    Node 17.5 e 18.0 hanno supporto nativo per fetch:```js
    const XLSX = require("xlsx");
    
    const data = await (await fetch(url)).arrayBuffer();
    /* data is an ArrayBuffer */
    const workbook = XLSX.read(data);
    

    Per una maggiore compatibilità, si consigliano moduli di terze parti.

    request richiede una codifica null per produrre 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) funziona allo stesso modo nel browser e in 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 */
    })();
    
    Scaricare file in un'app Electron (clicca per mostrare)

    Il modulo net nel processo principale può effettuare richieste HTTP/HTTPS a risorse esterne. Le risposte devono essere concatenate manualmente usando 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>Stream leggibili in NodeJS</b> (clicca per mostrare)</summary>
    
    Quando si ha a che fare con flussi leggibili (Readable Streams), l'approccio più semplice è quello di bufferizzare il flusso ed elaborare l'intero contenuto alla fine:```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 nel browser (clicca per mostrare)

    Quando si ha a che fare con ReadableStream, l'approccio più semplice è bufferizzare lo stream ed elaborare il tutto alla fine:```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>
    
    Esempi più dettagliati sono coperti nelle [demo incluse](https://github.com/weareu/xlsx/blob/HEAD/demos/)
    
    ### Elaborazione di dati JSON e JS
    
    I dati JSON e JS tendono a rappresentare singoli fogli di lavoro. Questa sezione utilizzerà alcune funzioni di utilità per generare cartelle di lavoro.
    
    _Crea un nuovo Workbook_```js
    var workbook = XLSX.utils.book_new();
    

    La funzione di utilità book_new crea una cartella di lavoro vuota senza fogli di lavoro.

    Il software per fogli di calcolo generalmente richiede almeno un foglio di lavoro e impone tale requisito nell'interfaccia utente. Questa libreria impone il requisito al momento della scrittura, generando errori se una cartella di lavoro vuota viene passata alle funzioni di scrittura.

    API

    Crea un foglio di lavoro da un array di array di valori JS```js var worksheet = XLSX.utils.aoa_to_sheet(aoa, opts);

    root@kitploit:~
    La funzione di utilità `aoa_to_sheet` esamina un "array di array" in ordine per righe, generando un oggetto foglio di lavoro. Il seguente frammento genera un foglio con la cella `A1` impostata alla stringa `A1`, la cella `B1` impostata a `B1`, ecc.:```js
    var worksheet = XLSX.utils.aoa_to_sheet([
      ["A1", "B1", "C1"],
      ["A2", "B2", "C2"],
      ["A3", "B3", "C3"]
    ]);
    

    "Input di Array di Array" descrive la funzione e l'argomento facoltativo opts in maggior dettaglio.

    Crea un foglio di lavoro da un array di oggetti JS```js var worksheet = XLSX.utils.json_to_sheet(jsa, opts);

    root@kitploit:~
    La funzione di utilità `json_to_sheet` attraversa un array di oggetti JS in ordine,
    generando un oggetto foglio di lavoro. Per impostazione predefinita, genererà una riga di intestazione e
    una riga per ogni oggetto nell'array. L'argomento opzionale `opts` ha impostazioni per
    controllare l'ordine delle colonne e l'output dell'intestazione.
    
    ["Input di Array di Oggetti"](#array-of-arrays-input) descrive la funzione e
    l'argomento opzionale `opts` in maggior dettaglio.
    
    **Esempi**
    
    ["Lo Zen di SheetJS"](#the-zen-of-sheetjs) contiene un esempio dettagliato "Ottenere Dati
    da un Endpoint JSON e Generare una Cartella di Lavoro"
    
    
    [`x-spreadsheet`](https://github.com/myliang/x-spreadsheet) è una griglia di dati interattiva
    per visualizzare in anteprima e modificare dati strutturati nel browser web. La
    [demo di `xspreadsheet`](https://github.com/weareu/xlsx/blob/HEAD/demos/xspreadsheet) include uno script di esempio con la
    funzione `xtos` per convertire da oggetto dati x-spreadsheet a una cartella di lavoro.
    <https://oss.sheetjs.com/sheetjs/x-spreadsheet> è una demo live.
    
    <details>
      <summary><b>Record da una query del database (SQL o no-SQL)</b> (clicca per mostrare)</summary>
    
    La [demo del `database`](https://github.com/weareu/xlsx/blob/HEAD/demos/database/) include esempi di lavoro con
    database e risultati di query.
    
    </details>
    
    
    <details>
      <summary><b>Calcoli Numerici con TensorFlow.js</b> (clicca per mostrare)</summary>
    
    [`@tensorflow/tfjs`](https://github.com/weareu/xlsx/blob/HEAD/@tensorflow/tfjs) e altre librerie si aspettano dati in array
    semplici, ben adatti a fogli di lavoro dove ogni colonna è un vettore di dati. Questa è
    la trasposizione di come la maggior parte delle persone usa i fogli elettronici, dove ogni riga è un vettore.
    
    Quando si recuperano dati da `tfjs`, i punti dati restituiti sono memorizzati in un array
    tipizzato. Un array di array può essere costruito con cicli. `Array#unshift` può
    preporre una riga di titolo prima della conversione:```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);
    

    The array demo mostra un esempio completo.

    Elaborazione di tabelle HTML

    API

    Crea un foglio di lavoro estraendo una tabella HTML nella pagina```js var worksheet = XLSX.utils.table_to_sheet(dom_element, opts);

    root@kitploit:~
    La funzione di utilità `table_to_sheet` prende un elemento DOM TABLE e itera attraverso le righe per generare un foglio di lavoro.  L'argomento `opts` è opzionale.
    ["Input tabella HTML"](#html-table-input) descrive la funzione in maggior dettaglio.
    
    
    
    _Crea una cartella di lavoro estraendo una tabella HTML dalla pagina_```js
    var workbook = XLSX.utils.table_to_book(dom_element, opts);
    

    The table_to_book utility function follows the same logic as table_to_sheet. After generating a worksheet, it creates a blank workbook and appends the spreadsheet.

    The options argument supports the same options as table_to_sheet, with the addition of a sheet property to control the worksheet name. If the property is missing or no options are specified, the default name Sheet1 is used.

    Esempi

    Ecco alcuni scenari comuni (clicca su ogni sottotitolo per vedere il codice):

    Elemento HTML TABLE in una pagina web (clicca per mostrare)```html
    SheetJS
    1234567
    root@kitploit:~
    Più tabelle in una pagina web possono essere convertite in fogli di lavoro individuali:```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 */
    

    In alternativa, il codice HTML può essere estratto e analizzato:```js var htmlstr = document.getElementById("tableau").outerHTML; var workbook = XLSX.read(htmlstr, {type:"string"});

    root@kitploit:~
    </details>
    
    <details>
      <summary><b>Estensione Chrome/Chromium</b> (click per mostrare)</summary>
    
    La demo [`chrome`](https://github.com/weareu/xlsx/blob/HEAD/demos/chrome/) mostra un esempio completo e descrive le
    autorizzazioni richieste e altre impostazioni.
    
    In un'estensione, si consiglia di generare la cartella di lavoro in un content script
    e passare l'oggetto all'estensione:```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);
    });
    
    Tabelle HTML lato server con Headless Chrome (clicca per mostrare)

    La demo headless include una demo completa per convertire file HTML in workbook XLSB. L'idea principale è aggiungere lo script alla pagina, analizzare la tabella nel contesto della pagina, generare un workbook in base64 e inviarlo indietro per ulteriori elaborazioni:```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>Tabelle HTML lato server con WebKit headless</b> (clicca per mostrare)</summary>
    
    La demo [`headless`](https://github.com/weareu/xlsx/blob/HEAD/demos/headless/) include una demo completa per convertire file HTML in workbook XLSB utilizzando [PhantomJS](https://phantomjs.org/). L'idea principale è aggiungere lo script alla pagina, analizzare la tabella nel contesto della pagina, generare un workbook `binary` e inviarlo per ulteriori elaborazioni:```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();
      });
    });
    
    Tabelle HTML NodeJS senza browser (clicca per mostrare)

    NodeJS non include un'implementazione DOM e Puppeteer richiede una pesante build di Chromium. jsdom è un'alternativa leggera:```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>
    
    ## Elaborazione dei Dati
    
    Il ["Formato Foglio di Calcolo Comune"](#common-spreadsheet-format) è una semplice rappresentazione oggetto dei concetti fondamentali di una cartella di lavoro. Le funzioni di utilità lavorano con la rappresentazione oggetto e sono progettate per gestire casi d'uso comuni.
    
    ### Modifica della Struttura della Cartella di Lavoro
    
    **API**
    
    _Aggiungi un Foglio di Lavoro a una Cartella di Lavoro_```js
    XLSX.utils.book_append_sheet(workbook, worksheet, sheet_name);
    

    La funzione di utilità book_append_sheet aggiunge un foglio di lavoro alla cartella di lavoro. Il terzo argomento specifica il nome desiderato del foglio di lavoro. È possibile aggiungere più fogli di lavoro a una cartella di lavoro chiamando la funzione più volte. Se il nome del foglio di lavoro è già utilizzato nella cartella di lavoro, verrà generato un errore.

    Aggiungi un foglio di lavoro a una cartella di lavoro e trova un nome univoco```js var new_name = XLSX.utils.book_append_sheet(workbook, worksheet, name, true);

    root@kitploit:~
    Se il quarto argomento è `true`, la funzione partirà dal nome del foglio di lavoro specificato. Se il nome del foglio esiste già nella cartella di lavoro, verrà scelto un nuovo nome di foglio trovando la radice del nome e incrementando il contatore:```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
    

    Elenca i nomi dei Worksheet in ordine di tab```js var wsnames = workbook.SheetNames;

    root@kitploit:~
    La proprietà `SheetNames` dell'oggetto workbook è un elenco dei nomi dei fogli di lavoro
    in "ordine di tabulazione".  Le funzioni API guarderanno questo array.
    
    _Sostituire un foglio di lavoro sul posto_```js
    workbook.Sheets[sheet_name] = new_worksheet;
    

    La proprietà Sheets dell'oggetto workbook è un oggetto le cui chiavi sono nomi e i cui valori sono oggetti worksheet. Riassegnando a una proprietà dell'oggetto Sheets, l'oggetto worksheet può essere modificato senza interrompere il resto della struttura del worksheet.

    Esempi

    Aggiungere un nuovo foglio di lavoro a un workbook (clicca per mostrare)

    Questo esempio usa 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>
    
    ### Modifica dei valori delle celle
    
    **API**
    
    _Modificare un singolo valore di cella in un foglio di lavoro_```js
    XLSX.utils.sheet_add_aoa(worksheet, [[new_value]], { origin: address });
    

    Modificare più valori di celle in un foglio di lavoro```js XLSX.utils.sheet_add_aoa(worksheet, aoa, opts);

    root@kitploit:~
    La funzione di utilità `sheet_add_aoa` modifica i valori delle celle in un foglio di lavoro.  Il
    primo argomento è l'oggetto foglio di lavoro.  Il secondo argomento è un array di
    array di valori.  La chiave `origin` del terzo argomento controlla dove le celle
    verranno scritte.  Il seguente frammento imposta `B3=1` e `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" });
    

    "Input di Array di Array" descrive la funzione e l'argomento opzionale opts in maggior dettaglio.

    Opzioni di Parsing

    Le funzioni esportate read e readFile accettano un argomento di opzioni:

    • Anche se cellNF è false, il testo formattato verrà generato e salvato in .w
    • In alcuni casi, i fogli possono essere analizzati anche se bookSheets è false.
    • Excel cerca aggressivamente di interpretare i valori da CSV e altri testi semplici. Questo porta a comportamenti sorprendenti! L'opzione raw sopprime l'analisi dei valori.
    • bookSheets e bookProps si combinano per dare entrambi i set di informazioni
    • Deps sarà un oggetto vuoto se bookDeps è false
    • Il comportamento di bookFiles dipende dal tipo di file:
      • Array keys (percorsi nello ZIP) per formati basati su ZIP
      • Hash files (mappatura percorsi a oggetti che rappresentano i file) per ZIP
      • Oggetto cfb per formati che usano contenitori CFB

    Tipo di Input

    Le stringhe possono essere interpretate in più modi. Il parametro type per read dice alla libreria come analizzare l'argomento dati:

    Riconoscimento del Tipo di File

    Dettagli di implementazione (clicca per mostrare)

    Excel e altri strumenti per fogli di calcolo leggono i primi byte e applicano altre euristiche per determinare il tipo di file. Ciò consente il punning del tipo di file: rinominare i file con estensione .xls dirà al tuo computer di usare Excel per aprire il file, ma Excel saprà come gestirlo. Questa libreria applica una logica simile:

    Perché file di testo casuali sono validi? (clicca per mostrare)

    Excel è estremamente aggressivo nella lettura dei file. Aggiungere un'estensione XLS a qualsiasi file di testo visualizzato (dove gli unici caratteri sono caratteri di visualizzazione ANSI) inganna Excel facendogli pensare che il file sia potenzialmente un file CSV o TSV, anche se è solo una colonna! Questa libreria cerca di replicare quel comportamento.

    L'approccio migliore è validare il foglio di lavoro desiderato e assicurarsi che abbia il numero previsto di righe o colonne. Estrarre l'intervallo è estremamente semplice:```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>
    
    ## Opzioni di scrittura
    
    Le funzioni esportate `write` e `writeFile` accettano un argomento opzioni:
    
    | Nome opzione   |  Valore predefinito | Descrizione                                         |
    | :------------- | ------------------: | :-------------------------------------------------- |
    |`type`          |                     | Codifica dei dati di output (vedi Tipo di output di seguito) |
    |`cellDates`     |  `false`            | Memorizza le date come tipo `d` (predefinito è `n`) |
    |`bookSST`       |  `false`            | Genera la tabella delle stringhe condivise **       |
    |`bookType`      | `"xlsx"`            | Tipo di cartella di lavoro (vedi formati supportati di seguito) |
    |`sheet`         |     `""`            | Nome del foglio di lavoro per formati a foglio singolo ** |
    |`compression`   |  `false`            | Usa compressione ZIP per formati basati su ZIP **   |
    |`Props`         |                     | Sovrascrive le proprietà della cartella di lavoro durante la scrittura ** |
    |`themeXLSX`     |                     | Sovrascrive il tema XML durante la scrittura di XLSX/XLSB/XLSM ** |
    |`ignoreEC`      |   `true`            | Sopprime gli errori "numero come testo" **          |
    |`numbers`       |                     | Payload per esportazione NUMBERS **                 |
    
    - `bookSST` è più lento e utilizza più memoria, ma ha una migliore compatibilità
      con versioni obsolete di iOS Numbers
    - I dati grezzi sono l'unica cosa garantita da salvare. Le funzionalità non descritte
      in questo README potrebbero non essere serializzate.
    - `cellDates` si applica solo all'output XLSX e non è garantito che funzioni con
      lettori di terze parti. Excel stesso di solito non scrive celle con tipo `d`,
      quindi strumenti non Excel potrebbero ignorare i dati o generare errori in presenza di date.
    - `Props` è un oggetto che rispecchia il campo `Props` della cartella di lavoro. Vedi la tabella
      nella sezione [Proprietà del file della cartella di lavoro](#workbook-file-properties).
    - Se specificata, la stringa da `themeXLSX` verrà salvata come tema principale
      per i file XLSX/XLSB/XLSM (in `xl/theme/theme1.xml` all'interno del ZIP).
    - A causa di un bug nel programma, alcune funzionalità come "Testo in colonne" causeranno il crash
      di Excel nei fogli di lavoro in cui gli errori vengono ignorati. Lo scrittore contrassegnerà
      i file per ignorare l'errore per impostazione predefinita. Imposta `ignoreEC` su `false` per sopprimerlo.
    - A causa delle dimensioni dei dati, i dati NUMBERS non sono inclusi per impostazione predefinita. Gli script
      `xlsx.zahl.js` e `xlsx.zahl.mjs` inclusi contengono i dati.
    
    ### Formati di output supportati
    
    Per un'ampia compatibilità con strumenti di terze parti, questa libreria supporta molti
    formati di output. Il tipo di file specifico è controllato con l'opzione `bookType`:
    
    | `bookType` | estensione file | contenitore | fogli | Descrizione                     |
    | :--------- | --------------: | :---------: | :---- |:------------------------------- |
    | `xlsx`     | `.xlsx`         |    ZIP      | multi | Formato XML Excel 2007+          |
    | `xlsm`     | `.xlsm`         |    ZIP      | multi | Formato XML con macro Excel 2007+|
    | `xlsb`     | `.xlsb`         |    ZIP      | multi | Formato binario Excel 2007+      |
    | `biff8`    | `.xls`          |    CFB      | multi | Formato cartella di lavoro Excel 97-2004|
    | `biff5`    | `.xls`          |    CFB      | multi | Formato cartella di lavoro Excel 5.0/95|
    | `biff4`    | `.xls`          |   nessuno   | singolo| Formato foglio di lavoro Excel 4.0|
    | `biff3`    | `.xls`          |   nessuno   | singolo| Formato foglio di lavoro Excel 3.0|
    | `biff2`    | `.xls`          |   nessuno   | singolo| Formato foglio di lavoro Excel 2.0|
    | `xlml`     | `.xls`          |   nessuno   | multi  | Excel 2003-2004 (SpreadsheetML) |
    | `numbers`  |`.numbers`       |    ZIP      | singolo| Foglio di calcolo Numbers 3.0+   |
    | `ods`      | `.ods`          |    ZIP      | multi  | Foglio di calcolo OpenDocument   |
    | `fods`     | `.fods`         |   nessuno   | multi  | Foglio di calcolo OpenDocument piatto|
    | `wk3`      | `.wk3`          |   nessuno   | multi  | Cartella di lavoro Lotus (WK3)   |
    | `csv`      | `.csv`          |   nessuno   | singolo| Valori separati da virgola       |
    | `txt`      | `.txt`          |   nessuno   | singolo| Testo Unicode UTF-16 (TXT)       |
    | `sylk`     | `.sylk`         |   nessuno   | singolo| Collegamento simbolico (SYLK)    |
    | `html`     | `.html`         |   nessuno   | singolo| Documento HTML                   |
    | `dif`      | `.dif`          |   nessuno   | singolo| Formato scambio dati (DIF)       |
    | `dbf`      | `.dbf`          |   nessuno   | singolo| dBASE II + estensioni VFP (DBF)  |
    | `wk1`      | `.wk1`          |   nessuno   | singolo| Foglio di lavoro Lotus (WK1)     |
    | `rtf`      | `.rtf`          |   nessuno   | singolo| Formato Rich Text (RTF)          |
    | `prn`      | `.prn`          |   nessuno   | singolo| Testo formattato Lotus           |
    | `eth`      | `.eth`          |   nessuno   | singolo| Formato record Ethercalc (ETH)   |
    
    - `compression` si applica solo ai formati con contenitori ZIP.
    - I formati che supportano un solo foglio richiedono l'opzione `sheet` che specifica
      il foglio di lavoro. Se la stringa è vuota, viene utilizzato il primo foglio.
    - `writeFile` indovinerà automaticamente il formato del file di output in base all'estensione
      del file se `bookType` non viene specificato. Sceglierà il primo formato nella
      tabella sopra che corrisponde all'estensione.
    
    ### Tipo di output
    
    L'argomento `type` per `write` rispecchia l'argomento `type` per `read`:
    
    | `type`     | output                                                          |
    |------------|-----------------------------------------------------------------|
    | `"base64"` | stringa: codifica Base64 del file                               |
    | `"binary"` | stringa: stringa binaria (il byte `n` è `data.charCodeAt(n)`)   |
    | `"string"` | stringa: stringa JS (i caratteri interpretati come UTF8)        |
    | `"buffer"` | Buffer nodejs                                                   |
    | `"array"`  | ArrayBuffer, array di fallback di interi senza segno a 8 bit    |
    | `"file"`   | stringa: percorso del file che verrà creato (solo nodejs)       |
    
    - Per compatibilità con Excel, l'output `csv` includerà sempre il byte order mark
      UTF-8.
    
    ## Funzioni di utilità
    
    Le funzioni `sheet_to_*` accettano un foglio di lavoro e un oggetto opzioni opzionale.
    
    Le funzioni `*_to_sheet` accettano un oggetto dati e un oggetto opzioni opzionale.
    
    Gli esempi si basano sul seguente foglio di lavoro:```
    XXX| A | B | C | D | E | F | G |
    ---+---+---+---+---+---+---+---+
     1 | S | h | e | e | t | J | S |
     2 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
     3 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
    

    Esempi

    Aggiungere righe a un foglio di lavoro (clicca per mostrare)

    Il valore speciale di origine -1 indica a sheet_add_aoa di iniziare nella colonna A della riga successiva all'ultima riga nell'intervallo, aggiungendo i dati:```js XLSX.utils.sheet_add_aoa(worksheet, [ ["first row after data", 1], ["second row after data", 2] ], { origin: -1 });

    root@kitploit:~
    </details>
    
    
    ### Modifica di altre proprietà di foglio di lavoro / cartella di lavoro / cella
    
    La sezione ["Common Spreadsheet Format"](#common-spreadsheet-format) descrive
    le strutture degli oggetti in maggior dettaglio.
    
    ## Impacchettamento e rilascio dei dati
    
    ### Scrittura di cartelle di lavoro
    
    **API**
    
    _Genera byte del foglio di calcolo (file) dai dati_```js
    var data = XLSX.write(workbook, opts);
    

    Il metodo write tenta di impacchettare i dati dal workbook in un file in memoria. Di default, vengono generati file XLSX, ma ciò può essere controllato con la proprietà bookType dell'argomento opts. In base all'opzione type, i dati possono essere memorizzati come "stringa binaria", stringa JS, Uint8Array o Buffer.

    Il secondo argomento opts è obbligatorio. "Opzioni di scrittura" copre le proprietà e i comportamenti supportati.

    Genera e tenta di salvare il file```js XLSX.writeFile(workbook, filename, opts);

    root@kitploit:~
    Il metodo `writeFile` impacchetta i dati e tenta di salvare il nuovo file. Il formato del file di esportazione è determinato dall'estensione di `filename` (`SheetJS.xlsx` indica esportazione XLSX, `SheetJS.xlsb` indica esportazione XLSB, ecc.).
    
    Il metodo `writeFile` utilizza API specifiche della piattaforma per avviare il salvataggio del file. In NodeJS, `fs.readFileSync` può creare un file. Nel browser web, viene tentato un download utilizzando l'attributo `download` di HTML5, con fallback per IE.
    
    _Genera e tenta di salvare un file XLSX_```js
    XLSX.writeFileXLSX(workbook, filename, opts);
    

    Il metodo writeFile incorpora una serie di funzioni di esportazione differenti. Ciò è ottimo per l'esperienza dello sviluppatore ma non è adatto al tree shaking con gli attuali strumenti di sviluppo. Quando sono necessarie solo esportazioni XLSX, questo metodo evita di fare riferimento alle altre funzioni di esportazione.

    Il secondo argomento opts è opzionale. "Opzioni di Scrittura" copre le proprietà e i comportamenti supportati.

    Esempi

    File locale in un server NodeJS (clicca per mostrare)

    writeFile utilizza fs.writeFileSync in ambienti server:```js var XLSX = require("xlsx");

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

    root@kitploit:~
    Per Node ESM, l'helper `writeFile` non è abilitato. Invece, `fs.writeFileSync` dovrebbe essere usato per scrivere i dati del file in un `Buffer` da utilizzare con `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);
    
    File locale in un'applicazione Deno (clicca per mostrare)

    writeFile usa Deno.writeFileSync sotto il cofano:```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:~
    Le applicazioni che scrivono file devono essere invocate con il flag `--allow-write`. La
    [`deno` demo](https://github.com/weareu/xlsx/blob/HEAD/demos/deno/) contiene ulteriori esempi
    
    </details>
    
    <details>
      <summary><b>File locale in un plugin di PhotoShop o InDesign</b> (clicca per mostrare)</summary>
    
    `writeFile` incapsula la logica `File` in Photoshop e in altri target di ExtendScript.
    Il percorso specificato deve essere un percorso assoluto:```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 */
    

    The extendscript demo include un esempio più complesso.

    Scaricare un file nel browser sul computer dell'utente (clicca per mostrare)

    XLSX.writeFile racchiude alcune tecniche per attivare il salvataggio di un file:

    • L'API URL del browser crea un URL oggetto per il file, che la libreria utilizza creando un link e forzando un clic. È supportata nei browser moderni.
    • msSaveBlob è un'API IE10+ per attivare il salvataggio di un file.
    • IE_FileSave utilizza VBScript e ActiveX per scrivere un file in IE6+ per Windows XP e Windows 7. Lo shim deve essere incluso nella pagina HTML contenente.

    Non esiste un modo standard per determinare se il file effettivo è stato scaricato.```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>Scaricare un file in browser legacy</b> (clicca per mostrare)</summary>
    
    `XLSX.writeFile` le tecniche funzionano per la maggior parte dei browser moderni e anche per le versioni precedenti di IE.
    Per browser molto più datati, esistono soluzioni alternative implementate da librerie wrapper.
    
    [`FileSaver.js`](https://github.com/eligrey/FileSaver.js/) implementa `saveAs`.
    Nota: `XLSX.writeFile` chiamerà automaticamente `saveAs` se disponibile.```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");
    
    PhantomJS (Headless Webkit) Generazione di file (clicca per mostrare)

    La demo headless include una demo completa per convertire file HTML in workbook XLSB utilizzando PhantomJS. PhantomJS fs.write supporta la scrittura di file dal processo principale ma ha un'interfaccia diversa dal modulo fs di 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:~
    Nota: La sezione ["Elaborazione di tabelle HTML"](#processing-html-tables) mostra come
    generare un workbook da tabelle HTML in una pagina in "Headless WebKit".
    
    </details>
    
    
    
    Le [demo incluse](https://github.com/weareu/xlsx/blob/HEAD/demos/) coprono app mobili e altre distribuzioni speciali.
    
    ### Esempi di scrittura
    
    - <http://sheetjs.com/demos/table.html> esportazione di una tabella HTML
    - <http://sheetjs.com/demos/writexlsx.html> genera un file semplice
    
    ### Scrittura in streaming
    
    Le funzioni di scrittura in streaming sono disponibili nell'oggetto `XLSX.stream`. Esse
    accettano gli stessi argomenti delle normali funzioni di scrittura ma restituiscono uno stream leggibile di NodeJS.
    
    - `XLSX.stream.to_csv` è la versione in streaming di `XLSX.utils.sheet_to_csv`.
    - `XLSX.stream.to_html` è la versione in streaming di `XLSX.utils.sheet_to_html`.
    - `XLSX.stream.to_json` è la versione in streaming di `XLSX.utils.sheet_to_json`.
    
    <details>
      <summary><b>nodejs convertire in CSV e scrivere file</b> (clicca per mostrare)</summary>```js
    var output_file_name = "out.csv";
    var stream = XLSX.stream.to_csv(worksheet);
    stream.pipe(fs.createWriteStream(output_file_name));
    
    nodejs scrive flusso JSON su schermo (clicca per mostrare)```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>Esportazione di file NUMBERS</b> (clicca per mostrare)</summary>
    
    Lo scrittore NUMBERS richiede una base abbastanza grande.  Gli script supplementari `xlsx.zahl` forniscono supporto.  `xlsx.zahl.js` è progettato per l'uso standalone e NodeJS, mentre `xlsx.zahl.mjs` è adatto per ESM.
    
    _Browser_```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 invia flussi di scrittura alla risposta nodejs.

    Generazione di dati JSON e JS

    I dati JSON e JS tendono a rappresentare singoli fogli di lavoro. Le funzioni di utilità in questa sezione lavorano con singoli fogli di lavoro.

    La sezione "Formato foglio di calcolo comune" descrive la struttura dell'oggetto in maggior dettaglio. workbook.SheetNames è un elenco ordinato dei nomi dei fogli di lavoro. workbook.Sheets è un oggetto le cui chiavi sono i nomi dei fogli e i cui valori sono oggetti foglio di lavoro.

    Il "primo foglio di lavoro" è memorizzato in workbook.Sheets[workbook.SheetNames[0]].

    API

    Crea un array di oggetti JS da un foglio di lavoro```js var jsa = XLSX.utils.sheet_to_json(worksheet, opts);

    root@kitploit:~
    _Crea un array di array di valori JS da un foglio di lavoro_```js
    var aoa = XLSX.utils.sheet_to_json(worksheet, {...opts, header: 1});
    

    La funzione utilitaria sheet_to_json esplora un workbook in ordine row-major, generando un array di oggetti. Il secondo argomento opts controlla una serie di decisioni di esportazione, incluso il tipo di valori (valori JS o testo formattato). La sezione "JSON" descrive l'argomento più in dettaglio.

    Per impostazione predefinita, sheet_to_json esamina la prima riga e utilizza i valori come intestazioni. Con l'opzione header: 1, la funzione esporta un array di array di valori.

    Esempi

    x-spreadsheet è una griglia dati interattiva per visualizzare e modificare dati strutturati nel browser web. La demo xspreadsheet include uno script di esempio con la funzione stox per convertire da un workbook a un oggetto dati x-spreadsheet. https://oss.sheetjs.com/sheetjs/x-spreadsheet è una demo live.

    Anteprima dei dati in una griglia dati React (clicca per mostrare)

    react-data-grid è una griglia dati adattata per React. Si aspetta due proprietà: rows di oggetti dati e columns che descrivono le colonne. Ai fini di manipolare i dati per adattarli all'API di react-data-grid è più semplice partire da un array di array.

    Questa demo inizia recuperando un file remoto e utilizzando XLSX.read per estrarre:```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>Anteprima dei dati in una griglia dati VueJS</b> (clicca per mostrare)</summary>
    
    [`vue3-table-lite`](https://github.com/linmasahiro/vue3-table-lite) è una tabella dati semplice per VueJS 3. È presente nella [demo VueJS](https://github.com/weareu/xlsx/blob/HEAD/demos/vue/modify/).
    
    </details>
    
    <details>
      <summary><b>Popolare un database (SQL o no-SQL)</b> (clicca per mostrare)</summary>
    
    La [`demo database`](https://github.com/weareu/xlsx/blob/HEAD/demos/database/) include esempi di lavoro con database e risultati di query.
    
    </details>
    
    <details>
      <summary><b>Calcoli numerici con TensorFlow.js</b> (clicca per mostrare)</summary>
    
    [`@tensorflow/tfjs`](https://github.com/weareu/xlsx/blob/HEAD/@tensorflow/tfjs) e altre librerie si aspettano dati in array semplici, adatti per fogli di lavoro in cui ogni colonna è un vettore di dati. Questa è la trasposizione di come la maggior parte delle persone usa i fogli di calcolo, in cui ogni riga è un vettore.
    
    Un singolo `Array#map` può estrarre singole righe nominate dall'esportazione di `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);
    
    Recupera workbook e genera anteprime di tabelle HTML in React (clicca per mostrare)

    Generalmente è consigliato utilizzare un flusso di lavoro adatto a React, ma è possibile generare HTML e usarlo in React con 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` demo](https://github.com/weareu/xlsx/blob/HEAD/demos/react) include ulteriori esempi di React.
    
    </details>
    
    <details>
      <summary><b>VueJS recupera il workbook e genera anteprime di tabelle HTML</b> (clicca per mostrare)</summary>
    
    Generalmente si consiglia di utilizzare un flusso di lavoro compatibile con VueJS, ma è possibile generare HTML e utilizzarlo in VueJS con la direttiva `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>`
    };
    

    Generazione di Snapshot per Singolo Foglio di Lavoro

    Le funzioni sheet_to_* accettano un oggetto foglio di lavoro.

    API

    Genera un CSV da un singolo foglio di lavoro```js var csv = XLSX.utils.sheet_to_csv(worksheet, opts);

    root@kitploit:~
    Questo snapshot è progettato per replicare il tipo di output "CSV UTF8 (`.csv`)".
    ["Output separato da delimitatore"](#delimiter-separated-output) descrive la
    funzione e l'argomento opzionale `opts` in maggior dettaglio.
    
    _Generare "Testo" da un singolo foglio di lavoro_```js
    var txt = XLSX.utils.sheet_to_txt(worksheet, opts);
    

    Questo snapshot è progettato per replicare il tipo di output "Testo UTF16 (.txt)". "Output con delimitatore" descrive la funzione e l'argomento opzionale opts in maggiore dettaglio.

    Genera un elenco di formule da un singolo foglio di lavoro```js var fmla = XLSX.utils.sheet_to_formulae(worksheet);

    root@kitploit:~
    Questo snapshot genera un array di voci che rappresentano le formule incorporate.
    Le formule matriciali sono visualizzate nella forma `range=formula` mentre le celle semplici sono visualizzate nella forma `cell=formula o valore`. I valori letterali di stringa sono preceduti da un apostrofo `'`, in coerenza con la visualizzazione della barra della formula di Excel.
    
    ["Output delle formule"](#formulae-output) descrive la funzione in maggior dettaglio.
    
    ## Interface
    
    `XLSX` è la variabile esposta nel browser e la variabile esportata di Node
    
    `XLSX.version` è la versione della libreria (aggiunta dallo script di build).
    
    `XLSX.SSF` è una versione incorporata della [libreria di formati](https://git.io/ssf).
    
    ### Parsing functions
    
    `XLSX.read(data, read_opts)` tenta di analizzare `data`.
    
    `XLSX.readFile(filename, read_opts)` tenta di leggere `filename` e analizzarlo.
    
    Le opzioni di analisi sono descritte nella sezione [Opzioni di analisi](#parsing-options).
    
    ### Writing functions
    
    `XLSX.write(wb, write_opts)` tenta di scrivere la cartella di lavoro `wb`
    
    `XLSX.writeFile(wb, filename, write_opts)` tenta di scrivere `wb` in `filename`. In ambienti basati su browser, tenterà di forzare un download lato client.
    
    `XLSX.writeFileAsync(wb, filename, o, cb)` tenta di scrivere `wb` in `filename`. Se `o` viene omesso, lo scrittore utilizzerà il terzo argomento come callback.
    
    `XLSX.stream` contiene un insieme di funzioni di scrittura in streaming.
    
    Le opzioni di scrittura sono descritte nella sezione [Opzioni di scrittura](#writing-options).
    
    ### Utilities
    
    Le utility sono disponibili nell'oggetto `XLSX.utils` e sono descritte nella sezione [Funzioni di utility](#utility-functions):
    
    **Costruzione:**
    
    - `book_new` crea una cartella di lavoro vuota
    - `book_append_sheet` aggiunge un foglio di lavoro a una cartella di lavoro
    
    **Importazione:**
    
    - `aoa_to_sheet` converte un array di array di dati JS in un foglio di lavoro.
    - `json_to_sheet` converte un array di oggetti JS in un foglio di lavoro.
    - `table_to_sheet` converte un elemento DOM TABLE in un foglio di lavoro.
    - `sheet_add_aoa` aggiunge un array di array di dati JS a un foglio di lavoro esistente.
    - `sheet_add_json` aggiunge un array di oggetti JS a un foglio di lavoro esistente.
    
    **Esportazione:**
    
    - `sheet_to_json` converte un oggetto foglio di lavoro in un array di oggetti JSON.
    - `sheet_to_csv` genera output di valori separati da delimitatore.
    - `sheet_to_txt` genera testo formattato UTF16.
    - `sheet_to_html` genera output HTML.
    - `sheet_to_formulae` genera un elenco delle formule (con valori di fallback).
    
    **Manipolazione delle celle e degli indirizzi di cella:**
    
    - `format_cell` genera il valore testuale per una cella (utilizzando i formati numerici).
    - `encode_row / decode_row` converte tra righe con indice a 0 e righe con indice a 1.
    - `encode_col / decode_col` converte tra colonne con indice a 0 e nomi di colonna.
    - `encode_cell / decode_cell` converte indirizzi di cella.
    - `encode_range / decode_range` converte intervalli di celle.
    
    ## Common Spreadsheet Format
    
    SheetJS è conforme al Common Spreadsheet Format (CSF):
    
    ### General Structures
    
    Gli oggetti indirizzo di cella sono memorizzati come `{c:C, r:R}` dove `C` e `R` sono rispettivamente i numeri di colonna e riga con indice a 0. Ad esempio, l'indirizzo di cella `B5` è rappresentato dall'oggetto `{c:1, r:4}`.
    
    Gli oggetti intervallo di celle sono memorizzati come `{s:S, e:E}` dove `S` è la prima cella e `E` è l'ultima cella nell'intervallo. Gli intervalli sono inclusivi. Ad esempio, l'intervallo `A3:B7` è rappresentato dall'oggetto `{s:{c:0, r:2}, e:{c:1, r:6}}`.
    Le funzioni di utility eseguono una traversata in ordine row-major di un intervallo di foglio:```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);
      }
    }
    

    Oggetto Cella

    Gli oggetti cella sono oggetti JS semplici con chiavi e valori che seguono la convenzione:

    Le utilità di esportazione integrate (come l'esportatore CSV) useranno il testo w se disponibile. Per modificare un valore, assicurati di eliminare cell.w (o impostarlo a undefined) prima di tentare l'esportazione. Le utilità rigenereranno il testo w dal formato numerico (cell.z) e dal valore grezzo, se possibile.

    La formula matriciale effettiva è memorizzata nel campo f della prima cella nell'intervallo della matrice. Le altre celle nell'intervallo ometteranno il campo f.

    Tipi di Dato

    Il valore grezzo è memorizzato nella proprietà v, interpretato in base al tipo t. Questa separazione consente la rappresentazione di numeri e di testi numerici. Esistono 6 tipi di cella validi:

    Valori di errore e interpretazione (clicca per mostrare)

    Il tipo n è il tipo Numero. Include tutte le forme di dati che Excel memorizza come numeri, come date/ore e campi booleani. Excel utilizza esclusivamente dati che possono essere inseriti in un numero a virgola mobile IEEE754, proprio come un Number JS, quindi il campo v contiene il numero grezzo. Il campo w contiene il testo formattato. Le date sono memorizzate come numeri per impostazione predefinita e convertite con XLSX.SSF.parse_date_code.

    Il tipo d è il tipo Data, generato solo quando è passata l'opzione cellDates. Poiché JSON non ha un tipo Data naturale, ci si aspetta generalmente che i parser memorizzino stringhe di data ISO 8601 come quelle ottenute da date.toISOString(). D'altro canto, scrittori ed esportatori dovrebbero essere in grado di gestire stringhe di data e oggetti Date JS. Nota che Excel ignora i modificatori di fuso orario e tratta tutte le date nel fuso orario locale. La libreria non corregge questo errore.

    Il tipo s è il tipo Stringa. I valori sono memorizzati esplicitamente come testo. Excel interpreterà queste celle come "numero memorizzato come testo". I file Excel generati sopprimono automaticamente questa classe di errore, ma altri formati possono generare errori.

    Il tipo z rappresenta celle stub vuote. Sono generate in casi in cui le celle non hanno un valore assegnato ma contengono commenti o altri metadati. Sono ignorate dalle funzioni di utilità di elaborazione dati della libreria principale. Per impostazione predefinita, queste celle non sono generate; l'opzione del parser sheetStubs deve essere impostata a true.

    Date

    Dettagli codice data di Excel (clicca per mostrare)

    Per impostazione predefinita, Excel memorizza le date come numeri con un codice formato che specifica l'elaborazione della data. Ad esempio, la data 19-Feb-17 è memorizzata come numero 42785 con un formato numerico d-mmm-yy. Il modulo SSF comprende i formati numerici e esegue la conversione appropriata.

    XLSX supporta anche un tipo di data speciale d in cui i dati sono una stringa di data ISO 8601. Il formattatore riconverte la data in un numero.

    Il comportamento predefinito per tutti i parser è generare celle numeriche. Impostare cellDates a true forzerà i generatori a memorizzare le date.

    Fusi orari e date (clicca per mostrare)

    Excel non ha un concetto nativo di tempo universale. Tutte le ore sono specificate nel fuso orario locale. Le limitazioni di Excel impediscono di specificare date assolute reali.

    Seguendo Excel, questa libreria tratta tutte le date come relative al fuso orario locale.

    Epoche: 1900 e 1904 (clicca per mostrare)

    Excel supporta due epoche (1 gennaio 1900 e 1 gennaio 1904). L'epoca del workbook può essere determinata esaminando la proprietà wb.Workbook.WBProps.date1904 del workbook:```js !!(((wb.Workbook||{}).WBProps||{}).date1904)

    root@kitploit:~
    </details>
    
    ### Oggetti del Foglio
    
    Ogni chiave che non inizia con `!` corrisponde a una cella (utilizzando la notazione `A-1`)
    
    `sheet[address]` restituisce l'oggetto cella per l'indirizzo specificato.
    
    **Chiavi speciali del foglio (accessibili come `sheet[key]`, ciascuna inizianti con `!`):**
    
    - `sheet['!ref']`: Intervallo basato sulla notazione A-1 che rappresenta l'intervallo del foglio. Le funzioni che lavorano con i fogli dovrebbero usare questo parametro per determinare l'intervallo. Le celle assegnate al di fuori dell'intervallo non vengono elaborate. In particolare, quando si scrive un foglio a mano, le celle al di fuori dell'intervallo non vengono incluse.
    
      Le funzioni che gestiscono i fogli dovrebbero verificare la presenza del campo `!ref`. Se `!ref` viene omesso o non è un intervallo valido, le funzioni sono libere di trattare il foglio come vuoto o tentare di indovinare l'intervallo. Le utility standard fornite con questa libreria trattano i fogli come vuoti (ad esempio, l'output CSV è una stringa vuota).
    
      Quando si legge un foglio di lavoro con la proprietà `sheetRows` impostata, il parametro ref utilizzerà l'intervallo ristretto. L'intervallo originale è impostato in `ws['!fullref']`
    
    - `sheet['!margins']`: Oggetto che rappresenta i margini di pagina. I valori predefiniti seguono il preset 'normale' di Excel. Excel ha anche un preset 'ampio' e uno 'stretto', ma vengono memorizzati come misure grezze. Le proprietà principali sono elencate di seguito:
    
    <details>
      <summary><b>Dettagli dei margini di pagina</b> (clicca per mostrare)</summary>
    
    | key      | description                  | "normal" | "wide" | "narrow" |
    |----------|------------------------------|:---------|:-------|:-------- |
    | `left`   | margine sinistro (pollici)   | `0.7`    | `1.0`  | `0.25`   |
    | `right`  | margine destro (pollici)     | `0.7`    | `1.0`  | `0.25`   |
    | `top`    | margine superiore (pollici)  | `0.75`   | `1.0`  | `0.75`   |
    | `bottom` | margine inferiore (pollici)  | `0.75`   | `1.0`  | `0.75`   |
    | `header` | margine dell'intestazione (pollici) | `0.3`    | `0.5`  | `0.3`    |
    | `footer` | margine del piè di pagina (pollici) | `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}
    

    Oggetto Foglio di Lavoro

    Oltre alle chiavi base del foglio, i fogli di lavoro aggiungono anche:

    • ws['!cols']: array di oggetti delle proprietà delle colonne. Le larghezze delle colonne sono effettivamente memorizzate nei file in modo normalizzato, misurate in termini di "Larghezza massima delle cifre" (la larghezza maggiore delle cifre renderizzate 0-9, in pixel). Una volta analizzato, gli oggetti colonna memorizzano la larghezza in pixel nel campo wpx, la larghezza in caratteri nel campo wch e la larghezza massima delle cifre nel campo MDW.

    • ws['!rows']: array di oggetti delle proprietà delle righe come spiegato più avanti nella documentazione. Ogni oggetto riga codifica proprietà tra cui l'altezza e la visibilità della riga.

    • ws['!merges']: array di oggetti intervallo corrispondenti alle celle unite nel foglio di lavoro. I formati di testo semplice non supportano le celle unite. L'esportazione CSV scriverà tutte le celle nell'intervallo di unione se esistono, quindi assicurati che sia impostata solo la prima cella (in alto a sinistra) dell'intervallo.

    • ws['!outline']: configurare come devono comportarsi i contorni. Le opzioni predefinite corrispondono alle impostazioni predefinite in Excel 2019:

    chiaveFunzione Excelpredefinito
    aboveDeseleziona "Riepilogo righe sotto i dettagli"false
    leftDeseleziona "Riepilogo righe a destra dei dettagli"
    • ws['!protect']: oggetto delle proprietà di protezione del foglio in scrittura. La chiave password specifica la password per i formati che supportano fogli protetti da password (XLSX/XLSB/XLS). Lo scrittore utilizza il metodo di offuscamento XOR. Le seguenti chiavi controllano la protezione del foglio -- impostare a false per abilitare una funzionalità quando il foglio è bloccato o impostare a true per disabilitare una funzionalità:
    Dettagli Protezione Foglio di Lavoro (clicca per mostrare)
    • ws['!autofilter']: Oggetto AutoFilter che segue lo schema:```typescript type AutoFilter = { ref:string; // A-1 based range representing the AutoFilter table range }
    root@kitploit:~
    #### Oggetto Chartsheet
    
    I Chartsheet sono rappresentati come fogli standard. Sono distinti dalla
    proprietà `!type` impostata a `"chart"`.
    
    I dati sottostanti e `!ref` si riferiscono ai dati memorizzati nella cache nel chartsheet. La
    prima riga del chartsheet è l'intestazione sottostante.
    
    #### Oggetto Macrosheet
    
    I Macrosheet sono rappresentati come fogli standard. Sono distinti dalla
    proprietà `!type` impostata a `"macro"`.
    
    #### Oggetto Dialogsheet
    
    I Dialogsheet sono rappresentati come fogli standard. Sono distinti dalla
    proprietà `!type` impostata a `"dialog"`.
    
    ### Oggetto Workbook
    
    `workbook.SheetNames` è una lista ordinata dei fogli nel workbook
    
    `wb.Sheets[sheetname]` restituisce un oggetto che rappresenta il foglio di lavoro.
    
    `wb.Props` è un oggetto che memorizza le proprietà standard. `wb.Custprops` memorizza
    proprietà personalizzate. Poiché le proprietà standard XLS differiscono dallo standard
    XLSX, l'analisi XLS memorizza le proprietà principali in entrambi i posti.
    
    `wb.Workbook` memorizza [attributi a livello di workbook](#attributi-a-livello-di-workbook).
    
    #### Proprietà del file del Workbook
    
    I vari formati di file utilizzano nomi interni diversi per le proprietà del file. L'oggetto
    `Props` del workbook normalizza i nomi:
    
    <details>
      <summary><b>Proprietà del file</b> (clicca per mostrare)</summary>
    
    | Nome JS       | Descrizione Excel             |
    |:--------------|:------------------------------|
    | `Title`       | Scheda Riepilogo "Titolo"     |
    | `Subject`     | Scheda Riepilogo "Oggetto"    |
    | `Author`      | Scheda Riepilogo "Autore"     |
    | `Manager`     | Scheda Riepilogo "Manager"    |
    | `Company`     | Scheda Riepilogo "Società"    |
    | `Category`    | Scheda Riepilogo "Categoria"  |
    | `Keywords`    | Scheda Riepilogo "Parole chiave" |
    | `Comments`    | Scheda Riepilogo "Commenti"   |
    | `LastAuthor`  | Scheda Statistiche "Ultimo salvataggio di" |
    | `CreatedDate` | Scheda Statistiche "Creato"   |
    
    </details>
    
    Ad esempio, per impostare la proprietà del titolo del workbook:```js
    if(!wb.Props) wb.Props = {};
    wb.Props.Title = "Insert Title Here";
    

    Le proprietà personalizzate vengono aggiunte nell'oggetto Custprops della cartella di lavoro:```js if(!wb.Custprops) wb.Custprops = {}; wb.Custprops["Custom Property"] = "Custom Value";

    root@kitploit:~
    Gli scrittori elaboreranno la chiave `Props` dell'oggetto delle opzioni:```js
    /* force the Author to be "SheetJS" */
    XLSX.write(wb, {Props:{Author:"SheetJS"}});
    

    Attributi a livello di cartella di lavoro

    wb.Workbook memorizza gli attributi a livello di cartella di lavoro.

    Nomi definiti

    wb.Workbook.Names è un array di oggetti nome definito che hanno le seguenti chiavi:

    Proprietà dei Nomi Definitu (clicca per mostrare)

    Excel consente a due nomi definiti con ambito foglio di condividere lo stesso nome. Tuttavia, un nome con ambito foglio non può entrare in conflitto con un nome con ambito cartella di lavoro. I writer di cartelle di lavoro potrebbero non applicare questo vincolo.

    Viste della cartella di lavoro

    wb.Workbook.Views è un array di oggetti vista della cartella di lavoro che hanno le seguenti chiavi:

    KeyDescrizione
    RTLSe vero, visualizza da destra a sinistra

    Proprietà varie della cartella di lavoro

    wb.Workbook.WBProps contiene altre proprietà della cartella di lavoro:

    KeyDescrizione
    CodeNameNome codice del progetto VBA della cartella di lavoro
    date1904epoca: 0/falso per sistema 1900, 1/vero per 1904
    filterPrivacy

    Funzionalità del documento

    Anche per funzionalità di base come la memorizzazione delle date, i formati Excel ufficiali memorizzano lo stesso contenuto in modi diversi. I parser devono convertire dalla rappresentazione del formato file sottostante al Formato Foglio di Calcolo Comune (CSF). I writer devono riconvertire dal CSF al formato file sottostante.

    Formule

    La stringa della formula in stile A1 è memorizzata nel campo f. Anche se diversi formati di file memorizzano le formule in modi diversi, i formati vengono tradotti. Anche se alcuni formati memorizzano le formule con un segno di uguale iniziale, le formule CSF non iniziano con =.

    Supporto dei formati di file per le formule (clicca per mostrare)

    Formule a cella singola

    Per formule semplici, la chiave f della cella desiderata può essere impostata sul testo effettivo della formula. Questo foglio di lavoro rappresenta A1=1, A2=2 e 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:~
    Utility come `aoa_to_sheet` accettano oggetti cella al posto dei valori:```js
    var worksheet = XLSX.utils.aoa_to_sheet([
      [ 1 ], // A1
      [ 2 ], // A2
      [ {t: "n", v: 3, f: "A1+A2"} ] // A3
    ]);
    

    Le celle con voci di formula ma senza valore verranno serializzate in modo che Excel e altri strumenti per fogli di calcolo le riconoscano. Questa libreria non calcolerà automaticamente i risultati delle formule! Ad esempio, il seguente foglio di lavoro includerà la funzione BESSELJ ma il risultato non sarà disponibile in 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:~
    Se i risultati effettivi sono necessari in JS, [SheetJS Pro](https://sheetjs.com/pro) offre un componente calcolatore di formule per valutare espressioni, aggiornare valori e celle dipendenti, e aggiornare interi workbook.
    
    
    **Formule Matriciali**
    
    _Assegnare una formula matriciale_```js
    XLSX.utils.sheet_set_array_formula(worksheet, range, formula);
    

    Le formule matriciali sono memorizzate nella cella in alto a sinistra del blocco della matrice. Tutte le celle di una formula matriciale hanno un campo F corrispondente all'intervallo. Una formula a singola cella può essere distinta da una formula normale per la presenza del campo F.

    Ad esempio, impostando la cella C1 alla formula matriciale {=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:~
    Per una formula matriciale multi-cella, ogni cella ha lo stesso intervallo di matrice ma solo la prima cella specifica la formula.  Considera `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" };
    

    Utilities and writers are expected to check for the presence of a F field and ignore any possible formula element f in cells other than the starting cell. They are not expected to perform validation of the formulae!

    Formule Dynamic Array

    Assegna una formula di array dinamico```js XLSX.utils.sheet_set_array_formula(worksheet, range, formula, true);

    root@kitploit:~
    Rilasciate nel 2020, le Formule di matrice dinamiche sono supportate nei formati di file XLSX/XLSM e XLSB. Sono rappresentate come normali formule di matrice ma hanno metadati speciali sulle celle che indicano che la formula dovrebbe poter regolare l'intervallo.
    
    Una formula di matrice può essere contrassegnata come dinamica impostando la proprietà `D` della cella a true. L'intervallo `F` è previsto ma può essere impostato sulla cella corrente:```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
    

    Localizzazione con nomi di funzione

    SheetJS opera a livello di file. Excel memorizza le espressioni delle formule utilizzando i nomi di funzione in inglese (Stati Uniti). Per gli utenti non inglesi, Excel utilizza un insieme localizzato di nomi di funzione.

    Ad esempio, quando la lingua e la regione del computer sono impostate su Francese (Francia), Excel interpreta =SOMME(A1:C3) come se SOMME fosse la funzione SUM. Tuttavia, nel file effettivo, Excel memorizza SUM(A1:C3).

    Funzioni "Future" con prefisso

    Le funzioni introdotte nelle versioni più recenti di Excel sono precedute da _xlfn. quando vengono memorizzate nei file. Quando si scrivono espressioni di formula utilizzando queste funzioni, il prefisso è necessario per la massima compatibilità:```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:~
    Quando si legge un file, l'opzione `xlfn` preserva i prefissi.
    
    <details>
      <summary><b> Funzioni che richiedono il prefisso `_xlfn.`</b> (clicca per mostrare)</summary>
    
    Questa lista cresce ad ogni rilascio di 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
    

    Proprietà di righe e colonne

    Supporto dei formati (clicca per mostrare)

    Proprietà delle righe: XLSX/M, XLSB, BIFF8 XLS, XLML, SYLK, DOM, ODS

    Proprietà delle colonne: XLSX/M, XLSB, BIFF8 XLS, XLML, SYLK, DOM

    Le proprietà di righe e colonne non vengono estratte per impostazione predefinita durante la lettura da un file e non vengono mantenute per impostazione predefinita durante la scrittura su un file. L'opzione cellStyles: true deve essere passata alla funzione di lettura o scrittura pertinente.

    Proprietà delle colonne

    L'array !cols in ogni foglio di lavoro, se presente, è una raccolta di oggetti ColInfo che hanno le seguenti proprietà:```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:~
    _Proprietà delle Righe_
    
    L'array `!rows` in ogni foglio di lavoro, se presente, è una collezione di oggetti `RowInfo` che hanno le seguenti proprietà:```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'interfaccia di Excel mostra il livello di struttura base come 1 e il livello massimo come 8. Seguendo le convenzioni JS, SheetJS utilizza livelli di struttura indicizzati a partire da 0, dove il livello base è 0 e il livello massimo è 7.

    Perché esistono tre tipi di larghezza? (clicca per mostrare)

    Esistono tre diversi tipi di larghezza corrispondenti ai tre diversi modi in cui i fogli di calcolo memorizzano le larghezze delle colonne:

    I formati SYLK e altri formati di testo semplice utilizzano il conteggio grezzo dei caratteri. Gli strumenti coevi come Visicalc e Multiplan erano basati sui caratteri. Poiché i caratteri avevano la stessa larghezza, era sufficiente memorizzare un conteggio. Questa tradizione è continuata nei formati BIFF.

    SpreadsheetML (2003) ha tentato di allinearsi con HTML standardizzando il conteggio dei pixel sullo schermo in tutto il file. Le larghezze delle colonne, le altezze delle righe e altre misure utilizzano i pixel. Quando i conteggi di pixel e caratteri non coincidono, Excel arrotonda i valori.

    XLSX memorizza internamente le larghezze delle colonne in una nebulosa forma di "Larghezza massima della cifra" (Max Digit Width). La Larghezza massima della cifra è la larghezza della cifra più grande quando viene visualizzata (generalmente il carattere "0" è il più largo). La larghezza interna deve essere un multiplo intero della larghezza divisa per 256. ECMA-376 descrive una formula per la conversione tra pixel e larghezza interna. Questo rappresenta un approccio ibrido.

    Le funzioni di lettura tentano di popolare tutte e tre le proprietà. Le funzioni di scrittura tenteranno di convertire i valori specificati nel tipo desiderato. Per evitare potenziali conflitti, la manipolazione dovrebbe prima eliminare le altre proprietà. Per esempio, quando si modifica la larghezza in pixel, eliminare le proprietà wch e width.

    Dettagli implementativi (clicca per mostrare)

    Altezze delle righe

    Excel memorizza internamente le altezze delle righe in punti. La risoluzione predefinita è 72 DPI o 96 PPI, quindi la dimensione in pixel e in punti dovrebbe coincidere. Per risoluzioni diverse potrebbero non coincidere, quindi la libreria separa i concetti.

    Anche se tutte le informazioni sono disponibili, ci si aspetta che gli scrittori seguano l'ordine di priorità:

    1. utilizzare l'altezza in pixel hpx se disponibile
    2. utilizzare l'altezza in punti hpt se disponibile

    Larghezze delle colonne

    Date le limitazioni, è possibile determinare la MDW senza effettivamente ispezionare il font! I parser indovinano la larghezza in pixel convertendo dalla larghezza a pixel e viceversa, ripetendo per tutte le possibili MDW e selezionando la MDW che minimizza l'errore. XLML memorizza effettivamente la larghezza in pixel, quindi l'ipotesi funziona nella direzione opposta.

    Anche se tutte le informazioni sono disponibili, ci si aspetta che gli scrittori seguano l'ordine di priorità:

    1. utilizzare il campo width se disponibile
    2. utilizzare la larghezza in pixel wpx se disponibile
    3. utilizzare il conteggio dei caratteri wch se disponibile

    Formati numerici

    Il testo formattato cell.w per ogni cella è prodotto dal valore cell.v e dal formato cell.z. Se il formato non è specificato, viene utilizzato il formato Generale di Excel. Il formato può essere specificato come stringa o come indice nella tabella dei formati. Ci si aspetta che i parser popolino workbook.SSF con la tabella dei formati numerici. Ci si aspetta che gli scrittori serializzino la tabella.

    Gli strumenti personalizzati dovrebbero assicurarsi che la tabella locale contenga ogni stringa di formato utilizzata da qualche parte nella tabella. La convenzione di Excel impone che i formati personalizzati inizino all'indice 164. L'esempio seguente crea un formato personalizzato da zero:

    Nuovo foglio di lavoro con formato personalizzato (clicca per mostrare)```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 } } } ```

    Le regole sono leggermente diverse da come Excel visualizza i formati numerici personalizzati. In particolare, i caratteri letterali devono essere racchiusi tra virgolette doppie o preceduti da una barra rovesciata. Per maggiori informazioni, consulta l'articolo della documentazione di Excel Create or delete a custom number format o ECMA-376 18.8.31 (Number Formats)

    Formati Numerici Predefiniti (clicca per mostrare)

    I formati predefiniti sono elencati in ECMA-376 18.8.30:

    IDFormato
    0General
    10
    20.00
    3#,##0
    4#,##0.00
    90%
    100.00%
    110.00E+00
    12# ?/?
    13# ??/??
    14m/d/yy (vedi sotto)
    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

    Il formato 14 (m/d/yy) è localizzato da Excel: anche se il file specifica quel formato numerico, verrà visualizzato diversamente in base alle impostazioni di sistema. Ha senso quando il produttore e il consumatore dei file sono nella stessa lingua, ma non è sempre così su Internet. Per aggirare questa ambiguità, le funzioni di analisi accettano l'opzione dateNF per sovrascrivere l'interpretazione di quella specifica stringa di formato.

    Collegamenti ipertestuali

    Supporto dei Formati (clicca per mostrare)

    Collegamenti ipertestuali delle celle: XLSX/M, XLSB, BIFF8 XLS, XLML, ODS

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

    Gli hyperlink sono memorizzati nella chiave l degli oggetti cella. Il campo Target dell'oggetto hyperlink è la destinazione del collegamento, incluso il frammento URI. I suggerimenti sono memorizzati nel campo Tooltip e vengono visualizzati quando si passa il mouse sopra il testo.

    Ad esempio, il seguente frammento crea un collegamento dalla cella A3 a https://sheetjs.com con il suggerimento "Find us @ SheetJS.com!":```js ws['A1'].l = { Target:"https://sheetjs.com", Tooltip:"Find us @ SheetJS.com!" };

    root@kitploit:~
    Nota che Excel non applica automaticamente lo stile ai collegamenti ipertestuali -- in genere vengono visualizzati come testo normale.
    
    _Collegamenti remoti_
    
    I collegamenti HTTP / HTTPS possono essere utilizzati direttamente:```js
    ws['A2'].l = { Target:"https://docs.sheetjs.com/#hyperlinks" };
    ws['A3'].l = { Target:"http://localhost:7262/yes_localhost_works" };
    

    Excel supporta anche link email mailto con oggetto:```js ws['A4'].l = { Target:"mailto:[email protected]" }; ws['A5'].l = { Target:"mailto:[email protected]?subject=Test Subject" };

    root@kitploit:~
    _Local Links_
    
    I collegamenti a percorsi assoluti dovrebbero utilizzare lo schema 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 */
    

    I collegamenti a percorsi relativi possono essere specificati senza uno schema:```js ws['B3'].l = { Target:"SheetJS.xlsb" }; /* Link to SheetJS.xlsb / ws['B4'].l = { Target:"../SheetJS.xlsm" }; / Link to ../SheetJS.xlsm */

    root@kitploit:~
    I percorsi relativi hanno un comportamento indefinito nel formato SpreadsheetML 2003. Excel 2019 tratterà un indicatore `..\` come due livelli superiori.
    
    _Collegamenti interni_
    
    I collegamenti il cui obiettivo è una cella, un intervallo o un nome definito all'interno della stessa cartella di lavoro ("Collegamenti interni") sono contrassegnati da un carattere cancelletto iniziale:```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 */
    

    Commenti delle celle

    I commenti delle celle sono oggetti memorizzati nell'array c degli oggetti cella. Il contenuto effettivo del commento è suddiviso in blocchi in base all'autore del commento. Il campo a di ogni oggetto commento è l'autore del commento e il campo t è la rappresentazione in testo semplice.

    Ad esempio, il seguente frammento aggiunge un commento della cella nella cella 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:~
    Nota: XLSB impone un limite di 54 caratteri per il nome dell'autore. I nomi più lunghi di
    54 caratteri potrebbero causare problemi con altri formati.
    
    Per contrassegnare un commento come normalmente nascosto, imposta la proprietà `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"});
    

    Commenti a thread

    Introdotti in Excel 365, i commenti a thread sono snippet di commento in testo semplice con metadati autore e riferimenti al commento padre. Sono supportati in XLSX e XLSB.

    Per contrassegnare un commento come a thread, ogni parte del commento deve avere una proprietà T vera:```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:~
    Non ci sono metadati di Active Directory o Office 365 associati agli autori in un thread.
    
    #### Visibilità del foglio
    
    Excel consente di nascondere i fogli nella barra delle schede inferiore. I dati del foglio sono memorizzati nel file, ma l'interfaccia utente non li rende facilmente disponibili. I fogli nascosti standard vengono rivelati nel menu "Unhide". Excel dispone anche di fogli "molto nascosti" che non possono essere rivelati dal menu. Sono accessibili solo nell'Editor VB!
    
    L'impostazione di visibilità è memorizzata nella proprietà `Hidden` dell'array delle proprietà del foglio.
    
    <details>
      <summary><b>Più dettagli</b> (clicca per mostrare)</summary>
    
    | Valore | Definizione  |
    |:-----:|:------------|
    |   0   | Visibile     |
    |   1   | Nascosto      |
    |   2   | Molto nascosto |
    
    Con <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 ] ]
    

    I formati non Excel non supportano lo stato Molto nascosto. Il modo migliore per testare se un foglio è visibile è controllare se la proprietà Hidden è vera in senso logico:```js

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

    root@kitploit:~
    </details>
    
    #### VBA e Macro
    
    Le macro VBA sono memorizzate in un blob di dati speciale che viene esposto nella proprietà `vbaraw` dell'oggetto della cartella di lavoro quando l'opzione `bookVBA` è `true`. Sono supportate nei formati `XLSM`, `XLSB` e `BIFF8 XLS`. Gli scrittori di formati supportati inseriscono automaticamente i blob di dati se presenti nella cartella di lavoro e li associano ai nomi dei fogli di lavoro.
    
    <details>
    	<summary><b>Nomi di codice personalizzati</b> (clicca per mostrare)</summary>
    
    Il nome di codice della cartella di lavoro è memorizzato in `wb.Workbook.WBProps.CodeName`. Per impostazione predefinita, Excel scriverà `ThisWorkbook` o una frase tradotta come `DieseArbeitsmappe`. I nomi di codice dei fogli di lavoro e dei grafici sono nell'oggetto delle proprietà del foglio in `wb.Workbook.Sheets[i].CodeName`. I fogli macro e i fogli di dialogo vengono ignorati.
    
    I lettori e gli scrittori preservano i nomi di codice, ma devono essere impostati manualmente quando si aggiunge un blob VBA a una cartella di lavoro diversa.
    
    </details>
    
    <details>
    	<summary><b>Fogli macro</b> (clicca per mostrare)</summary>
    
    Le versioni precedenti di Excel supportavano anche un tipo di foglio "macrosheet" non VBA che memorizzava comandi di automazione. Questi sono esposti in oggetti con la proprietà `!type` impostata su `"macro"`.
    
    </details>
    
    <details>
    	<summary><b>Rilevamento delle macro nelle cartelle di lavoro</b> (clicca per mostrare)</summary>
    
    Il campo `vbaraw` sarà impostato solo se sono presenti macro, quindi il test è semplice:```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');
    }
    
    Nome OpzionePredefinitoDescrizione
    typeCodifica dei dati in input (vedi Tipo di Input sotto)
    rawfalseSe true, il parsing di testo semplice non analizza i valori **
    codepageSe specificato, usa la code page quando appropriato **
    cellFormulatrueSalva le formule nel campo .f
    cellHTMLtrueAnalizza rich text e salva HTML nel campo .h
    cellNFfalseSalva la stringa del formato numerico nel campo .z
    cellStylesfalseSalva info su stile/tema nel campo .s
    cellTexttrueGenera testo formattato nel campo .w
    cellDatesfalseMemorizza le date come tipo d (predefinito è n)
    dateNFSe specificato, usa la stringa per il codice data 14 **
    sheetStubsfalseCrea oggetti cella di tipo z per celle stub
    sheetRows0Se >0, legge le prime sheetRows righe **
    bookDepsfalseSe true, analizza le catene di calcolo
    bookFilesfalseSe true, aggiunge file raw all'oggetto libro **
    bookPropsfalseSe true, analizza solo il necessario per i metadati **
    bookSheetsfalseSe true, analizza solo il necessario per i nomi fogli
    bookVBAfalseSe true, copia il blob VBA nel campo vbaraw **
    password""Se definito e il file è crittografato, usa password **
    WTFfalseSe true, lancia errori su caratteristiche inaspettate **
    sheetsSe specificato, analizza solo i fogli specificati **
    PRNfalseSe true, permette il parsing di file PRN **
    xlfnfalseSe true, preserva i prefissi _xlfn. nelle formule **
    FSOverride del separatore di campo DSV
  • sheetRows-1 righe verranno generate quando si osserva l'output dell'oggetto JSON (poiché la riga di intestazione viene contata come riga durante l'analisi dei dati)
  • Per impostazione predefinita vengono analizzati tutti i fogli di lavoro. sheets si basa sul tipo di input:
    • numero: indice a base zero del foglio da analizzare (0 è il primo foglio)
    • stringa: nome del foglio da analizzare (case insensitive)
    • array di numeri e stringhe per selezionare più fogli.
  • bookVBA espone semplicemente l'oggetto VBA CFB raw. Non analizza i dati. XLSM e XLSB memorizzano l'oggetto VBA CFB in xl/vbaProject.bin. BIFF8 XLS mescola le voci VBA insieme alla voce Workbook principale, quindi la libreria genera un nuovo blob compatibile con XLSB dal contenitore CFB XLS.
  • codepage viene applicato a file BIFF2 - BIFF5 senza record CodePage e a file CSV senza BOM in type:"binary". BIFF8 XLS è sempre predefinito a 1200.
  • PRN influisce sull'analisi di file di testo senza un carattere delimitatore comune.
  • Attualmente è supportata solo la crittografia XOR. Verrà lanciato un errore di tipo Unsupported per file che utilizzano altri metodi di crittografia.
  • Le funzioni più recenti di Excel sono serializzate con il prefisso _xlfn., nascosto all'utente. SheetJS rimuoverà normalmente _xlfn.. L'opzione xlfn li preserva.
  • WTF è principalmente per sviluppo. Per impostazione predefinita, il parser sopprime gli errori di lettura su singoli fogli di lavoro, permettendoti di leggere dai fogli che vengono analizzati correttamente. Impostando WTF:true si costringono quegli errori a essere lanciati.
  • typeinput previsto
    "base64"stringa: codifica Base64 del file
    "binary"stringa: stringa binaria (byte n è data.charCodeAt(n))
    "string"stringa: stringa JS (caratteri interpretati come UTF8)
    "buffer"Buffer nodejs
    "array"array: array di interi a 8 bit senza segno (byte n è data[n])
    "file"stringa: percorso del file da leggere (solo nodejs)
    Byte 0Tipo File RawTipi di Foglio di Calcolo
    0xD0Contenitore CFBBIFF 5/8 o XLSX/XLSB protetti o WQ3/QPW o XLR
    0x09Flusso BIFFBIFF 2/3/4/5
    0x3CXML/HTMLSpreadsheetML / Flat ODS / UOS1 / HTML / testo semplice
    0x50Archivio ZIPXLSB o XLSX/M o ODS o UOS2 o NUMBERS o testo
    0x49Testo sempliceSYLK o testo semplice
    0x54Testo sempliceDIF o testo semplice
    0xEFCodificato UTF8SpreadsheetML / Flat ODS / UOS1 / HTML / testo semplice
    0xFFCodificato UTF16SpreadsheetML / Flat ODS / UOS1 / HTML / testo semplice
    0x00Flusso recordLotus WK* o Quattro Pro o testo semplice
    0x7BTesto sempliceRTF o testo semplice
    0x0ATesto sempliceSpreadsheetML / Flat ODS / UOS1 / HTML / testo semplice
    0x0DTesto sempliceSpreadsheetML / Flat ODS / UOS1 / HTML / testo semplice
    0x20Testo sempliceSpreadsheetML / Flat ODS / UOS1 / HTML / testo semplice

    I file DBF vengono rilevati in base al primo byte così come al terzo e quarto byte (corrispondenti al mese e al giorno della data del file)

    I file Works per Windows vengono rilevati in base al record BOF con tipo 0xFF

    Il riconoscimento del formato di testo semplice segue l'ordine di priorità:

    FormatoTest
    XML<?xml appare nei primi 1024 caratteri
    HTMLinizia con < e i tag HTML appaiono nei primi 1024 caratteri *
    XMLinizia con < e il primo tag è valido
    RTFinizia con {\rt
    DSVinizia con /sep=.$/, il separatore è il carattere specificato
    DSVpiù caratteri `
    DSVpiù caratteri ; non quotati che \t o , nei primi 1024
    TSVpiù caratteri \t non quotati che , nei primi 1024
    CSVuno dei primi 1024 caratteri è una virgola ","
    ETHinizia con socialcalc:version:
    PRNl'opzione PRN è impostata a true
    CSV(fallback)
    • I tag HTML includono: html, table, head, meta, script, style, div

    Ingresso Array di Array

    XLSX.utils.aoa_to_sheet accetta un array di array di valori JS e restituisce un foglio di lavoro che assomiglia ai dati di input. Numeri, booleani e stringhe vengono memorizzati con gli stili corrispondenti. Le date vengono memorizzate come date o numeri. I buchi nell'array e i valori espliciti undefined vengono saltati. I valori null possono essere sostituiti. Tutti gli altri valori vengono memorizzati come stringhe. La funzione accetta un argomento opzioni:

    Nome OpzioneDefaultDescrizione
    dateNFFMT 14Usa il formato data specificato nell'output stringa
    cellDatesfalseMemorizza le date come tipo d (default è n)
    sheetStubsfalseCrea oggetti cella di tipo z per valori null
    nullErrorfalseSe true, genera celle di errore #NULL! per valori null
    ```

    Read more

    Downloadify usa un pulsante Flash SWF per generare file locali, adatto per ambienti in cui ActiveX non è disponibile:```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:~
    Il [`oldie` demo](https://github.com/weareu/xlsx/blob/HEAD/demos/oldie/) mostra uno scenario di fallback compatibile con IE.
    
    </details>
    
    <details>
      <summary><b>Carica file dal browser (ajax)</b> (clicca per mostrare)</summary>
    
    Un esempio completo che utilizza XHR è [incluso nella demo XHR](https://github.com/weareu/xlsx/blob/HEAD/demos/xhr/), insieme a esempi per fetch e librerie wrapper. Questo esempio presuppone che il server possa gestire file codificati in Base64 (vedi la demo per un server nodejs di base):```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);
    

    Tutti i campi possono essere elaborati in una volta sola utilizzando una trasposizione del tensore 2D generato con l'esportazione sheet_to_json con header: 1. La prima riga, se contiene etichette di intestazione, dovrebbe essere rimossa con una slice:```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 [`array` demo](https://github.com/weareu/xlsx/blob/HEAD/demos/array/) mostra un esempio completo.
    
    </details>
    
    
    ### Generazione di tabelle HTML
    
    **API**
    
    _Genera tabella HTML dal foglio di lavoro_```js
    var html = XLSX.utils.sheet_to_html(worksheet);
    

    La funzione di utilità sheet_to_html genera codice HTML basato sui dati del foglio di lavoro. Ogni cella nel foglio di lavoro è associata a un elemento <TD>. Le celle unite nel foglio di lavoro vengono serializzate impostando gli attributi colspan e rowspan.

    Esempi

    La funzione di utilità sheet_to_html genera codice HTML che può essere aggiunto a qualsiasi elemento DOM impostando innerHTML:```js var container = document.getElementById("tavolo"); container.innerHTML = XLSX.utils.sheet_to_html(worksheet);

    root@kitploit:~
    Combinando con `fetch`, costruire un sito da un workbook è semplice:
    
    <details>
      <summary><b>Vanilla JS + HTML fetch workbook e genera anteprime delle tabelle</b> (click per mostrare)</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>
    

    Il vuejs demo include più esempi React.

    ChiaveDescrizione
    vvalore grezzo (vedi sezione Tipi di Dato per maggiori informazioni)
    wtesto formattato (se applicabile)
    ttipo: b Booleano, e Errore, n Numero, d Data, s Testo, z Stub
    fformula della cella codificata come stringa in stile A1 (se applicabile)
    Fintervallo dell'array contenitore se la formula è formula matriciale (se applicabile)
    Dse vero, la formula matriciale è dinamica (se applicabile)
    rcodifica rich text (se applicabile)
    hrendering HTML del rich text (se applicabile)
    ccommenti associati alla cella
    zstringa del formato numerico associato alla cella (se richiesto)
    loggetto collegamento ipertestuale della cella (.Target contiene il link, .Tooltip è il suggerimento)
    sstile/tema della cella (se applicabile)
    TipoDescrizione
    bBooleano: valore interpretato come boolean JS
    eErrore: il valore è un codice numerico e la proprietà w memorizza il nome comune **
    nNumero: il valore è un number JS **
    dData: il valore è un oggetto Date JS o una stringa da analizzare come Data **
    sTesto: valore interpretato come string JS e scritto come testo **
    zStub: cella stub vuota ignorata dalle utilità di elaborazione dati **
    ValoreSignificato Errore
    0x00#NULL!
    0x07#DIV/0!
    0x0F#VALUE!
    0x17#REF!
    0x1D#NAME?
    0x24#NUM!
    0x2A#N/A
    0x2B#GETTING_DATA
    false
    chiavefunzionalità (true=disabilitato / false=abilitato)predefinito
    selectLockedCellsSeleziona celle bloccateabilitato
    selectUnlockedCellsSeleziona celle sbloccateabilitato
    formatCellsFormatta celledisabilitato
    formatColumnsFormatta colonnedisabilitato
    formatRowsFormatta righedisabilitato
    insertColumnsInserisci colonnedisabilitato
    insertRowsInserisci righedisabilitato
    insertHyperlinksInserisci collegamenti ipertestualidisabilitato
    deleteColumnsElimina colonnedisabilitato
    deleteRowsElimina righedisabilitato
    sortOrdinadisabilitato
    autoFilterFiltradisabilitato
    pivotTablesUsa report tabella pivotdisabilitato
    objectsModifica oggettiabilitato
    scenariosModifica scenariabilitato
    KeyDescrizione
    SheetAmbito del nome. Indice del foglio (0 = primo foglio) o null (Cartella di lavoro)
    NameNome con distinzione tra maiuscole e minuscole. Si applicano le regole standard **
    RefRiferimento in stile A1 ("Sheet1!$A$1:$D$20")
    CommentCommento (applicabile solo per XLS/XLSX/XLSB)
    Avvisa o rimuovi le informazioni di identificazione personale al salvataggio
    Rappresentazione di memorizzazioneFormatiLetturaScrittura
    Stringhe in stile A1XLSX✔✔
    Stringhe in stile RCXLML e testo semplice✔✔
    Formule BIFF analizzateXLSB e tutti i formati XLS✔
    Formule OpenFormulaODS/FODS/UOS✔✔
    Formule Lotus analizzateTutti i formati Lotus WK_✔

    Poiché Excel impedisce alle celle nominate di entrare in conflitto con i nomi dei riferimenti di cella in stile A1 o RC, è possibile una conversione regex (non così semplice). Le formule BIFF analizzate e le formule Lotus analizzate devono essere esplicitamente decompresse. Le formule OpenFormula possono essere convertite con espressioni regolari.

    Le formule condivise vengono decompresse e ogni cella ha la formula corrispondente alla sua cella. I writer generalmente non tentano di generare formule condivise.

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