Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
xlsx — SheetJS xlsx 0.18.5 fork con correcciones para CVE-2023-30533 y CVE-2024-22363 | Kitploit
Herramientas/GitHubGitHub/weareu/xlsx
Utilidades de Propósito GeneralHerramientas de Cifrado/DescifradoRecuperación de DatosUtilidades y Frameworks
GitHubweareu/xlsx

xlsx

SheetJS xlsx 0.18.5 fork con correcciones para CVE-2023-30533 y CVE-2024-22363

Ver Repositorio
hace 6 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

SheetJS

La edición comunitaria de SheetJS ofrece soluciones de código abierto probadas en batalla para extraer datos útiles de casi cualquier hoja de cálculo compleja y generar nuevas hojas de cálculo que funcionen tanto con software heredado como moderno.

SheetJS Pro ofrece soluciones más allá del procesamiento de datos: edita plantillas complejas con facilidad; da rienda suelta a tu Picasso interior con el estilo; crea hojas personalizadas con imágenes/gráficos/tablas dinámicas; evalúa expresiones de fórmulas y traslada cálculos a aplicaciones web; automatiza tareas comunes de hojas de cálculo, ¡y mucho más!

License Build Status Snyk Vulnerabilities npm Downloads Analytics

Matriz de pruebas y soporte en navegador

Build Status

Formatos de archivo admitidos

gráfico circo de soporte de formatos

leyenda del gráfico

Tabla de contenidos

Expandir para mostrar la tabla de contenidos
  • Primeros pasos
    • Instalación
    • Uso
    • El zen de SheetJS
    • Demostraciones del ecosistema JS
  • Adquisición y extracción de datos
    • Analizar libros de trabajo
    • Procesar datos JSON y JS
    • Procesar tablas HTML
  • Procesamiento de datos
    • Modificar la estructura del libro de trabajo
    • Modificar valores de celda
    • Modificar otras propiedades de hoja de cálculo / libro de trabajo / celda
  • Empaquetado y publicación de datos
    • Escribir libros de trabajo
    • Ejemplos de escritura
    • Escritura en streaming
    • Generar datos JSON y JS
    • Generar tablas HTML
    • Generar instantáneas de una sola hoja de cálculo
  • Interfaz
    • Funciones de análisis
    • Funciones de escritura
    • Utilidades
  • Formato común de hoja de cálculo
    • Estructuras generales
    • Objeto de celda
      • Tipos de datos
      • Fechas
    • Objetos de hoja
      • Objeto de hoja de cálculo
      • Objeto de hoja de gráfico
      • Objeto de hoja de macros
      • Objeto de hoja de diálogo

Primeros pasos

Instalación

Scripts independientes para navegador

La compilación independiente completa para navegador se guarda en dist/xlsx.full.min.js y se puede añadir directamente a una página con una etiqueta script:```html

root@kitploit:~
<details>
  <summary><b>Disponibilidad en CDN</b> (haz clic para mostrar)</summary>

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

Por ejemplo, `unpkg` hace que la última versión esté disponible en:```html
<script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script>
Compilaciones para navegador (haz clic para mostrar)

La versión completa de un solo archivo se genera en dist/xlsx.full.min.js

dist/xlsx.core.min.js omite la librería codepage (sin soporte para codificaciones XLS)

Se genera una compilación más ligera en dist/xlsx.mini.min.js. En comparación con la compilación completa:

  • librería codepage omitida (sin soporte para codificaciones XLS)
  • sin soporte para XLSB / XLS / Lotus 1-2-3 / SpreadsheetML 2003 / Numbers
  • utilidades de stream de node eliminadas

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

root@kitploit:~
**Módulos ECMAScript**

La compilación del módulo ECMAScript se guarda en `xlsx.mjs` y se puede añadir directamente a
una página con una etiqueta `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>

El paquete npm también expone el módulo con el parámetro module, compatible con Angular y otros proyectos:```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` se puede importar en Deno. Está disponible desde `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:~
Por defecto, el módulo soporta `require`:```js
var XLSX = require("xlsx");

El módulo también incluye xlsx.mjs para usar 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` es una compilación de ExtendScript para Photoshop e InDesign
que se incluye en el paquete `npm`.  Se puede referenciar directamente con una
directiva `#include`:```extendscript
#include "xlsx.extendscript.js"
Compatibilidad con Internet Explorer y ECMAScript 3 (haga clic para mostrar)

Para una amplia compatibilidad con los motores de JavaScript, la biblioteca está escrita usando el dialecto de lenguaje ECMAScript 3, así como algunas características de ES5 como Array#forEach. Los navegadores antiguos requieren shims para proporcionar las funciones que faltan.

Para usar el shim, añada el shim antes de la etiqueta de script que carga xlsx.js:```html

root@kitploit:~
El script también incluye `IE_LoadFile` y `IE_SaveFile` para cargar y guardar
archivos en las versiones 6-9 de Internet Explorer.  El script `xlsx.extendscript.js`
incluye el shim en un formato adecuado para Photoshop y otros productos de Adobe.

</details>

### Uso

La mayoría de los escenarios que involucran hojas de cálculo y datos se pueden dividir en 5 partes:

1) **Adquirir datos**:  Los datos pueden estar almacenados en cualquier lugar: archivos locales o remotos,
   bases de datos, tablas HTML, o incluso generarse programáticamente en el navegador web.

2) **Extraer datos**:  Para archivos de hoja de cálculo, esto implica analizar los bytes sin procesar para
   leer los datos de las celdas. Para datos JS generales, esto implica reestructurar los datos.

3) **Procesar datos**:  Desde generar estadísticas resumidas hasta limpiar
   registros de datos, este paso es el corazón del problema.

4) **Empaquetar datos**:  Esto puede implicar crear una nueva hoja de cálculo o serializar
   con `JSON.stringify`, escribir XML o simplemente aplanar los datos para herramientas de interfaz de usuario.

5) **Liberar datos**:  Los archivos de hoja de cálculo se pueden subir a un servidor o escribir
   localmente.  Los datos se pueden presentar a los usuarios en una tabla HTML o en una cuadrícula de datos.

Un problema común implica generar una exportación válida de hoja de cálculo a partir de datos almacenados
en una tabla HTML.  En este ejemplo, se extraerá una tabla HTML de la página,
se añadirá una fila al final con la fecha del informe, y se generará un nuevo archivo
que se descargará localmente. `XLSX.writeFile` se encarga de
empaquetar los datos e intentar una descarga local:```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");
Descargar herramienta
  • Objeto de libro de trabajo
    • Propiedades del archivo del libro de trabajo
  • Atributos a nivel de libro de trabajo
    • Nombres definidos
    • Vistas del libro de trabajo
    • Propiedades varias del libro de trabajo
  • Características del documento
    • Fórmulas
    • Propiedades de filas y columnas
    • Formatos numéricos
    • Hipervínculos
    • Comentarios de celda
    • Visibilidad de la hoja
    • VBA y macros
  • Opciones de análisis
    • Tipo de entrada
    • Detección del tipo de archivo
  • Opciones de escritura
    • Formatos de salida admitidos
    • Tipo de salida
  • Funciones de utilidad
    • Entrada de matriz de matrices
    • Entrada de matriz de objetos
    • Entrada de tabla HTML
    • Salida de fórmulas
    • Salida separada por delimitadores
      • Texto Unicode UTF-16
    • Salida HTML
    • JSON
  • Formatos de archivo
  • Pruebas
    • Node
    • Navegador
    • Entornos probados
    • Archivos de prueba
  • Contribuciones
    • OSX/Linux
    • Windows
    • Pruebas
  • Licencia
  • Referencias
  • Esta biblioteca intenta simplificar los pasos 2 y 4 con funciones para extraer datos útiles de archivos de hojas de cálculo (read / readFile) y generar nuevos archivos de hoja de cálculo a partir de datos (write / writeFile). Funciones de utilidad adicionales como table_to_book funcionan con otras fuentes de datos comunes como tablas HTML.

    Esta documentación y varios proyectos de demostración cubren una serie de escenarios y enfoques comunes para los pasos 1 y 5.

    Las funciones de utilidad ayudan con el paso 3.

    "Adquisición y extracción de datos" describe soluciones para escenarios comunes de importación de datos.

    "Empaquetado y publicación de datos" describe soluciones para escenarios comunes de exportación de datos.

    "Procesamiento de datos" describe soluciones para escenarios comunes de procesamiento y manipulación de libros de trabajo.

    "Funciones de utilidad" detalla funciones de utilidad para convertir Arrays JSON y otras estructuras comunes de JS en objetos de hoja de trabajo.

    El Zen de SheetJS

    El procesamiento de datos debería encajar en cualquier flujo de trabajo

    La biblioteca no impone un ciclo de vida separado. Se integra bien en sitios web y aplicaciones creadas con cualquier framework. Los objetos de datos JS simples funcionan bien con Web Workers y futuras APIs.

    JavaScript es un lenguaje potente para el procesamiento de datos

    El "Formato Común de Hoja de Cálculo" es una representación simple en objetos de los conceptos centrales de un libro de trabajo. Las diversas funciones de la biblioteca proporcionan herramientas de bajo nivel para trabajar con el objeto.

    Para un procesamiento JS más amigable, hay funciones de utilidad para convertir partes de una hoja de trabajo en un Array de Arrays y viceversa. El siguiente ejemplo combina potentes métodos de Array de JS con una biblioteca de peticiones de red para descargar datos, seleccionar la información que queremos y crear un archivo de libro de trabajo:

    Obtener datos de un endpoint JSON y generar un libro de trabajo (clic para mostrar)

    El objetivo es generar un libro de trabajo XLSB con los nombres y cumpleaños de los presidentes de EE. UU.

    Adquirir datos

    Datos sin procesar

    https://theunitedstates.io/congress-legislators/executive.json contiene los datos deseados. Por ejemplo, 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:~
    _Filtrado para Presidentes_
    
    El conjunto de datos incluye a Aaron Burr, un Vicepresidente que nunca fue Presidente.
    
    `Array#filter` crea un nuevo array con las filas deseadas.  Un Presidente sirvió
    al menos un mandato con `type` establecido en `"prez"`.  Para comprobar si una fila concreta tiene
    al menos un mandato `"prez"`, `Array#some` es otra función nativa de JS.  El
    filtro completo sería:```js
    const prez = raw_data.filter(row => row.terms.some(term => term.type === "prez"));
    

    Alineando los datos

    Para este ejemplo, el nombre será el primer nombre combinado con el apellido (row.name.first + " " + row.name.last) y la fecha de nacimiento será el subcampo row.bio.birthday. Usando Array#map, el conjunto de datos se puede transformar en una sola llamada:```js const rows = prez.map(row => ({ name: row.name.first + " " + row.name.last, birthday: row.bio.birthday }));

    root@kitploit:~
    El resultado es un array de objetos "simples" sin anidamiento:```js
    [
      { name: "George Washington", birthday: "1732-02-22" },
      { name: "John Adams", birthday: "1735-10-19" },
      // ... one row per President
    ]
    

    Extraer datos

    Con el conjunto de datos limpio, XLSX.utils.json_to_sheet genera una hoja de cálculo:```js const worksheet = XLSX.utils.json_to_sheet(rows);

    root@kitploit:~
    `XLSX.utils.book_new` crea un nuevo libro de trabajo y `XLSX.utils.book_append_sheet` añade una hoja de cálculo al libro de trabajo. La nueva hoja de cálculo se llamará "Dates":```js
    const workbook = XLSX.utils.book_new();
    XLSX.utils.book_append_sheet(workbook, worksheet, "Dates");
    

    Process Data

    Fixing headers

    Por defecto, json_to_sheet crea una hoja de cálculo con una fila de encabezados. En este caso, los encabezados provienen de las claves del objeto JS: "name" y "birthday".

    Los encabezados están en las celdas A1 y B1. XLSX.utils.sheet_add_aoa puede escribir valores de texto en la hoja de cálculo existente comenzando en la celda A1:```js XLSX.utils.sheet_add_aoa(worksheet, [["Name", "Birthday"]], { origin: "A1" });

    root@kitploit:~
    _Fixing Column Widths_
    
    Algunos de los nombres son más largos que el ancho de columna predeterminado.  Los anchos de columna se establecen mediante [la propiedad de la hoja de cálculo `"!cols"`](#row-and-column-properties).
    
    La siguiente línea establece el ancho de la columna A en aproximadamente 10 caracteres:```js
    worksheet["!cols"] = [ { wch: 10 } ]; // set column A width to 10 characters
    

    Una llamada a Array#reduce sobre rows puede calcular el ancho máximo:```js const max_width = rows.reduce((w, r) => Math.max(w, r.name.length), 10); worksheet["!cols"] = [ { wch: max_width } ];

    root@kitploit:~
    Nota: Si el punto de partida era un archivo o una tabla HTML, `XLSX.utils.sheet_to_json`
    generará una matriz de objetos JS.
    
    **Datos de Paquete y Versión**
    
    `XLSX.writeFile` crea un archivo de hoja de cálculo e intenta escribirlo en el sistema.
    En el navegador, intentará solicitar al usuario que descargue el archivo.  En NodeJS,
    lo escribirá en el directorio local.```js
    XLSX.writeFile(workbook, "Presidents.xlsx");
    

    Ejemplo 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:~
    Para usar en el navegador web, suponiendo que el snippet se guarde como `snippet.js`, se deben usar etiquetas de script para incluir las compilaciones independientes de `axios` y `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>
    

    Los formatos de archivo son detalles de implementación

    El analizador cubre una amplia gama de formatos de archivo de hoja de cálculo comunes para garantizar que los archivos "HTML-guardado-como-XLS" funcionen igual que los archivos XLS o XLSX reales.

    El escritor admite una serie de formatos de salida comunes para una amplia compatibilidad con el ecosistema de datos.

    En la mayor medida posible, el código de procesamiento de datos no debería tener que preocuparse por los formatos de archivo específicos involucrados.

    Demostraciones del Ecosistema JS

    El directorio demos incluye proyectos de ejemplo para:

    Frameworks y APIs

    • angularjs
    • angular e ionic
    • knockout
    • meteor
    • react y react-native
    • vue 2.x y weex
    • XMLHttpRequest y fetch
    • servidor nodejs
    • bases de datos y almacenes clave/valor
    • arrays tipados y matemáticas

    Empaquetadores y Herramientas

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

    Plataformas e Integraciones

    • deno
    • aplicación electron
    • aplicación nw.js
    • extensiones de Chrome / Chromium
    • Descargar una Google Sheet localmente
    • Adobe ExtendScript
    • Navegadores sin interfaz gráfica
    • canvas-datagrid
    • x-spreadsheet
    • react-data-grid
    • vue3-table-light
    • Swift JSC y otros motores
    • funciones "serverless"
    • internet explorer

    Otros ejemplos se incluyen en el showcase.

    https://sheetjs.com/demos/modify.html muestra un ejemplo completo de lectura, modificación y escritura de archivos.

    https://github.com/SheetJS/sheetjs/blob/HEAD/bin/xlsx.njs es la herramienta de línea de comandos incluida con las instalaciones de node, que lee archivos de hoja de cálculo y exporta el contenido en varios formatos.

    Adquisición y Extracción de Datos

    Análisis de Libros de Trabajo

    API

    Extraer datos de bytes de hojas de cálculo```js var workbook = XLSX.read(data, opts);

    root@kitploit:~
    El método `read` puede extraer datos de bytes de hoja de cálculo almacenados en una cadena JS,
    "cadena binaria", buffer de NodeJS o array tipado (`Uint8Array` o `ArrayBuffer`).
    
    
    _Leer bytes de hoja de cálculo desde un archivo local y extraer datos_```js
    var workbook = XLSX.readFile(filename, opts);
    

    El método readFile intenta leer un archivo de hoja de cálculo en la ruta proporcionada. Los navegadores generalmente no permiten leer archivos de esta manera (se considera un riesgo de seguridad), y los intentos de leer archivos de esta forma lanzarán un error.

    El segundo argumento opts es opcional. "Opciones de análisis" cubre las propiedades y comportamientos admitidos.

    Ejemplos

    Estos son algunos escenarios comunes (haz clic en cada subtítulo para ver el código):

    Archivo local en un servidor NodeJS (clic para mostrar)

    readFile utiliza fs.readFileSync bajo el capó:```js var XLSX = require("xlsx");

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

    root@kitploit:~
    Para Node ESM, el helper `readFile` no está habilitado. En su lugar, `fs.readFileSync`
    debe usarse para leer los datos del archivo como un `Buffer` para usarlos 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);
    
    Archivo local en una aplicación de Deno (clic para mostrar)

    readFile utiliza 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:~
    Las aplicaciones que leen archivos deben invocarse con el indicador `--allow-read`.  El
    [`deno` demo](https://github.com/weareu/xlsx/blob/HEAD/demos/deno/) tiene más ejemplos
    
    </details>
    
    <details>
      <summary><b>Archivo enviado por el usuario en una página web ("Arrastrar y soltar")</b> (click to show)</summary>
    
    Para sitios web modernos que apuntan a Chrome 76+, se recomienda `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);
    

    Para máxima compatibilidad, se debe usar la 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/> demuestra la técnica de FileReader.
    
    </details>
    
    <details>
      <summary><b>Archivo enviado por el usuario con un elemento HTML INPUT</b> (clic para mostrar)</summary>
    
    Empezando con un elemento HTML INPUT con `type="file"`:```html
    <input type="file" id="input_dom_element">
    

    Para sitios web modernos que apuntan a Chrome 76+, se recomienda 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:~
    Para una compatibilidad más amplia (incluido IE10+), se recomienda el enfoque `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);
    

    La demo oldie muestra un escenario de respaldo compatible con IE.

    Obtener un archivo en el navegador web ("Ajax") (clic para mostrar)

    Para sitios web modernos dirigidos a Chrome 42+, se recomienda fetch:```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:~
    Para una compatibilidad más amplia, se recomienda el enfoque `XMLHttpRequest`:```js
    var url = "http://oss.sheetjs.com/test_files/formula_stress_test.xlsx";
    
    /* set up async GET request */
    var req = new XMLHttpRequest();
    req.open("GET", url, true);
    req.responseType = "arraybuffer";
    
    req.onload = function(e) {
      var workbook = XLSX.read(req.response);
    
      /* DO SOMETHING WITH workbook HERE */
    };
    
    req.send();
    

    La demo xhr incluye una discusión más detallada y más ejemplos.

    http://oss.sheetjs.com/sheetjs/ajax.html muestra enfoques de respaldo para IE6+.

    Archivo local en un plugin de PhotoShop o InDesign (haz clic para mostrar)

    readFile envuelve la lógica de File en Photoshop y otros destinos de ExtendScript. La ruta especificada debe ser una ruta absoluta:```js #include "xlsx.extendscript.js"

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

    root@kitploit:~
    La [demostración de `extendscript`](https://github.com/weareu/xlsx/blob/HEAD/demos/extendscript/) incluye un ejemplo más complejo.
    
    </details>
    
    <details>
      <summary><b>Archivo local en una aplicación Electron</b> (haz clic para mostrar)</summary>
    
    `readFile` se puede usar en el proceso de renderizado:```js
    /* From the renderer process */
    var XLSX = require("xlsx");
    
    var workbook = XLSX.readFile(path);
    

    Las APIs de Electron han cambiado con el tiempo. La electron demo muestra un ejemplo completo y detalla la configuración requerida específica de la versión.

    Archivo local en una aplicación móvil con React Native (haz clic para mostrar)

    La react demo incluye una aplicación React Native de ejemplo.

    Dado que React Native no ofrece una forma de leer archivos del sistema de archivos, se debe utilizar una biblioteca de terceros. Se han probado las siguientes bibliotecas:

    • react-native-file-access

    La codificación base64 devuelve cadenas compatibles con el 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 codificación `ascii` devuelve cadenas binarias compatibles con el 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"});
    
    Cargas de Archivos en Servidor NodeJS (haz clic para mostrar)

    read puede aceptar un buffer de NodeJS. readFile puede leer archivos generados por un analizador de cuerpo de solicitudes HTTP POST como 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:~
    La [demo `server`](https://github.com/weareu/xlsx/blob/HEAD/demos/server) tiene ejemplos más avanzados.
    
    </details>
    
    <details>
      <summary><b>Descargar archivos en un proceso NodeJS</b> (haz clic para mostrar)</summary>
    
    Node 17.5 y 18.0 tienen soporte nativo para fetch:```js
    const XLSX = require("xlsx");
    
    const data = await (await fetch(url)).arrayBuffer();
    /* data is an ArrayBuffer */
    const workbook = XLSX.read(data);
    

    Para una mayor compatibilidad, se recomiendan módulos de terceros.

    request requiere una codificación null para producir 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) funciona de la misma manera en el navegador y en 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 */
    })();
    
    Descargar archivos en una aplicación Electron (haz clic para mostrar)

    El módulo net en el proceso principal puede realizar solicitudes HTTP/HTTPS a recursos externos. Las respuestas deben concatenarse 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>Flujos legibles en NodeJS</b> (clic para mostrar)</summary>
    
    Al trabajar con flujos legibles, el enfoque más sencillo es almacenar en búfer el flujo
    y procesar todo al final:```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 en el navegador (clic para mostrar)

    Al trabajar con ReadableStream, el enfoque más sencillo es almacenar en búfer el flujo y procesar todo al final:```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>
    
    Los ejemplos más detallados están cubiertos en las [demostraciones incluidas](https://github.com/weareu/xlsx/blob/HEAD/demos/)
    
    ### Procesamiento de datos JSON y JS
    
    Los datos JSON y JS tienden a representar hojas de cálculo individuales. Esta sección utilizará algunas funciones de utilidad para generar libros de trabajo.
    
    _Crear un nuevo Workbook_```js
    var workbook = XLSX.utils.book_new();
    

    La función de utilidad book_new crea un libro de trabajo vacío sin hojas de cálculo.

    El software de hojas de cálculo generalmente requiere al menos una hoja de cálculo y aplica el requisito en la interfaz de usuario. Esta librería aplica el requisito al escribir, lanzando errores si se pasa un libro de trabajo vacío a las funciones de escritura.

    API

    Crear una hoja de cálculo a partir de un array de arrays de valores JS```js var worksheet = XLSX.utils.aoa_to_sheet(aoa, opts);

    root@kitploit:~
    La función de utilidad `aoa_to_sheet` recorre una "matriz de matrices" en orden fila-principal, generando un objeto de hoja de cálculo. El siguiente fragmento genera una hoja con la celda `A1` establecida en la cadena `A1`, la celda `B1` en `B1`, etc:```js
    var worksheet = XLSX.utils.aoa_to_sheet([
      ["A1", "B1", "C1"],
      ["A2", "B2", "C2"],
      ["A3", "B3", "C3"]
    ]);
    

    "Entrada de matriz de matrices" describe la función y el argumento opcional opts con más detalle.

    Crear una hoja de cálculo a partir de una matriz de objetos JS```js var worksheet = XLSX.utils.json_to_sheet(jsa, opts);

    root@kitploit:~
    La función de utilidad `json_to_sheet` recorre un array de objetos JS en orden,
    generando un objeto de hoja de cálculo.  Por defecto, generará una fila de encabezado y
    una fila por objeto en el array.  El argumento opcional `opts` tiene configuraciones para
    controlar el orden de las columnas y la salida del encabezado.
    
    ["Entrada de array de objetos"](#array-of-arrays-input) describe la función y
    el argumento opcional `opts` con más detalle.
    
    **Ejemplos**
    
    ["Zen de SheetJS"](#the-zen-of-sheetjs) contiene un ejemplo detallado "Obtener datos
    de un endpoint JSON y generar un libro de trabajo"
    
    
    [`x-spreadsheet`](https://github.com/myliang/x-spreadsheet) es una cuadrícula interactiva
    de datos para previsualizar y modificar datos estructurados en el navegador web.  El
    [`xspreadsheet` demo](https://github.com/weareu/xlsx/blob/HEAD/demos/xspreadsheet) incluye un script de ejemplo con la
    función `xtos` para convertir desde el objeto de datos de x-spreadsheet a un libro de trabajo.
    <https://oss.sheetjs.com/sheetjs/x-spreadsheet> es una demo en vivo.
    
    <details>
      <summary><b>Registros de una consulta de base de datos (SQL o no-SQL)</b> (haz clic para mostrar)</summary>
    
    El [`database` demo](https://github.com/weareu/xlsx/blob/HEAD/demos/database/) incluye ejemplos de trabajo con
    bases de datos y resultados de consultas.
    
    </details>
    
    
    <details>
      <summary><b>Cálculos numéricos con TensorFlow.js</b> (haz clic para mostrar)</summary>
    
    [`@tensorflow/tfjs`](https://github.com/weareu/xlsx/blob/HEAD/@tensorflow/tfjs) y otras bibliotecas esperan datos en arrays
    simples, muy adecuados para hojas de cálculo donde cada columna es un vector de datos.  Eso es
    la transpuesta de cómo la mayoría de las personas usan las hojas de cálculo, donde cada fila es un vector.
    
    Al recuperar datos de `tfjs`, los puntos de datos devueltos se almacenan en un array
    tipado.  Se puede construir un array de arrays con bucles. `Array#unshift` puede
    anteponer una fila de título antes de la conversión:```js
    const XLSX = require("xlsx");
    const tf = require('@tensorflow/tfjs');
    
    /* suppose xs and ys are vectors (1D tensors) -> tfarr will be a typed array */
    const tfdata = tf.stack([xs, ys]).transpose();
    const shape = tfdata.shape;
    const tfarr = tfdata.dataSync();
    
    /* construct the array of arrays */
    const aoa = [];
    for(let j = 0; j < shape[0]; ++j) {
      aoa[j] = [];
      for(let i = 0; i < shape[1]; ++i) aoa[j][i] = tfarr[j * shape[1] + i];
    }
    /* add headers to the top */
    aoa.unshift(["x", "y"]);
    
    /* generate worksheet */
    const worksheet = XLSX.utils.aoa_to_sheet(aoa);
    

    La demostración array muestra un ejemplo completo.

    Procesamiento de Tablas HTML

    API

    Crea una hoja de cálculo extrayendo una TABLA HTML de la página```js var worksheet = XLSX.utils.table_to_sheet(dom_element, opts);

    root@kitploit:~
    La función de utilidad `table_to_sheet` toma un elemento DOM TABLE y recorre las filas para generar una hoja de cálculo. El argumento `opts` es opcional. [Entrada de tabla HTML](#html-table-input) describe la función con más detalle.
    
    
    
    _Crea un libro de trabajo extrayendo una tabla HTML de la página_```js
    var workbook = XLSX.utils.table_to_book(dom_element, opts);
    

    La función de utilidad table_to_book sigue la misma lógica que table_to_sheet. Después de generar una hoja de cálculo, crea un libro de trabajo en blanco y añade la hoja.

    El argumento de opciones admite las mismas opciones que table_to_sheet, con la adición de una propiedad sheet para controlar el nombre de la hoja de cálculo. Si la propiedad falta o no se especifican opciones, se utiliza el nombre predeterminado Sheet1.

    Ejemplos

    Aquí hay algunos escenarios comunes (haz clic en cada subtítulo para ver el código):

    Elemento HTML TABLE en una página web (haz clic para mostrar)```html
    SheetJS
    1234567
    root@kitploit:~
    Se pueden convertir varias tablas de una página web en hojas de cálculo individuales:```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 */
    

    Alternativamente, el código HTML se puede extraer y analizar:```js var htmlstr = document.getElementById("tableau").outerHTML; var workbook = XLSX.read(htmlstr, {type:"string"});

    root@kitploit:~
    </details>
    
    <details>
      <summary><b>Extensión de Chrome/Chromium</b> (clic para mostrar)</summary>
    
    La [demo de `chrome`](https://github.com/weareu/xlsx/blob/HEAD/demos/chrome/) muestra un ejemplo completo y detalla los
    permisos requeridos y otras configuraciones.
    
    En una extensión, se recomienda generar el libro de trabajo en un script de contenido
    y pasar el objeto de vuelta a la extensión:```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);
    });
    
    Tablas HTML del lado del servidor con Headless Chrome (click to show)

    La demo headless incluye una demo completa para convertir archivos HTML a libros de trabajo XLSB. La idea central es añadir el script a la página, analizar la tabla en el contexto de la página, generar un libro de trabajo en base64 y enviarlo de vuelta para su posterior procesamiento:```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>Tablas HTML del lado del servidor con WebKit sin interfaz gráfica</b> (clic para mostrar)</summary>
    
    La [`demo` headless](https://github.com/weareu/xlsx/blob/HEAD/demos/headless/) incluye una demo completa para convertir
    archivos HTML en libros de trabajo XLSB usando [PhantomJS](https://phantomjs.org/). La idea
    principal es añadir el script a la página, analizar la tabla en el contexto de la página, generar
    un libro de trabajo `binary` y enviarlo de vuelta para su posterior procesamiento:```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();
      });
    });
    
    Tablas HTML en NodeJS sin navegador (clic para mostrar)

    NodeJS no incluye una implementación del DOM y Puppeteer requiere una voluminosa compilación de Chromium. jsdom es una alternativa ligera:```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>
    
    ## Procesamiento de datos
    
    El ["Formato Común de Hoja de Cálculo"](#common-spreadsheet-format) es una representación de objetos
    simple de los conceptos centrales de un libro de trabajo.  Las funciones de utilidad trabajan
    con la representación de objetos y están diseñadas para manejar casos de uso comunes.
    
    ### Modificación de la estructura del libro de trabajo
    
    **API**
    
    _Agregar una hoja de cálculo a un libro de trabajo_```js
    XLSX.utils.book_append_sheet(workbook, worksheet, sheet_name);
    

    La función de utilidad book_append_sheet añade una hoja de cálculo al libro de trabajo. El tercer argumento especifica el nombre deseado de la hoja de cálculo. Se pueden añadir varias hojas de cálculo a un libro de trabajo llamando a la función varias veces. Si el nombre de la hoja de cálculo ya se utiliza en el libro de trabajo, se lanzará un error.

    Añade una hoja de cálculo a un libro de trabajo y encuentra un nombre único```js var new_name = XLSX.utils.book_append_sheet(workbook, worksheet, name, true);

    root@kitploit:~
    Si el cuarto argumento es `true`, la función comenzará con el
    nombre de la hoja de cálculo especificado.  Si el nombre de la hoja existe en el libro de trabajo, se elegirá un nuevo nombre de hoja de cálculo
    encontrando la raíz del nombre e incrementando el contador:```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
    

    Enumera los nombres de las hojas de cálculo en orden de pestañas```js var wsnames = workbook.SheetNames;

    root@kitploit:~
    La propiedad `SheetNames` del objeto workbook es una lista de los nombres
    de las hojas de cálculo en "orden de pestañas".  Las funciones de la API utilizarán esta matriz.
    
    _Reemplazar una hoja de cálculo en su lugar_```js
    workbook.Sheets[sheet_name] = new_worksheet;
    

    La propiedad Sheets del objeto workbook es un objeto cuyas claves son nombres y cuyos valores son objetos de hoja de cálculo. Al reasignar una propiedad del objeto Sheets, el objeto de hoja de cálculo se puede cambiar sin alterar el resto de la estructura de la hoja de cálculo.

    Ejemplos

    Agregar una nueva hoja de cálculo a un libro de trabajo (hacer clic para mostrar)

    Este ejemplo utiliza 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>
    
    ### Modificación de valores de celda
    
    **API**
    
    _Modifica un valor de celda individual en una hoja de cálculo_```js
    XLSX.utils.sheet_add_aoa(worksheet, [[new_value]], { origin: address });
    

    Modificar múltiples valores de celdas en una hoja de cálculo```js XLSX.utils.sheet_add_aoa(worksheet, aoa, opts);

    root@kitploit:~
    La función de utilidad `sheet_add_aoa` modifica los valores de las celdas en una hoja de cálculo.  El
    primer argumento es el objeto de la hoja de cálculo.  El segundo argumento es un array de
    arrays de valores.  La clave `origin` del tercer argumento controla dónde se escribirán
    las celdas.  El siguiente fragmento establece `B3=1` y `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" });
    

    "Array of Arrays Input" describe la función y el argumento opcional opts con más detalle.

    Opciones de análisis

    Las funciones exportadas read y readFile aceptan un argumento de opciones:

    • Incluso si cellNF es false, se generará texto formateado y se guardará en .w
    • En algunos casos, las hojas pueden analizarse incluso si bookSheets es false.
    • Excel intenta de forma agresiva interpretar valores de CSV y otros textos planos. ¡Esto puede provocar comportamientos sorprendentes! La opción raw suprime la interpretación de valores.
    • bookSheets y bookProps se combinan para ofrecer ambos conjuntos de información
    • Deps será un objeto vacío si bookDeps es false
    • El comportamiento de bookFiles depende del tipo de archivo:
      • matriz keys (rutas en el ZIP) para formatos basados en ZIP
      • hash files (mapeo de rutas a objetos que representan los archivos) para ZIP
      • objeto cfb para formatos que usan contenedores CFB

    Tipo de entrada

    Las cadenas pueden interpretarse de varias maneras. El parámetro type de read le indica a la biblioteca cómo analizar el argumento de datos:

    Adivinación del tipo de archivo

    Detalles de implementación (haz clic para mostrar)

    Excel y otras herramientas de hojas de cálculo leen los primeros bytes y aplican otras heurísticas para determinar el tipo de archivo. Esto permite jugar con el tipo de archivo: renombrar archivos con la extensión .xls le indicará a tu computadora usar Excel para abrir el archivo, pero Excel sabrá cómo manejarlo. Esta biblioteca aplica una lógica similar:

    ¿Por qué los archivos de texto aleatorios son válidos? (haz clic para mostrar)

    Excel es extremadamente agresivo al leer archivos. Añadir una extensión XLS a cualquier archivo de texto de visualización (donde los únicos caracteres son caracteres de visualización ANSI) engaña a Excel haciéndole pensar que el archivo podría ser un archivo CSV o TSV, ¡incluso si es de una sola columna! Esta biblioteca intenta replicar ese comportamiento.

    El mejor enfoque es validar la hoja de cálculo deseada y asegurarse de que tenga el número esperado de filas o columnas. Extraer el rango es extremadamente simple:```js var range = XLSX.utils.decode_range(worksheet['!ref']); var ncols = range.e.c - range.s.c + 1, nrows = range.e.r - range.s.r + 1;

    root@kitploit:~
    </details>
    
    ## Opciones de Escritura
    
    Las funciones exportadas `write` y `writeFile` aceptan un argumento de opciones:
    
    | Nombre de la opción |  Predeterminado | Descripción                                         |
    | :---------- | -------: | :-------------------------------------------------- |
    |`type`       |          | Codificación de datos de salida (ver Tipo de Salida más abajo)        |
    |`cellDates`  |  `false` | Almacenar fechas como tipo `d` (predeterminado es `n`)            |
    |`bookSST`    |  `false` | Generar Tabla de Cadenas Compartidas **                     |
    |`bookType`   | `"xlsx"` | Tipo de Libro de Trabajo (ver formatos soportados más abajo)  |
    |`sheet`      |     `""` | Nombre de la Hoja de Cálculo para formatos de una sola hoja **       |
    |`compression`|  `false` | Usar compresión ZIP para formatos basados en ZIP **        |
    |`Props`      |          | Sobrescribir las propiedades del libro de trabajo al escribir **        |
    |`themeXLSX`  |          | Sobrescribir el XML del tema al escribir XLSX/XLSB/XLSM **   |
    |`ignoreEC`   |   `true` | Suprimir errores de "número como texto" **                 |
    |`numbers`    |          | Carga útil para exportación NUMBERS **                       |
    
    - `bookSST` es más lento y consume más memoria, pero tiene mejor compatibilidad
      con versiones antiguas de iOS Numbers
    - Los datos sin procesar son lo único que se garantiza que se guarde.  Las características no descritas
      en este README pueden no serializarse.
    - `cellDates` solo se aplica a la salida XLSX y no se garantiza que funcione con
      lectores de terceros.  Excel normalmente no escribe celdas con tipo `d`
      por lo que las herramientas que no son de Excel pueden ignorar los datos o dar error en presencia de fechas.
    - `Props` es un objeto que refleja el campo `Props` del libro de trabajo.  Consulte la tabla de
      la sección [Propiedades del archivo de libro de trabajo](#workbook-file-properties).
    - si se especifica, la cadena de `themeXLSX` se guardará como el tema principal
      para los archivos XLSX/XLSB/XLSM (en `xl/theme/theme1.xml` dentro del ZIP)
    - Debido a un error en el programa, algunas funciones como "Texto en columnas" harán que Excel se bloquee
      en hojas de cálculo donde se ignoran las condiciones de error.  El escritor marcará los archivos para
      ignorar el error de forma predeterminada.  Establezca `ignoreEC` en `false` para suprimirlo.
    - Debido al tamaño de los datos, los datos NUMBERS no se incluyen de forma predeterminada.  Los
      scripts incluidos `xlsx.zahl.js` y `xlsx.zahl.mjs` incluyen los datos.
    
    ### Formatos de Salida Soportados
    
    Para una amplia compatibilidad con herramientas de terceros, esta biblioteca admite muchos
    formatos de salida.  El tipo de archivo específico se controla con la opción `bookType`:
    
    | `bookType` | ext. de archivo | contenedor | hojas | Descripción                     |
    | :--------- | -------: | :-------: | :----- |:------------------------------- |
    | `xlsx`     | `.xlsx`  |    ZIP    | múltiple  | Formato XML de Excel 2007+          |
    | `xlsm`     | `.xlsm`  |    ZIP    | múltiple  | Formato XML de macros de Excel 2007+    |
    | `xlsb`     | `.xlsb`  |    ZIP    | múltiple  | Formato binario de Excel 2007+       |
    | `biff8`    | `.xls`   |    CFB    | múltiple  | Formato de libro de Excel 97-2004   |
    | `biff5`    | `.xls`   |    CFB    | múltiple  | Formato de libro de Excel 5.0/95    |
    | `biff4`    | `.xls`   |   ninguno | única    | Formato de hoja de cálculo de Excel 4.0 |
    | `biff3`    | `.xls`   |   ninguno | única    | Formato de hoja de cálculo de Excel 3.0 |
    | `biff2`    | `.xls`   |   ninguno | única    | Formato de hoja de cálculo de Excel 2.0 |
    | `xlml`     | `.xls`   |   ninguno | múltiple  | Excel 2003-2004 (SpreadsheetML) |
    | `numbers`  |`.numbers`|    ZIP    | única    | Hoja de cálculo Numbers 3.0+        |
    | `ods`      | `.ods`   |    ZIP    | múltiple  | Hoja de cálculo OpenDocument        |
    | `fods`     | `.fods`  |   ninguno | múltiple  | Hoja de cálculo OpenDocument plana   |
    | `wk3`      | `.wk3`   |   ninguno | múltiple  | Libro de trabajo Lotus (WK3)            |
    | `csv`      | `.csv`   |   ninguno | única    | Valores separados por comas          |
    | `txt`      | `.txt`   |   ninguno | única    | Texto Unicode UTF-16 (TXT)       |
    | `sylk`     | `.sylk`  |   ninguno | única    | Enlace simbólico (SYLK)            |
    | `html`     | `.html`  |   ninguno | única    | Documento HTML                   |
    | `dif`      | `.dif`   |   ninguno | única    | Formato de intercambio de datos (DIF)   |
    | `dbf`      | `.dbf`   |   ninguno | única    | dBASE II + extensiones VFP (DBF) |
    | `wk1`      | `.wk1`   |   ninguno | única    | Hoja de cálculo Lotus (WK1)           |
    | `rtf`      | `.rtf`   |   ninguno | única    | Formato de texto enriquecido (RTF)          |
    | `prn`      | `.prn`   |   ninguno | única    | Texto formateado Lotus            |
    | `eth`      | `.eth`   |   ninguno | única    | Formato de registro Ethercalc (ETH)   |
    
    - `compression` solo se aplica a formatos con contenedores ZIP.
    - Los formatos que solo admiten una sola hoja requieren una opción `sheet` que especifique
      la hoja de cálculo.  Si la cadena está vacía, se utiliza la primera hoja de cálculo.
    - `writeFile` adivinará automáticamente el formato de archivo de salida basándose en la extensión
      del archivo si no se especifica `bookType`.  Elegirá el primer formato de
      la tabla mencionada que coincida con la extensión.
    
    ### Tipo de Salida
    
    El argumento `type` para `write` refleja el argumento `type` para `read`:
    
    | `type`     | salida                                                          |
    |------------|-----------------------------------------------------------------|
    | `"base64"` | string: codificación Base64 del archivo                         |
    | `"binary"` | string: cadena binaria (el byte `n` es `data.charCodeAt(n)`)    |
    | `"string"` | string: cadena JS (los caracteres se interpretan como UTF8)     |
    | `"buffer"` | Buffer de nodejs                                                |
    | `"array"`  | ArrayBuffer, matriz de respaldo de enteros sin signo de 8 bits  |
    | `"file"`   | string: ruta del archivo que se creará (solo nodejs)            |
    
    - Para compatibilidad con Excel, la salida `csv` siempre incluirá la marca de orden de bytes
      UTF-8.
    
    ## Funciones de Utilidad
    
    Las funciones `sheet_to_*` aceptan una hoja de cálculo y un objeto de opciones opcional.
    
    Las funciones `*_to_sheet` aceptan un objeto de datos y un objeto de opciones opcional.
    
    ---
    
    [Read more](https://github.com/weareu/xlsx)
    

    Ejemplos

    Añadir filas a una hoja de cálculo (click para mostrar)

    El valor especial de origen -1 indica a sheet_add_aoa que comience en la columna A de la fila siguiente a la última fila del rango, añadiendo los datos:```js XLSX.utils.sheet_add_aoa(worksheet, [ ["first row after data", 1], ["second row after data", 2] ], { origin: -1 });

    root@kitploit:~
    </details>
    
    
    ### Modificación de otras propiedades de hoja de cálculo / libro de trabajo / celda
    
    La sección ["Formato común de hoja de cálculo"](#common-spreadsheet-format) describe
    las estructuras de los objetos con mayor detalle.
    
    ## Empaquetado y publicación de datos
    
    ### Escritura de libros de trabajo
    
    **API**
    
    _Generar bytes de hoja de cálculo (archivo) a partir de datos_```js
    var data = XLSX.write(workbook, opts);
    

    El método write intenta empaquetar los datos del libro de trabajo en un archivo en memoria. De forma predeterminada, se generan archivos XLSX, pero eso se puede controlar con la propiedad bookType del argumento opts. Según la opción type, los datos se pueden almacenar como una "cadena binaria", una cadena JS, Uint8Array o Buffer.

    El segundo argumento opts es obligatorio. "Opciones de escritura" cubre las propiedades y comportamientos admitidos.

    Generar e intentar guardar el archivo```js XLSX.writeFile(workbook, filename, opts);

    root@kitploit:~
    El método `writeFile` empaqueta los datos e intenta guardar el nuevo archivo.  El
    formato del archivo de exportación se determina por la extensión de `filename` (`SheetJS.xlsx`
    indica exportación XLSX, `SheetJS.xlsb` indica exportación XLSB, etc).
    
    El método `writeFile` utiliza APIs específicas de la plataforma para iniciar el guardado del archivo. En
    NodeJS, `fs.readFileSync` puede crear un archivo.  En el navegador web, se intenta una descarga
    usando el atributo `download` de HTML5, con alternativas para IE.
    
    _Genera e intenta guardar un archivo XLSX_```js
    XLSX.writeFileXLSX(workbook, filename, opts);
    

    El método writeFile incorpora una serie de funciones de exportación diferentes. Esto es excelente para la experiencia del desarrollador, pero no es adecuado para tree shaking con las herramientas de desarrollo actuales. Cuando solo se necesitan exportaciones XLSX, este método evita hacer referencia a las otras funciones de exportación.

    El segundo argumento opts es opcional. "Opciones de escritura" cubre las propiedades y comportamientos admitidos.

    Ejemplos

    Archivo local en un servidor NodeJS (haz clic para mostrar)

    writeFile utiliza fs.writeFileSync en entornos de servidor:```js var XLSX = require("xlsx");

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

    root@kitploit:~
    Para Node ESM, el helper `writeFile` no está habilitado. En su lugar, se debe usar `fs.writeFileSync` para escribir los datos del archivo en un `Buffer` para usarlos 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);
    
    Archivo local en una aplicación Deno (clic para mostrar)

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

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

    root@kitploit:~
    Applications writing files must be invoked with the `--allow-write` flag.  The
    [`deno` demo](https://github.com/weareu/xlsx/blob/HEAD/demos/deno/) has more examples
    
    </details>
    
    <details>
      <summary><b>Local file in a PhotoShop or InDesign plugin</b> (click to show)</summary>
    
    `writeFile` wraps the `File` logic in Photoshop and other ExtendScript targets.
    The specified path should be an absolute path:```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 */
    

    El demo de extendscript incluye un ejemplo más complejo.

    Descargar un archivo en el navegador a la máquina del usuario (haz clic para mostrar)

    XLSX.writeFile envuelve algunas técnicas para desencadenar el guardado de un archivo:

    • La API URL del navegador crea una URL de objeto para el archivo, la cual la biblioteca utiliza creando un enlace y forzando un clic. Es compatible con navegadores modernos.
    • msSaveBlob es una API de IE10+ para desencadenar un guardado de archivo.
    • IE_FileSave utiliza VBScript y ActiveX para escribir un archivo en IE6+ para Windows XP y Windows 7. El shim debe estar incluido en la página HTML contenedora.

    No hay una forma estándar de determinar si el archivo real se ha descargado.```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>Descargar un archivo en navegadores antiguos</b> (haz clic para mostrar)</summary>
    
    Las técnicas de `XLSX.writeFile` funcionan en la mayoría de los navegadores modernos, así como en versiones antiguas de IE.
    Para navegadores mucho más antiguos, existen soluciones alternativas implementadas por librerías envolventes.
    
    [`FileSaver.js`](https://github.com/eligrey/FileSaver.js/) implementa `saveAs`.
    Nota: `XLSX.writeFile` llamará automáticamente a `saveAs` si está disponible.```js
    /* bookType can be any supported output type */
    var wopts = { bookType:"xlsx", bookSST:false, type:"array" };
    
    var wbout = XLSX.write(workbook,wopts);
    
    /* the saveAs call downloads a file on the local machine */
    saveAs(new Blob([wbout],{type:"application/octet-stream"}), "test.xlsx");
    
    Generación de Archivos con PhantomJS (Webkit sin Interfaz) (clic para mostrar)

    La demo headless incluye una demo completa para convertir archivos HTML en libros de trabajo XLSB usando PhantomJS. PhantomJS fs.write admite la escritura de archivos desde el proceso principal, pero tiene una interfaz diferente del módulo fs de NodeJS:```js var XLSX = require('xlsx'); var fs = require('fs');

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

    root@kitploit:~
    Nota: La sección ["Procesamiento de tablas HTML"](#processing-html-tables) muestra cómo
    generar un libro de trabajo a partir de tablas HTML en una página en "Headless WebKit".
    
    </details>
    
    
    
    Las [demostraciones incluidas](https://github.com/weareu/xlsx/blob/HEAD/demos/) cubren aplicaciones móviles y otros despliegues especiales.
    
    ### Ejemplos de escritura
    
    - <http://sheetjs.com/demos/table.html> exporta una tabla HTML
    - <http://sheetjs.com/demos/writexlsx.html> genera un archivo simple
    
    ### Escritura en streaming
    
    Las funciones de escritura en streaming están disponibles en el objeto `XLSX.stream`.  Toman
    los mismos argumentos que las funciones de escritura normales, pero devuelven un flujo
    legible de NodeJS.
    
    - `XLSX.stream.to_csv` es la versión en streaming de `XLSX.utils.sheet_to_csv`.
    - `XLSX.stream.to_html` es la versión en streaming de `XLSX.utils.sheet_to_html`.
    - `XLSX.stream.to_json` es la versión en streaming de `XLSX.utils.sheet_to_json`.
    
    <details>
      <summary><b>nodejs convertir a CSV y escribir archivo</b> (haz clic para mostrar)</summary>```js
    var output_file_name = "out.csv";
    var stream = XLSX.stream.to_csv(worksheet);
    stream.pipe(fs.createWriteStream(output_file_name));
    
    nodejs escribir flujo JSON en pantalla (clic para mostrar)```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>Exportar archivos NUMBERS</b> (click para mostrar)</summary>
    
    El escritor de NUMBERS requiere una base bastante grande. Los scripts complementarios `xlsx.zahl` proporcionan soporte. `xlsx.zahl.js` está diseñado para uso independiente y con NodeJS, mientras que `xlsx.zahl.mjs` es adecuado para ESM.
    
    _Navegador_```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 canaliza flujos de escritura a la respuesta de nodejs.

    Generando datos JSON y JS

    Los datos JSON y JS suelen representar hojas de cálculo individuales. Las funciones de utilidad de esta sección trabajan con hojas de cálculo individuales.

    La sección "Formato común de hoja de cálculo" describe la estructura del objeto con más detalle. workbook.SheetNames es una lista ordenada de los nombres de las hojas de cálculo. workbook.Sheets es un objeto cuyas claves son nombres de hojas y cuyos valores son objetos de hoja de cálculo.

    La "primera hoja de cálculo" se almacena en workbook.Sheets[workbook.SheetNames[0]].

    API

    Crear un array de objetos JS a partir de una hoja de cálculo```js var jsa = XLSX.utils.sheet_to_json(worksheet, opts);

    root@kitploit:~
    _Crea una matriz de matrices de valores JS a partir de una hoja de cálculo_```js
    var aoa = XLSX.utils.sheet_to_json(worksheet, {...opts, header: 1});
    

    La función de utilidad sheet_to_json recorre un libro de trabajo en orden por filas, generando un array de objetos. El segundo argumento opts controla una serie de decisiones de exportación, incluido el tipo de valores (valores JS o texto con formato). La sección "JSON" describe este argumento con más detalle.

    Por defecto, sheet_to_json escanea la primera fila y utiliza los valores como encabezados. Con la opción header: 1, la función exporta un array de arrays de valores.

    Ejemplos

    x-spreadsheet es una cuadrícula de datos interactiva para previsualizar y modificar datos estructurados en el navegador web. La demo de xspreadsheet incluye un script de ejemplo con la función stox para convertir un libro de trabajo en un objeto de datos de x-spreadsheet. https://oss.sheetjs.com/sheetjs/x-spreadsheet es una demo en vivo.

    Previsualizando datos en una cuadrícula de datos de React (haz clic para mostrar)

    react-data-grid es una cuadrícula de datos adaptada para React. Espera dos propiedades: rows de objetos de datos y columns, que describen las columnas. Para manipular los datos y adaptarlos a la API de la cuadrícula de datos de React, lo más fácil es partir de un array de arrays.

    Esta demo comienza obteniendo un archivo remoto y usando XLSX.read para extraer:```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>Vista previa de datos en una cuadrícula de datos de VueJS</b> (clic para mostrar)</summary>
    
    [`vue3-table-lite`](https://github.com/linmasahiro/vue3-table-lite) es una tabla
    de datos simple de VueJS 3.  Se presenta [en la demo de VueJS](https://github.com/weareu/xlsx/blob/HEAD/demos/vue/modify/).
    
    </details>
    
    <details>
      <summary><b>Poblar una base de datos (SQL o no-SQL)</b> (clic para mostrar)</summary>
    
    La [demo de `database`](https://github.com/weareu/xlsx/blob/HEAD/demos/database/) incluye ejemplos de trabajo con
    bases de datos y resultados de consultas.
    
    </details>
    
    <details>
      <summary><b>Cálculos numéricos con TensorFlow.js</b> (clic para mostrar)</summary>
    
    [`@tensorflow/tfjs`](https://github.com/weareu/xlsx/blob/HEAD/@tensorflow/tfjs) y otras bibliotecas esperan datos en
    arreglos simples, adecuados para hojas de cálculo donde cada columna es un
    vector de datos.  Esa es la transposición de cómo la mayoría de las personas usan las hojas de cálculo, donde cada fila es un vector.
    
    Un solo `Array#map` puede extraer filas individuales con nombre de la exportación de `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);
    
    Obtener libro de trabajo con React y generar vistas previas de tablas HTML (haga clic para mostrar)

    Generalmente se recomienda utilizar un flujo de trabajo compatible con React, pero es posible generar HTML y usarlo en 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 [demo `react`](https://github.com/weareu/xlsx/blob/HEAD/demos/react) incluye más ejemplos de React.
    
    </details>
    
    <details>
      <summary><b>Cuaderno de trabajo de fetch de VueJS y generar vistas previas de tablas HTML</b> (clic para mostrar)</summary>
    
    Generalmente se recomienda utilizar un flujo de trabajo compatible con VueJS, pero es posible
    generar HTML y usarlo en VueJS con la directiva `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>`
    };
    

    Generación de instantáneas de una sola hoja de cálculo

    Las funciones sheet_to_* aceptan un objeto de hoja de cálculo.

    API

    Generar un CSV a partir de una sola hoja de cálculo```js var csv = XLSX.utils.sheet_to_csv(worksheet, opts);

    root@kitploit:~
    Esta instantánea está diseñada para replicar el tipo de salida "CSV UTF8 (`.csv`)".
    ["Salida separada por delimitadores"](#delimiter-separated-output) describe la
    función y el argumento opcional `opts` con más detalle.
    
    _Generar "Texto" desde una sola hoja de cálculo_```js
    var txt = XLSX.utils.sheet_to_txt(worksheet, opts);
    

    This snapshot is designed to replicate the "UTF16 Text (.txt)" output type. "Salida separada por delimitadores" describe la función y el argumento opcional opts con más detalle.

    Generar una lista de fórmulas a partir de una sola hoja de cálculo```js var fmla = XLSX.utils.sheet_to_formulae(worksheet);

    root@kitploit:~
    Esta instantánea genera una matriz de entradas que representan las fórmulas incrustadas.
    Las fórmulas de matriz se representan en la forma `range=formula`, mientras que las celdas normales se
    representan en la forma `cell=formula or value`. Los literales de cadena llevan el prefijo
    de un apóstrofo `'`, de acuerdo con la visualización de la barra de fórmulas de Excel.
    
    La sección ["Salida de fórmulas"](#formulae-output) describe la función con más detalle.
    
    ## Interfaz
    
    `XLSX` es la variable expuesta en el navegador y la variable de node exportada
    
    `XLSX.version` es la versión de la biblioteca (añadida por el script de compilación).
    
    `XLSX.SSF` es una versión integrada de la [librería de formatos](https://git.io/ssf).
    
    ### Funciones de análisis
    
    `XLSX.read(data, read_opts)` intenta analizar `data`.
    
    `XLSX.readFile(filename, read_opts)` intenta leer `filename` y analizarla.
    
    Las opciones de análisis se describen en la sección [Opciones de análisis](#parsing-options).
    
    ### Funciones de escritura
    
    `XLSX.write(wb, write_opts)` intenta escribir el libro de trabajo `wb`
    
    `XLSX.writeFile(wb, filename, write_opts)` intenta escribir `wb` en `filename`.
    En entornos basados en navegador, intentará forzar una descarga del lado del cliente.
    
    `XLSX.writeFileAsync(wb, filename, o, cb)` intenta escribir `wb` en `filename`.
    Si se omite `o`, el escritor utilizará el tercer argumento como devolución de llamada.
    
    `XLSX.stream` contiene un conjunto de funciones de escritura en streaming.
    
    Las opciones de escritura se describen en la sección [Opciones de escritura](#writing-options).
    
    ### Utilidades
    
    Las utilidades están disponibles en el objeto `XLSX.utils` y se describen en la
    sección [Funciones de utilidad](#utility-functions):
    
    **Construcción:**
    
    - `book_new` crea un libro de trabajo vacío
    - `book_append_sheet` añade una hoja de cálculo a un libro de trabajo
    
    **Importación:**
    
    - `aoa_to_sheet` convierte una matriz de matrices de datos JS en una hoja de cálculo.
    - `json_to_sheet` convierte una matriz de objetos JS en una hoja de cálculo.
    - `table_to_sheet` convierte un elemento DOM TABLE en una hoja de cálculo.
    - `sheet_add_aoa` añade una matriz de matrices de datos JS a una hoja de cálculo existente.
    - `sheet_add_json` añade una matriz de objetos JS a una hoja de cálculo existente.
    
    
    **Exportación:**
    
    - `sheet_to_json` convierte un objeto de hoja de cálculo en una matriz de objetos JSON.
    - `sheet_to_csv` genera una salida de valores separados por delimitadores.
    - `sheet_to_txt` genera texto con formato UTF16.
    - `sheet_to_html` genera una salida HTML.
    - `sheet_to_formulae` genera una lista de las fórmulas (con valores de respaldo).
    
    
    **Manipulación de celdas y direcciones de celda:**
    
    - `format_cell` genera el valor de texto para una celda (usando formatos de número).
    - `encode_row / decode_row` convierte entre filas indexadas desde 0 y filas indexadas desde 1.
    - `encode_col / decode_col` convierte entre columnas indexadas desde 0 y nombres de columnas.
    - `encode_cell / decode_cell` convierte direcciones de celda.
    - `encode_range / decode_range` convierte rangos de celdas.
    
    ## Formato Común de Hoja de Cálculo
    
    SheetJS se ajusta al Formato Común de Hoja de Cálculo (CSF):
    
    ### Estructuras generales
    
    Los objetos de dirección de celda se almacenan como `{c:C, r:R}` donde `C` y `R` son números de
    columna y fila indexados desde 0, respectivamente. Por ejemplo, la dirección de celda `B5` se
    representa mediante el objeto `{c:1, r:4}`.
    
    Los objetos de rango de celdas se almacenan como `{s:S, e:E}` donde `S` es la primera celda y
    `E` es la última celda del rango. Los rangos son inclusivos. Por ejemplo, el
    rango `A3:B7` se representa mediante el objeto `{s:{c:0, r:2}, e:{c:1, r:6}}`.
    Las funciones de utilidad realizan un recorrido del rango de una hoja en orden de fila principal:```js
    for(var R = range.s.r; R <= range.e.r; ++R) {
      for(var C = range.s.c; C <= range.e.c; ++C) {
        var cell_address = {c:C, r:R};
        /* if an A1-style address is needed, encode the address */
        var cell_ref = XLSX.utils.encode_cell(cell_address);
      }
    }
    

    Cell Object

    Los objetos Cell son objetos JS simples con claves y valores que siguen la convención:

    Las utilidades de exportación integradas (como el exportador CSV) usarán el texto w si está disponible. Para cambiar un valor, asegúrese de eliminar cell.w (o establézcalo en undefined) antes de intentar exportar. Las utilidades regenerarán el texto w a partir del formato numérico (cell.z) y del valor bruto si es posible.

    La fórmula matricial real se almacena en el campo f de la primera celda del rango de la matriz. Las demás celdas del rango omitirán el campo f.

    Tipos de datos

    El valor bruto se almacena en la propiedad de valor v, interpretado según la propiedad de tipo t. Esta separación permite representar números así como texto numérico. Hay 6 tipos de celda válidos:

    Valores de error e interpretación (clic para mostrar)

    El tipo n es el tipo Número. Esto incluye todas las formas de datos que Excel almacena como números, como fechas/horas y campos booleanos. Excel utiliza exclusivamente datos que caben en un número de punto flotante IEEE754, igual que el tipo Number de JS, por lo que el campo v contiene el número bruto. El campo w contiene el texto formateado. Las fechas se almacenan como números de forma predeterminada y se convierten con XLSX.SSF.parse_date_code.

    El tipo d es el tipo Fecha, generado solo cuando se pasa la opción cellDates. Dado que JSON no tiene un tipo Fecha natural, generalmente se espera que los analizadores almacenen cadenas de fecha ISO 8601 como las que obtendría de date.toISOString(). Por otro lado, los escritores y exportadores deberían poder manejar cadenas de fecha y objetos Date de JS. Tenga en cuenta que Excel ignora los modificadores de zona horaria y trata todas las fechas en la zona horaria local. La biblioteca no corrige este error.

    El tipo s es el tipo Cadena. Los valores se almacenan explícitamente como texto. Excel interpretará estas celdas como "número almacenado como texto". Los archivos Excel generados suprimen automáticamente esa clase de error, pero otros formatos pueden provocar errores.

    El tipo z representa celdas stub en blanco. Se generan en casos donde las celdas no tienen un valor asignado pero contienen comentarios u otros metadatos. Son ignoradas por las funciones de utilidad de procesamiento de datos de la biblioteca principal. De forma predeterminada, estas celdas no se generan; la opción sheetStubs del analizador debe establecerse en true.

    Fechas

    Detalles del código de fecha de Excel (clic para mostrar)

    De forma predeterminada, Excel almacena las fechas como números con un código de formato que especifica el procesamiento de fechas. Por ejemplo, la fecha 19-Feb-17 se almacena como el número 42785 con un formato numérico de d-mmm-yy. El módulo SSF comprende los formatos numéricos y realiza la conversión correspondiente.

    XLSX también admite un tipo de fecha especial d donde los datos son una cadena de fecha ISO 8601. El formateador convierte la fecha de nuevo a un número.

    El comportamiento predeterminado de todos los analizadores es generar celdas numéricas. Establecer cellDates en verdadero hará que los generadores almacenen fechas.

    Zonas horarias y fechas (clic para mostrar)

    Excel no tiene un concepto nativo de tiempo universal. Todas las horas se especifican en la zona horaria local. Las limitaciones de Excel impiden especificar fechas absolutas reales.

    Siguiendo a Excel, esta biblioteca trata todas las fechas como relativas a la zona horaria local.

    Épocas: 1900 y 1904 (clic para mostrar)

    Excel admite dos épocas (1 de enero de 1900 y 1 de enero de 1904). La época del libro de trabajo se puede determinar examinando la propiedad wb.Workbook.WBProps.date1904 del libro de trabajo:```js !!(((wb.Workbook||{}).WBProps||{}).date1904)

    root@kitploit:~
    </details>
    
    ### Objetos de hoja
    
    Cada clave que no comienza con `!` se asigna a una celda (usando notación `A-1`)
    
    `sheet[address]` devuelve el objeto de celda para la dirección especificada.
    
    **Claves especiales de hoja (accesibles como `sheet[key]`, cada una comenzando con `!`):**
    
    - `sheet['!ref']`: rango basado en A-1 que representa el rango de la hoja. Las funciones que
      trabajan con hojas deben usar este parámetro para determinar el rango.  Las celdas que
      se asignan fuera del rango no se procesan.  En particular, cuando
      se escribe una hoja manualmente, las celdas fuera del rango no se incluyen
    
      Las funciones que manejan hojas deben verificar la presencia del campo `!ref`.
      Si se omite `!ref` o no es un rango válido, las funciones pueden tratar
      la hoja como vacía o intentar adivinar el rango.  Las utilidades estándar que
      se incluyen con esta librería tratan las hojas como vacías (por ejemplo, la salida CSV es
      una cadena vacía).
    
      Al leer una hoja de trabajo con la propiedad `sheetRows` establecida, el parámetro ref
      usará el rango restringido.  El rango original se establece en `ws['!fullref']`
    
    - `sheet['!margins']`: Objeto que representa los márgenes de página.  Los valores predeterminados
      siguen el ajuste preestablecido "normal" de Excel.  Excel también tiene ajustes "wide" y "narrow"
      pero se almacenan como medidas en bruto. Las propiedades principales se enumeran a continuación:
    
    <details>
      <summary><b>Detalles de los márgenes de página</b> (clic para mostrar)</summary>
    
    | clave    | descripción            | "normal" | "wide" | "narrow" |
    |----------|------------------------|:---------|:-------|:-------- |
    | `left`   | margen izquierdo (pulgadas)   | `0.7`    | `1.0`  | `0.25`   |
    | `right`  | margen derecho (pulgadas)  | `0.7`    | `1.0`  | `0.25`   |
    | `top`    | margen superior (pulgadas)    | `0.75`   | `1.0`  | `0.75`   |
    | `bottom` | margen inferior (pulgadas) | `0.75`   | `1.0`  | `0.75`   |
    | `header` | margen de encabezado (pulgadas) | `0.3`    | `0.5`  | `0.3`    |
    | `footer` | margen de pie de página (pulgadas) | `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}
    

    Objeto de hoja de cálculo

    Además de las claves base de la hoja, las hojas de cálculo también añaden:

    • ws['!cols']: array de objetos de propiedades de columnas. Los anchos de columna se almacenan realmente en los archivos de forma normalizada, medidos en términos del "ancho máximo de dígitos" (el mayor ancho de los dígitos representados 0-9, en píxeles). Al analizarse, los objetos de columna almacenan el ancho en píxeles en el campo wpx, el ancho en caracteres en el campo wch y el ancho máximo de dígitos en el campo MDW.

    • ws['!rows']: array de objetos de propiedades de filas, como se explica más adelante en la documentación. Cada objeto de fila codifica propiedades que incluyen la altura de la fila y la visibilidad.

    • ws['!merges']: array de objetos de rango correspondientes a las celdas combinadas en la hoja de cálculo. Los formatos de texto plano no admiten celdas combinadas. La exportación CSV escribirá todas las celdas del rango combinado si existen, así que asegúrese de que solo esté establecida la primera celda (superior izquierda) del rango.

    • ws['!outline']: configura cómo deben comportarse los esquemas. Las opciones tienen como valores predeterminados los ajustes predeterminados de Excel 2019:

    claveCaracterística de Excelpredeterminado
    aboveDesmarcar "Filas de resumen debajo del detalle"false
    leftDesmarcar "Filas de resumen a la derecha del detalle"
    • ws['!protect']: objeto de propiedades de protección de la hoja para la escritura. La clave password especifica la contraseña para los formatos que admiten hojas protegidas con contraseña (XLSX/XLSB/XLS). El escritor utiliza el método de ofuscación XOR. Las siguientes claves controlan la protección de la hoja -- establezca en false para habilitar una característica cuando la hoja esté bloqueada o en true para deshabilitarla:
    Detalles de protección de la hoja de cálculo (clic para mostrar)
    • ws['!autofilter']: objeto AutoFilter que sigue el esquema:```typescript type AutoFilter = { ref:string; // A-1 based range representing the AutoFilter table range }
    root@kitploit:~
    #### Objeto Chartsheet
    
    Los Chartsheets se representan como hojas estándar. Se distinguen con la
    propiedad `!type` establecida en `"chart"`.
    
    Los datos subyacentes y `!ref` se refieren a los datos en caché en el chartsheet. La
    primera fila del chartsheet es el encabezado subyacente.
    
    #### Objeto Macrosheet
    
    Los Macrosheets se representan como hojas estándar. Se distinguen con la
    propiedad `!type` establecida en `"macro"`.
    
    #### Objeto Dialogsheet
    
    Los Dialogsheets se representan como hojas estándar. Se distinguen con la
    propiedad `!type` establecida en `"dialog"`.
    
    ### Objeto Workbook
    
    `workbook.SheetNames` es una lista ordenada de las hojas en el libro de trabajo
    
    `wb.Sheets[sheetname]` devuelve un objeto que representa la hoja de cálculo.
    
    `wb.Props` es un objeto que almacena las propiedades estándar. `wb.Custprops` almacena
    propiedades personalizadas. Dado que las propiedades estándar de XLS difieren del estándar
    XLSX, el análisis de XLS almacena las propiedades principales en ambos lugares.
    
    `wb.Workbook` almacena [atributos a nivel de libro de trabajo](#atributos-a-nivel-de-libro-de-trabajo).
    
    #### Propiedades de archivo del Workbook
    
    Los distintos formatos de archivo utilizan nombres internos diferentes para las propiedades de archivo. El
    objeto `Props` del workbook normaliza los nombres:
    
    <details>
      <summary><b>Propiedades de archivo</b> (clic para mostrar)</summary>
    
    | Nombre JS     | Descripción en Excel           |
    |:--------------|:-------------------------------|
    | `Title`       | Pestaña Resumen "Título"       |
    | `Subject`     | Pestaña Resumen "Asunto"       |
    | `Author`      | Pestaña Resumen "Autor"        |
    | `Manager`     | Pestaña Resumen "Administrador"|
    | `Company`     | Pestaña Resumen "Empresa"      |
    | `Category`    | Pestaña Resumen "Categoría"    |
    | `Keywords`    | Pestaña Resumen "Palabras clave"|
    | `Comments`    | Pestaña Resumen "Comentarios"  |
    | `LastAuthor`  | Pestaña Estadísticas "Guardado por última vez por"|
    | `CreatedDate` | Pestaña Estadísticas "Creado"  |
    
    </details>
    
    Por ejemplo, para establecer la propiedad de título del workbook:```js
    if(!wb.Props) wb.Props = {};
    wb.Props.Title = "Insert Title Here";
    

    Las propiedades personalizadas se agregan en el objeto Custprops del libro de trabajo:```js if(!wb.Custprops) wb.Custprops = {}; wb.Custprops["Custom Property"] = "Custom Value";

    root@kitploit:~
    Los escritores procesarán la clave `Props` del objeto de opciones:```js
    /* force the Author to be "SheetJS" */
    XLSX.write(wb, {Props:{Author:"SheetJS"}});
    

    Atributos a Nivel de Libro

    wb.Workbook almacena atributos a nivel de libro.

    Nombres Definidos

    wb.Workbook.Names es un array de objetos de nombres definidos que tienen las claves:

    Propiedades de Nombres Definidos (clic para mostrar)

    Excel permite que dos nombres definidos con ámbito de hoja compartan el mismo nombre. Sin embargo, un nombre con ámbito de hoja no puede colisionar con un nombre de ámbito de libro. Los escritores de libros pueden no hacer cumplir esta restricción.

    Vistas de Libro

    wb.Workbook.Views es un array de objetos de vista de libro que tienen las claves:

    ClaveDescripción
    RTLSi es true, mostrar de derecha a izquierda

    Propiedades Diversas del Libro

    wb.Workbook.WBProps contiene otras propiedades del libro:

    ClaveDescripción
    CodeNameNombre de código del libro del proyecto VBA
    date1904época: 0/false para sistema 1900, 1/true para 1904
    filterPrivacy

    Características del Documento

    Incluso para características básicas como el almacenamiento de fechas, los formatos oficiales de Excel almacenan el mismo contenido de diferentes maneras. Se espera que los analizadores conviertan desde la representación del formato de archivo subyacente al Formato Común de Hoja de Cálculo. Se espera que los escritores conviertan de CSF de vuelta al formato de archivo subyacente.

    Fórmulas

    La cadena de fórmula de estilo A1 se almacena en el campo f. Aunque diferentes formatos de archivo almacenan las fórmulas de diferentes maneras, los formatos se traducen. Aunque algunos formatos almacenan las fórmulas con un signo igual inicial, las fórmulas CSF no comienzan con =.

    Soporte de Formatos de Archivo de Fórmulas (clic para mostrar)

    Fórmulas de una sola celda

    Para fórmulas simples, la clave f de la celda deseada puede establecerse con el texto de fórmula real. Esta hoja de cálculo representa A1=1, A2=2 y 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:~
    Utilidades como `aoa_to_sheet` aceptarán objetos de celda en lugar de valores:```js
    var worksheet = XLSX.utils.aoa_to_sheet([
      [ 1 ], // A1
      [ 2 ], // A2
      [ {t: "n", v: 3, f: "A1+A2"} ] // A3
    ]);
    

    Las celdas con entradas de fórmula pero sin valor se serializarán de una manera que Excel y otras herramientas de hojas de cálculo reconocerán. Esta biblioteca no calculará automáticamente los resultados de las fórmulas! Por ejemplo, la siguiente hoja de cálculo incluirá la función BESSELJ, pero el resultado no estará disponible en JavaScript:```js var worksheet = XLSX.utils.aoa_to_sheet([ [ 3.14159, 2 ], // Row "1" [ { t:'n', f:'BESSELJ(A1,B1)' } ] // Row "2" will be calculated on file open }

    root@kitploit:~
    Si se necesitan los resultados reales en JS, [SheetJS Pro](https://sheetjs.com/pro)
    ofrece un componente de calculadora de fórmulas para evaluar expresiones, actualizar
    valores y celdas dependientes, y refrescar libros de trabajo completos.
    
    **Fórmulas de matriz**
    
    _Asignar una fórmula de matriz_```js
    XLSX.utils.sheet_set_array_formula(worksheet, range, formula);
    

    Las fórmulas de matriz se almacenan en la celda superior izquierda del bloque de matriz. Todas las celdas de una fórmula de matriz tienen un campo F correspondiente al rango. Una fórmula de celda única se puede distinguir de una fórmula normal por la presencia del campo F.

    Por ejemplo, al establecer la celda C1 con la fórmula de matriz {=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:~
    Para una fórmula de matriz de varias celdas, cada celda tiene el mismo rango de matriz pero solo la
    primera celda especifica la fórmula.  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" };
    

    Se espera que las utilidades y los escritores comprueben la presencia de un campo F e ignoren cualquier posible elemento de fórmula f en celdas distintas de la celda inicial. ¡No se espera que realicen la validación de las fórmulas!

    Fórmulas de matriz dinámica

    Asignar una fórmula de matriz dinámica```js XLSX.utils.sheet_set_array_formula(worksheet, range, formula, true);

    root@kitploit:~
    Publicadas en 2020, las fórmulas de matriz dinámica son compatibles con los formatos de archivo XLSX/XLSM y XLSB. Se representan como fórmulas de matriz normales pero tienen metadatos de celda especiales que indican que se debe permitir que la fórmula ajuste el rango.
    
    Una fórmula de matriz se puede marcar como dinámica estableciendo la propiedad `D` de la celda en `true`. Se espera el rango `F`, pero se puede establecer a la celda actual:```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
    

    Localización con nombres de funciones

    SheetJS opera a nivel de archivo. Excel almacena las expresiones de fórmula utilizando los nombres de funciones en inglés (Estados Unidos). Para usuarios que no hablan inglés, Excel utiliza un conjunto localizado de nombres de funciones.

    Por ejemplo, cuando el idioma y la región del equipo están configurados en francés (Francia), Excel interpreta =SOMME(A1:C3) como si SOMME fuera la función SUM. Sin embargo, en el archivo real, Excel almacena SUM(A1:C3).

    Funciones "futuras" con prefijo

    Las funciones introducidas en versiones más recientes de Excel llevan el prefijo _xlfn. cuando se almacenan en archivos. Al escribir expresiones de fórmula que utilizan estas funciones, el prefijo es necesario para una compatibilidad máxima:```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:~
    Al leer un archivo, la opción `xlfn` conserva los prefijos.
    
    <details>
      <summary><b> Funciones que requieren el prefijo `_xlfn.`</b> (haz clic para mostrar)</summary>
    
    Esta lista crece con cada versión de 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
    

    Propiedades de Filas y Columnas

    Soporte de formato (clic para mostrar)

    Propiedades de filas: XLSX/M, XLSB, BIFF8 XLS, XLML, SYLK, DOM, ODS

    Propiedades de columnas: XLSX/M, XLSB, BIFF8 XLS, XLML, SYLK, DOM

    Las propiedades de filas y columnas no se extraen de forma predeterminada al leer desde un archivo y no se persisten de forma predeterminada al escribir en un archivo. La opción cellStyles: true debe pasarse a la función de lectura o escritura correspondiente.

    Propiedades de columnas

    El array !cols en cada hoja de cálculo, si está presente, es una colección de objetos ColInfo que tienen las siguientes propiedades:```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:~
    _Propiedades de fila_
    
    El array `!rows` en cada hoja de cálculo, si está presente, es una colección de objetos `RowInfo` que tienen las siguientes propiedades:```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
    };
    

    Convención de niveles de esquema / grupo

    La interfaz de Excel muestra el nivel de esquema base como 1 y el nivel máximo como 8. Siguiendo las convenciones de JS, SheetJS usa niveles de esquema indexados desde cero, donde el base nivel de esquema es 0 y el nivel máximo es 7.

    ¿Por qué hay tres tipos de anchura? (clic para mostrar)

    Hay tres tipos de anchura diferentes que corresponden a las tres formas distintas en que las hojas de cálculo almacenan los anchos de columna:

    SYLK y otros formatos de texto plano usan el recuento bruto de caracteres. Las herramientas contemporáneas como Visicalc y Multiplan se basaban en caracteres. Como los caracteres tenían el mismo ancho, bastaba con almacenar un recuento. Esta tradición se continuó en los formatos BIFF.

    SpreadsheetML (2003) intentó alinearse con HTML estandarizando el recuento de píxeles de pantalla en todo el archivo. Los anchos de columna, las alturas de fila y otras medidas usan píxeles. Cuando el recuento de píxeles y de caracteres no coincide, Excel redondea los valores.

    XLSX almacena internamente los anchos de columna en una nebulosa forma de "Max Digit Width". El Max Digit Width es el ancho del dígito más grande al renderizarse (generalmente el carácter "0" es el más ancho). La anchura interna debe ser un múltiplo entero de la anchura dividida entre 256. ECMA-376 describe una fórmula para convertir entre píxeles y la anchura interna. Esto representa un enfoque híbrido.

    Las funciones de lectura intentan rellenar las tres propiedades. Las funciones de escritura intentarán convertir los valores especificados al tipo deseado. Para evitar posibles conflictos, la manipulación debe eliminar primero las otras propiedades. Por ejemplo, al cambiar la anchura en píxeles, elimine las propiedades wch y width.

    Detalles de implementación (clic para mostrar)

    Alturas de fila

    Excel almacena internamente las alturas de fila en puntos. La resolución predeterminada es 72 DPI o 96 PPI, por lo que los tamaños en píxeles y en puntos deberían coincidir. Para resoluciones diferentes pueden no coincidir, por lo que la biblioteca separa los conceptos.

    Aunque toda la información está disponible, se espera que las funciones de escritura sigan el orden de prioridad:

    1. usar la altura en píxeles hpx si está disponible
    2. usar la altura en puntos hpt si está disponible

    Anchos de columna

    Dadas las restricciones, es posible determinar el MDW sin inspeccionar realmente la fuente! Los analizadores adivinan la anchura en píxeles convirtiendo la anchura a píxeles y viceversa, repitiendo para todos los MDW posibles y seleccionando el MDW que minimiza el error. XLML en realidad almacena la anchura en píxeles, por lo que la suposición funciona en la dirección opuesta.

    Aunque toda la información está disponible, se espera que las funciones de escritura sigan el orden de prioridad:

    1. usar el campo width si está disponible
    2. usar la anchura en píxeles wpx si está disponible
    3. usar el recuento de caracteres wch si está disponible

    Formatos de número

    El texto formateado cell.w de cada celda se produce a partir de cell.v y del formato cell.z. Si no se especifica el formato, se usa el formato General de Excel. El formato puede especificarse como una cadena o como un índice en la tabla de formatos. Se espera que los analizadores rellenen workbook.SSF con la tabla de formatos de número. Se espera que las funciones de escritura serialicen la tabla.

    Las herramientas personalizadas deben asegurarse de que la tabla local contenga cada cadena de formato utilizada en algún lugar de la tabla. La convención de Excel exige que los formatos personalizados comiencen en el índice 164. El siguiente ejemplo crea un formato personalizado desde cero:

    Nueva hoja de cálculo con formato personalizado (clic para mostrar)```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 } } } ```

    Las reglas son ligeramente diferentes de cómo Excel muestra los formatos numéricos personalizados. En particular, los caracteres literales deben estar entre comillas dobles o precedidos por una barra invertida. Para más información, consulte el artículo de documentación de Excel Create or delete a custom number format o ECMA-376 18.8.31 (Formatos numéricos)

    Formatos numéricos predeterminados (haz clic para mostrar)

    Los formatos predeterminados se enumeran en 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 (ver más abajo)
    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

    El formato 14 (m/d/yy) es localizado por Excel: aunque el archivo especifica ese formato numérico, se dibujará de manera diferente según la configuración del sistema. Tiene sentido cuando el productor y el consumidor de los archivos están en la misma configuración regional, pero ese no es siempre el caso a través de Internet. Para evitar esta ambigüedad, las funciones de análisis aceptan la opción dateNF para anular la interpretación de esa cadena de formato específica.

    Hipervínculos

    Soporte de formato (haz clic para mostrar)

    Hipervínculos de celda: XLSX/M, XLSB, BIFF8 XLS, XLML, ODS

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

    Los hipervínculos se almacenan en la clave l de los objetos de celda. El campo Target del objeto de hipervínculo es el destino del enlace, incluido el fragmento de URI. Los tooltips se almacenan en el campo Tooltip y se muestran cuando mueves el ratón sobre el texto.

    Por ejemplo, el siguiente fragmento crea un enlace desde la celda A3 a https://sheetjs.com con la sugerencia "Find us @ SheetJS.com!":```js ws['A1'].l = { Target:"https://sheetjs.com", Tooltip:"Find us @ SheetJS.com!" };

    root@kitploit:~
    Ten en cuenta que Excel no aplica automáticamente formato de hipervínculo a los enlaces: normalmente se mostrarán como texto normal.
    
    _Enlaces remotos_
    
    Los enlaces HTTP / HTTPS se pueden usar directamente:```js
    ws['A2'].l = { Target:"https://docs.sheetjs.com/#hyperlinks" };
    ws['A3'].l = { Target:"http://localhost:7262/yes_localhost_works" };
    

    Excel también admite enlaces de correo mailto con línea de asunto:```js ws['A4'].l = { Target:"mailto:[email protected]" }; ws['A5'].l = { Target:"mailto:[email protected]?subject=Test Subject" };

    root@kitploit:~
    _Local Links_
    
    Los enlaces a rutas absolutas deben usar el esquema 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 */
    

    Los enlaces a rutas relativas se pueden especificar sin un esquema:```js ws['B3'].l = { Target:"SheetJS.xlsb" }; /* Link to SheetJS.xlsb / ws['B4'].l = { Target:"../SheetJS.xlsm" }; / Link to ../SheetJS.xlsm */

    root@kitploit:~
    Relative Paths have undefined behavior in the SpreadsheetML 2003 format.  Excel
    2019 will treat a `..\` parent mark as two levels up.
    
    _Enlaces internos_
    
    Los enlaces cuyo destino es una celda, un rango o un nombre definido en el mismo libro de trabajo ("Enlaces internos") se marcan con un carácter de almohadilla al principio:```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 */
    

    Comentarios de celda

    Los comentarios de celda son objetos almacenados en el arreglo c de los objetos de celda. El contenido real del comentario se divide en bloques según el autor del comentario. El campo a de cada objeto de comentario es el autor del comentario y el campo t es la representación en texto plano.

    Por ejemplo, el siguiente fragmento añade un comentario de celda en la celda 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 límite de 54 caracteres en el nombre del Autor.  Los nombres de más de
    54 caracteres pueden causar problemas con otros formatos.
    
    Para marcar un comentario como normalmente oculto, establece la propiedad `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"});
    

    Comentarios en hilo

    Introducidos en Excel 365, los comentarios en hilo son fragmentos de comentarios de texto sin formato con metadatos del autor y referencias al comentario principal. Se admiten en XLSX y XLSB.

    Para marcar un comentario como en hilo, cada parte del comentario debe tener una propiedad T verdadera:```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:~
    No hay metadatos de Active Directory ni de Office 365 asociados con los autores en un hilo.
    
    #### Visibilidad de hojas
    
    Excel permite ocultar hojas en la barra de pestañas inferior.  Los datos de la hoja se almacenan en
    el archivo, pero la interfaz de usuario no los hace fácilmente accesibles.  Las hojas ocultas estándar
    se muestran en el menú "Unhide".  Excel también tiene hojas "muy ocultas" que
    no se pueden mostrar en el menú.  ¡Solo se puede acceder a ellas en el Editor de VB!
    
    La configuración de visibilidad se almacena en la propiedad `Hidden` de la matriz de propiedades de la hoja.
    
    <details>
      <summary><b>Más detalles</b> (haz clic para mostrar)</summary>
    
    | Valor | Definición  |
    |:-----:|:------------|
    |   0   | Visible     |
    |   1   | Oculto      |
    |   2   | Muy oculto  |
    
    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 ] ]
    

    Los formatos que no son de Excel no admiten el estado Muy oculto. La mejor manera de comprobar si una hoja es visible es verificar si la propiedad Hidden es una verdad lógica:```js

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

    root@kitploit:~
    </details>
    
    #### VBA y macros
    
    Las macros VBA se almacenan en un blob de datos especial que se expone en la
    propiedad `vbaraw` del objeto del libro cuando la opción `bookVBA` es `true`.  Son
    compatibles con los formatos `XLSM`, `XLSB` y `BIFF8 XLS`.  Los escritores de
    formatos compatibles insertan automáticamente los blobs de datos si están presentes en el libro y
    los asocian con los nombres de las hojas de cálculo.
    
    <details>
    	<summary><b>Nombres de código personalizados</b> (haz clic para mostrar)</summary>
    
    El nombre de código del libro se almacena en `wb.Workbook.WBProps.CodeName`.  De forma predeterminada,
    Excel escribirá `ThisWorkbook` o una frase traducida como `DieseArbeitsmappe`.
    Los nombres de código de las hojas de cálculo y de los gráficos se encuentran en el objeto de propiedades de la hoja en
    `wb.Workbook.Sheets[i].CodeName`.  Las hojas de macros y las hojas de diálogo se ignoran.
    
    Los lectores y escritores conservan los nombres de código, pero deben establecerse
    manualmente al añadir un blob de VBA a un libro diferente.
    
    </details>
    
    <details>
    	<summary><b>Hojas de macros</b> (haz clic para mostrar)</summary>
    
    Las versiones anteriores de Excel también admitían un tipo de hoja "macrosheet" que no era VBA y que
    almacenaba comandos de automatización.  Estos se exponen en objetos con la propiedad `!type`
    establecida en `"macro"`.
    
    </details>
    
    <details>
    	<summary><b>Detectar macros en libros de trabajo</b> (haz clic para mostrar)</summary>
    
    El campo `vbaraw` solo se establecerá si hay macros presentes, por lo que la prueba es simple:
    
    </details>```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');
    }
    
    Option NameDefaultDescription
    typeCodificación de los datos de entrada (ver Tipo de entrada más abajo)
    rawfalseSi es true, el análisis de texto plano no interpretará valores **
    codepageSi se especifica, usar la página de códigos cuando corresponda **
    cellFormulatrueGuardar fórmulas en el campo .f
    cellHTMLtrueInterpretar texto enriquecido y guardar HTML en el campo .h
    cellNFfalseGuardar la cadena de formato de número en el campo .z
    cellStylesfalseGuardar información de estilo/tema en el campo .s
    cellTexttrueTexto formateado generado en el campo .w
    cellDatesfalseAlmacenar fechas como tipo d (el valor por defecto es n)
    dateNFSi se especifica, usar la cadena para el código de fecha 14 **
    sheetStubsfalseCrear objetos de celda de tipo z para celdas de relleno
    sheetRows0Si es >0, leer las primeras sheetRows filas **
    bookDepsfalseSi es true, analizar las cadenas de cálculo
    bookFilesfalseSi es true, añadir archivos sin procesar al objeto del libro **
    bookPropsfalseSi es true, solo analizar lo necesario para obtener metadatos del libro **
    bookSheetsfalseSi es true, solo analizar lo necesario para obtener los nombres de las hojas
    bookVBAfalseSi es true, copiar el blob de VBA al campo vbaraw **
    password""Si está definida y el archivo está cifrado, usar la contraseña **
    WTFfalseSi es true, lanzar errores ante características inesperadas del archivo **
    sheetsSi se especifica, analizar solo las hojas indicadas **
    PRNfalseSi es true, permitir el análisis de archivos PRN **
    xlfnfalseSi es true, conservar los prefijos _xlfn. en las fórmulas **
    FSAnulación del separador de campo DSV
  • Se generarán sheetRows-1 filas al examinar la salida del objeto JSON (ya que la fila de encabezado se cuenta como una fila al analizar los datos)
  • De forma predeterminada se analizan todas las hojas de cálculo. sheets restringe según el tipo de entrada:
    • número: índice basado en cero de la hoja de cálculo a analizar (0 es la primera hoja)
    • cadena: nombre de la hoja de cálculo a analizar (no distingue mayúsculas)
    • matriz de números y cadenas para seleccionar varias hojas de cálculo.
  • bookVBA simplemente expone el objeto CFB de VBA sin procesar. No analiza los datos. XLSM y XLSB almacenan el objeto CFB de VBA en xl/vbaProject.bin. BIFF8 XLS mezcla las entradas de VBA junto con la entrada principal del libro de trabajo, por lo que la biblioteca genera un nuevo blob compatible con XLSB a partir del contenedor CFB de XLS.
  • codepage se aplica a archivos BIFF2 - BIFF5 sin registros CodePage y a archivos CSV sin BOM en type:"binary". BIFF8 XLS siempre usa 1200 por defecto.
  • PRN afecta al análisis de archivos de texto sin un carácter delimitador común.
  • Actualmente solo se admite el cifrado XOR. Se lanzará un error de no admitido para archivos que empleen otros métodos de cifrado.
  • Las funciones más recientes de Excel se serializan con el prefijo _xlfn., oculto para el usuario. SheetJS eliminará _xlfn. normalmente. La opción xlfn los conserva.
  • WTF es principalmente para desarrollo. De forma predeterminada, el analizador suprime los errores de lectura en hojas de cálculo individuales, lo que permite leer desde las hojas que sí se analizan correctamente. Establecer WTF:true obliga a que se lancen esos errores.
  • typeEntrada esperada
    "base64"cadena: codificación Base64 del archivo
    "binary"cadena: cadena binaria (el byte n es data.charCodeAt(n))
    "string"cadena: cadena JS (los caracteres se interpretan como UTF8)
    "buffer"búfer de nodejs
    "array"matriz: matriz de enteros sin signo de 8 bits (el byte n es data[n])
    "file"cadena: ruta del archivo que se leerá (solo nodejs)
    Byte 0Tipo de archivo sin procesarTipos de hoja de cálculo
    0xD0Contenedor CFBBIFF 5/8 o XLSX/XLSB protegidos o WQ3/QPW o XLR
    0x09Flujo BIFFBIFF 2/3/4/5
    0x3CXML/HTMLSpreadsheetML / ODS plano / UOS1 / HTML / texto plano
    0x50Archivo ZIPXLSB o XLSX/M o ODS o UOS2 o NUMBERS o texto
    0x49Texto planoSYLK o texto plano
    0x54Texto planoDIF o texto plano
    0xEFCodificado en UTF8SpreadsheetML / ODS plano / UOS1 / HTML / texto plano
    0xFFCodificado en UTF16SpreadsheetML / ODS plano / UOS1 / HTML / texto plano
    0x00Flujo de registrosLotus WK* o Quattro Pro o texto plano
    0x7BTexto planoRTF o texto plano
    0x0ATexto planoSpreadsheetML / ODS plano / UOS1 / HTML / texto plano
    0x0DTexto planoSpreadsheetML / ODS plano / UOS1 / HTML / texto plano
    0x20Texto planoSpreadsheetML / ODS plano / UOS1 / HTML / texto plano

    Los archivos DBF se detectan según el primer byte, así como el tercer y cuarto byte (correspondientes al mes y día de la fecha del archivo)

    Los archivos de Works para Windows se detectan basándose en el registro BOF con tipo 0xFF

    La detección del formato de texto plano sigue el siguiente orden de prioridad:

    FormatoPrueba
    XML<?xml aparece en los primeros 1024 caracteres
    HTMLcomienza con < y las etiquetas HTML aparecen en los primeros 1024 caracteres *
    XMLcomienza con < y la primera etiqueta es válida
    RTFcomienza con {\rt
    DSVcomienza con /sep=.$/, el separador es el carácter especificado
    DSVmás caracteres `
    DSVmás caracteres ; sin comillas que \t o , en los primeros 1024
    TSVmás caracteres \t sin comillas que caracteres , en los primeros 1024
    CSVuno de los primeros 1024 caracteres es una coma ","
    ETHcomienza con socialcalc:version:
    PRNla opción PRN está establecida como true
    CSV(reserva)
    • Las etiquetas HTML incluyen: html, table, head, meta, script, style, div

    Downloadify utiliza un botón Flash SWF para generar archivos locales, adecuado para entornos donde ActiveX no está disponible:```js Downloadify.create(id,{ /* other options are required! read the downloadify docs for more info */ filename: "test.xlsx", data: function() { return XLSX.write(wb, {bookType:"xlsx", type:"base64"}); }, append: false, dataType: "base64" });

    root@kitploit:~
    La [demo `oldie`](https://github.com/weareu/xlsx/blob/HEAD/demos/oldie/) muestra un escenario de respaldo compatible con IE.
    
    </details>
    
    <details>
      <summary><b>Subir archivo desde el navegador (ajax)</b> (click para mostrar)</summary>
    
    Un ejemplo completo usando XHR está [incluido en la demo XHR](https://github.com/weareu/xlsx/blob/HEAD/demos/xhr/), junto
    con ejemplos para fetch y librerías wrapper.  Este ejemplo asume que el servidor
    puede manejar archivos codificados en Base64 (consulta la demo para un servidor básico de nodejs):```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);
    

    Todos los campos pueden procesarse a la vez usando una transposición del tensor 2D generado mediante la exportación sheet_to_json con header: 1. La primera fila, si contiene etiquetas de encabezado, debe eliminarse con un 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:~
    El [`array` demo](https://github.com/weareu/xlsx/blob/HEAD/demos/array/) muestra un ejemplo completo.
    
    </details>
    
    
    ### Generando Tablas HTML
    
    **API**
    
    _Generar Tabla HTML desde una Hoja de Cálculo_```js
    var html = XLSX.utils.sheet_to_html(worksheet);
    

    La función de utilidad sheet_to_html genera código HTML basado en los datos de la hoja de cálculo. Cada celda de la hoja de cálculo se asigna a un elemento <TD>. Las celdas combinadas en la hoja de cálculo se serializan estableciendo los atributos colspan y rowspan.

    Ejemplos

    La función de utilidad sheet_to_html genera código HTML que se puede agregar a cualquier elemento DOM estableciendo innerHTML:```js var container = document.getElementById("tavolo"); container.innerHTML = XLSX.utils.sheet_to_html(worksheet);

    root@kitploit:~
    Combinando con `fetch`, construir un sitio a partir de un libro de trabajo es sencillo:
    
    <details>
      <summary><b>Vanilla JS + HTML: obtener un libro de trabajo con fetch y generar vistas previas de tablas</b> (clic para mostrar)</summary>```html
    <body>
      <style>TABLE { border-collapse: collapse; } TD { border: 1px solid; }</style>
      <div id="tavolo"></div>
      <script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script>
      <script type="text/javascript">
    (async() => {
      /* fetch and parse workbook -- see the fetch example for details */
      const workbook = XLSX.read(await (await fetch("sheetjs.xlsx")).arrayBuffer());
    
      let output = [];
      /* loop through the worksheet names in order */
      workbook.SheetNames.forEach(name => {
    
        /* generate HTML from the corresponding worksheets */
        const worksheet = workbook.Sheets[name];
        const html = XLSX.utils.sheet_to_html(worksheet);
    
        /* add a header with the title name followed by the table */
        output.push(`<H3>${name}</H3>${html}`);
      });
      /* write to the DOM at the end */
      tavolo.innerHTML = output.join("\n");
    })();
      </script>
    </body>
    

    La demostración vuejs incluye más ejemplos de React.

    ClaveDescripción
    vvalor bruto (consulte la sección Tipos de datos para más información)
    wtexto formateado (si corresponde)
    ttipo: b Booleano, e Error, n Número, d Fecha, s Texto, z Stub
    ffórmula de celda codificada como cadena de estilo A1 (si corresponde)
    Frango de la matriz contenedora si la fórmula es una fórmula matricial (si corresponde)
    Dsi es verdadero, la fórmula matricial es dinámica (si corresponde)
    rcodificación de texto enriquecido (si corresponde)
    hrenderizado HTML del texto enriquecido (si corresponde)
    ccomentarios asociados con la celda
    zcadena de formato numérico asociada con la celda (si se solicita)
    lobjeto de hipervínculo de la celda (.Target contiene el enlace, .Tooltip es la información sobre herramientas)
    sel estilo/tema de la celda (si corresponde)
    TipoDescripción
    bBooleano: valor interpretado como boolean de JS
    eError: el valor es un código numérico y la propiedad w almacena el nombre común **
    nNúmero: el valor es un number de JS **
    dFecha: el valor es un objeto Date de JS o una cadena que debe analizarse como Fecha **
    sTexto: valor interpretado como string de JS y escrito como texto **
    zStub: celda stub en blanco que es ignorada por las utilidades de procesamiento de datos **
    ValorSignificado del error
    0x00#NULL!
    0x07#DIV/0!
    0x0F#VALUE!
    0x17#REF!
    0x1D#NAME?
    0x24#NUM!
    0x2A#N/A
    0x2B#GETTING_DATA
    false
    clavecaracterística (true=deshabilitado / false=habilitado)predeterminado
    selectLockedCellsSeleccionar celdas bloqueadashabilitado
    selectUnlockedCellsSeleccionar celdas desbloqueadashabilitado
    formatCellsDar formato a las celdasdeshabilitado
    formatColumnsDar formato a las columnasdeshabilitado
    formatRowsDar formato a las filasdeshabilitado
    insertColumnsInsertar columnasdeshabilitado
    insertRowsInsertar filasdeshabilitado
    insertHyperlinksInsertar hipervínculosdeshabilitado
    deleteColumnsEliminar columnasdeshabilitado
    deleteRowsEliminar filasdeshabilitado
    sortOrdenardeshabilitado
    autoFilterFiltrardeshabilitado
    pivotTablesUsar informes de tabla dinámicadeshabilitado
    objectsEditar objetoshabilitado
    scenariosEditar escenarioshabilitado
    ClaveDescripción
    SheetÁmbito del nombre. Índice de hoja (0 = primera hoja) o null (Libro)
    NameNombre sensible a mayúsculas/minúsculas. Se aplican las reglas estándar **
    RefReferencia de estilo A1 ("Sheet1!$A$1:$D$20")
    CommentComentario (solo aplicable a XLS/XLSX/XLSB)
    Advertir o eliminar información de identificación personal al guardar
    Representación de AlmacenamientoFormatosLecturaEscritura
    Cadenas de estilo A1XLSX✔✔
    Cadenas de estilo RCXLML y texto plano✔✔
    Fórmulas BIFF parseadasXLSB y todos los formatos XLS✔
    Fórmulas OpenFormulaODS/FODS/UOS✔✔
    Fórmulas Lotus parseadasTodos los formatos Lotus WK_✔

    Dado que Excel prohíbe que las celdas nombradas colisionen con nombres de referencias de celda de estilo A1 o RC es posible una conversión mediante regex (no tan simple). Las fórmulas BIFF parseadas y las fórmulas Lotus parseadas deben desenrollarse explícitamente. Las fórmulas OpenFormula pueden convertirse con expresiones regulares.

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