Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
xlsx — Fork do SheetJS xlsx 0.18.5 com correções para CVE-2023-30533 e CVE-2024-22363 | Kitploit
Ferramentas/GitHubGitHub/weareu/xlsx
Utilitários de Propósito GeralFerramentas de Criptografia/DescriptografiaRecuperação de DadosUtilitários e Frameworks
GitHubweareu/xlsx

xlsx

Fork do SheetJS xlsx 0.18.5 com correções para CVE-2023-30533 e CVE-2024-22363

Ver Repositório
6há 6 mesesAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

SheetJS

A Edição Comunitária do SheetJS oferece soluções open-source testadas em batalha para extrair dados úteis de praticamente qualquer planilha complexa e gerar novas planilhas que funcionarão com softwares legados e modernos.

SheetJS Pro oferece soluções além do processamento de dados: Edite modelos complexos com facilidade; deixe seu Picasso interior sair com estilos; crie planilhas personalizadas com imagens/gráficos/Tabelas Dinâmicas; avalie expressões de fórmulas e porte cálculos para aplicativos web; automatize tarefas comuns de planilhas e muito mais!

Licença Status de Build Vulnerabilidades Snyk Downloads npm Analytics

Teste e Matriz de Suporte do Navegador

Status de Build

Baixar ferramenta

Formatos de Arquivo Suportados

gráfico de circulo do suporte de formatos

legenda do gráfico

Índice

Expandir para mostrar o Índice
  • Primeiros Passos
    • Instalação
    • Uso
    • A Zen do SheetJS
    • Demos do Ecossistema JS
  • Adquirir e Extrair Dados
    • Analisar Pastas de Trabalho
    • Processar Dados JSON e JS
    • Processar Tabelas HTML
  • Processar Dados
    • Modificar Estrutura da Pasta de Trabalho
    • Modificar Valores de Célula
    • Modificar Outras Propriedades de Planilha / Pasta de Trabalho / Célula
  • Empacotar e Liberar Dados
    • Escrever Pastas de Trabalho
    • Exemplos de Escrita
    • Escrita em Fluxo
    • Gerar Dados JSON e JS
    • Gerar Tabelas HTML
    • Gerar Instantâneos de Planilha Única
  • Interface
    • Funções de Análise
    • Funções de Escrita
    • Utilitários
  • Formato Comum de Planilha
    • Estruturas Gerais
    • Objeto Célula
      • Tipos de Dados
      • Datas
    • Objetos de Planilha
      • Objeto de Planilha
      • Objeto de Gráfico
      • Objeto de Macro
      • Objeto de Caixa de Diálogo
    • Objeto Pasta de Trabalho
      • Propriedades do Arquivo da Pasta de Trabalho
    • Atributos de Nível da Pasta de Trabalho
      • Nomes Definidos
      • Visualizações da Pasta de Trabalho
      • Propriedades Diversas da Pasta de Trabalho
    • Recursos do Documento
      • Fórmulas
      • Propriedades de Linhas e Colunas
      • Formatos de Número
      • Hiperlinks
      • Comentários de Célula
      • Visibilidade da Planilha
      • VBA e Macros
  • Opções de Análise
    • Tipo de Entrada
    • Adivinhar Tipo de Arquivo
  • Opções de Escrita
    • Formatos de Saída Suportados
    • Tipo de Saída
  • Funções Utilitárias
    • Entrada de Array de Arrays
    • Entrada de Array de Objetos
    • Entrada de Tabela HTML
    • Saída de Fórmulas
    • Saída Separada por Delimitador
      • Texto Unicode UTF-16
    • Saída HTML
    • JSON
  • Formatos de Arquivo
  • Testes
    • Node
    • Navegador
    • Ambientes Testados
    • Arquivos de Teste
  • Contribuindo
    • OSX/Linux
    • Windows
    • Testes
  • Licença
  • Referências

Primeiros Passos

Instalação

Scripts Autônomos para Navegador

A build autônoma completa para navegador é salva em dist/xlsx.full.min.js e pode ser adicionada diretamente a uma página com uma tag script:```html

root@kitploit:~
<details>
  <summary><b>Disponibilidade em CDNs</b> (clique para mostrar)</summary>

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

Por exemplo, `unpkg` disponibiliza a versão mais recente em:```html
<script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script>
Compilações para navegador (clique para exibir)

A versão completa de arquivo único é gerada em dist/xlsx.full.min.js

dist/xlsx.core.min.js omite a biblioteca codepage (sem suporte para codificações XLS)

Uma compilação mais enxuta é gerada em dist/xlsx.mini.min.js. Comparada à compilação completa:

  • biblioteca codepage omitida (sem suporte para codificações XLS)
  • sem suporte para XLSB / XLS / Lotus 1-2-3 / SpreadsheetML 2003 / Numbers
  • utilitários de stream do Node removidos

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

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

O build do Módulo ECMAScript é salvo em `xlsx.mjs` e pode ser adicionado diretamente a uma página com uma tag `script` usando `type=module`:```html
<script type="module">
import { read, writeFileXLSX } from "./xlsx.mjs";

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

O npm package também expõe o módulo com o parâmetro module, suportado no Angular e outros projetos:```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` pode ser importado no Deno.  Está disponível em `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

Com npm:```bash $ npm install xlsx

root@kitploit:~
Por padrão, o módulo suporta `require`:```js
var XLSX = require("xlsx");

O módulo também acompanha xlsx.mjs para uso com 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` é uma compilação ExtendScript para Photoshop e InDesign que está incluída no pacote `npm`. Pode ser referenciada diretamente com uma diretiva `#include`:```extendscript
#include "xlsx.extendscript.js"
Compatibilidade com Internet Explorer e ECMAScript 3 (clique para mostrar)

Para ampla compatibilidade com mecanismos JavaScript, a biblioteca é escrita usando o dialeto da linguagem ECMAScript 3, bem como alguns recursos do ES5 como Array#forEach. Navegadores mais antigos exigem shims para fornecer funções ausentes.

Para usar o shim, adicione o shim antes da tag script que carrega xlsx.js:```html

root@kitploit:~
O script também inclui `IE_LoadFile` e `IE_SaveFile` para carregar e salvar arquivos nas versões 6-9 do Internet Explorer. O script `xlsx.extendscript.js` agrupa o shim num formato adequado para o Photoshop e outros produtos Adobe.

</details>

### Uso

A maioria dos cenários envolvendo planilhas e dados pode ser dividida em 5 partes:

1) **Adquirir Dados**: Os dados podem ser armazenados em qualquer lugar: arquivos locais ou remotos, bancos de dados, HTML TABLE, ou mesmo gerados programaticamente no navegador.

2) **Extrair Dados**: Para arquivos de planilha, isso envolve a análise dos bytes brutos para ler os dados das células. Para dados JS em geral, isso envolve remodelar os dados.

3) **Processar Dados**: Desde gerar estatísticas resumidas até limpar registros de dados, este passo é o cerne do problema.

4) **Empacotar Dados**: Isso pode envolver criar uma nova planilha ou serializar com `JSON.stringify` ou escrever XML ou simplesmente achatar dados para ferramentas de interface de usuário.

5) **Liberar Dados**: Arquivos de planilha podem ser enviados para um servidor ou escritos localmente. Os dados podem ser apresentados aos usuários numa HTML TABLE ou grade de dados.

Um problema comum envolve gerar uma exportação válida de planilha a partir de dados armazenados numa tabela HTML. Neste exemplo, uma HTML TABLE na página será raspada, uma linha será adicionada ao final com a data do relatório, e um novo arquivo será gerado e baixado localmente. `XLSX.writeFile` cuida de empacotar os dados e tentar um download 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");

Esta biblioteca tenta simplificar os passos 2 e 4 com funções para extrair dados úteis de arquivos de planilhas (read / readFile) e gerar novos arquivos de planilhas a partir dos dados (write / writeFile). Funções utilitárias adicionais como table_to_book trabalham com outras fontes de dados comuns, como tabelas HTML.

Esta documentação e vários projetos de demonstração cobrem vários cenários e abordagens comuns para os passos 1 e 5.

Funções utilitárias auxiliam no passo 3.

"Adquirindo e Extraindo Dados" descreve soluções para cenários comuns de importação de dados.

"Empacotando e Liberando Dados" descreve soluções para cenários comuns de exportação de dados.

"Processando Dados" descreve soluções para cenários comuns de processamento e manipulação de pastas de trabalho.

"Funções Utilitárias" detalha funções utilitárias para traduzir Arrays JSON e outras estruturas JS comuns em objetos de planilha.

A Filosofia do SheetJS

O processamento de dados deve se encaixar em qualquer fluxo de trabalho

A biblioteca não impõe um ciclo de vida separado. Ela se encaixa perfeitamente em sites e aplicativos construídos com qualquer framework. Os objetos de dados JS simples funcionam bem com Web Workers e APIs futuras.

JavaScript é uma linguagem poderosa para processamento de dados

O "Formato Comum de Planilha" é uma representação simples em objeto dos conceitos centrais de uma pasta de trabalho. As várias funções na biblioteca fornecem ferramentas de baixo nível para trabalhar com o objeto.

Para um processamento JS amigável, existem funções utilitárias para converter partes de uma planilha de/para um Array de Arrays. O exemplo a seguir combina métodos poderosos de Array JS com uma biblioteca de requisição de rede para baixar dados, selecionar as informações que desejamos e criar um arquivo de planilha:

Obter Dados de um Endpoint JSON e Gerar uma Pasta de Trabalho (clique para mostrar)

O objetivo é gerar uma pasta de trabalho XLSB com nomes e datas de nascimento dos presidentes dos EUA.

Adquirir Dados

Dados Brutos

https://theunitedstates.io/congress-legislators/executive.json tem os dados desejados. Por exemplo, 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:~
_Filtragem para Presidentes_

O conjunto de dados inclui Aaron Burr, um Vice-Presidente que nunca foi Presidente!

`Array#filter` cria um novo array com as linhas desejadas. Um Presidente serviu
pelo menos um mandato com `type` definido como `"prez"`. Para testar se uma determinada linha possui
pelo menos um mandato `"prez"`, `Array#some` é outra função JS nativa. O
filtro completo seria:```js
const prez = raw_data.filter(row => row.terms.some(term => term.type === "prez"));

Organizando os dados

Para este exemplo, o nome será o primeiro nome combinado com o sobrenome (row.name.first + " " + row.name.last) e o aniversário será o subcampo row.bio.birthday. Usando Array#map, o conjunto de dados pode ser transformado em uma única chamada:```js const rows = prez.map(row => ({ name: row.name.first + " " + row.name.last, birthday: row.bio.birthday }));

Formatos de arquivo são detalhes de implementação

O analisador cobre uma ampla gama de formatos comuns de arquivos de planilha para garantir que arquivos "HTML-salvos-como-XLS" funcionem tão bem quanto arquivos XLS ou XLSX reais.

O escritor suporta vários formatos de saída comuns para ampla compatibilidade com o ecossistema de dados.

Na maior medida possível, o código de processamento de dados não deve se preocupar com os formatos de arquivo específicos envolvidos.

Demonstrações do Ecossistema JS

O diretório demos inclui projetos de exemplo para:

Frameworks e APIs

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

Bundlers e Ferramentas

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

Plataformas e Integrações

  • deno
  • electron application
  • nw.js application
  • Chrome / Chromium extensions
  • Download a Google Sheet locally
  • Adobe ExtendScript
  • Headless Browsers
  • canvas-datagrid
  • x-spreadsheet

Outros exemplos estão incluídos na showcase.

https://sheetjs.com/demos/modify.html mostra um exemplo completo de leitura, modificação e escrita de arquivos.

https://github.com/SheetJS/sheetjs/blob/HEAD/bin/xlsx.njs é a ferramenta de linha de comando incluída nas instalações do Node, lendo arquivos de planilha e exportando o conteúdo em vários formatos.

Adquirindo e Extraindo Dados

Analisando Pastas de Trabalho

API

Extrair dados de bytes de planilha```js var workbook = XLSX.read(data, opts);

root@kitploit:~
O método `read` pode extrair dados de bytes de planilha armazenados em uma string JS, "binary string", buffer NodeJS ou array tipado (`Uint8Array` ou `ArrayBuffer`).

_Ler bytes de planilha de um arquivo local e extrair dados_```js
var workbook = XLSX.readFile(filename, opts);

O método readFile tenta ler um arquivo de planilha no caminho fornecido. Navegadores geralmente não permitem a leitura de arquivos dessa forma (considerado um risco de segurança), e tentativas de ler arquivos dessa maneira lançarão um erro.

O segundo argumento opts é opcional. "Opções de Parsing" aborda as propriedades e comportamentos suportados.

Exemplos

Aqui estão alguns cenários comuns (clique em cada subtítulo para ver o código):

Arquivo local em um servidor NodeJS (clique para mostrar)

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

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

root@kitploit:~
Para Node ESM, o auxiliar `readFile` não está ativado. Em vez disso, `fs.readFileSync` deve ser usado para ler os dados do arquivo como um `Buffer` para uso com `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);
Arquivo local em uma aplicação Deno (clique para mostrar)

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

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

root@kitploit:~
Applications reading files must be invoked with the `--allow-read` flag.  The
[`deno` demo](https://github.com/weareu/xlsx/blob/master/demos/deno) has more examples

</details>

<details>
  <summary><b>Arquivo enviado pelo utilizador numa página web ("Arrastar e Soltar")</b> (click to show)</summary>

Para sites modernos que visam o Chrome 76+, `File#arrayBuffer` é recomendado:```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 compatibilidade, a API FileReader deve ser usada:```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);

Buscando um arquivo no navegador web ("Ajax") (clique para mostrar)

Para sites modernos que visam Chrome 42+, recomenda-se 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 um suporte mais amplo, a abordagem `XMLHttpRequest` é recomendada:```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();

A demonstração xhr inclui uma discussão mais longa e mais exemplos.

http://oss.sheetjs.com/sheetjs/ajax.html mostra abordagens alternativas para IE6+.

Arquivo local em um plugin do PhotoShop ou InDesign (clique para mostrar)

readFile encapsula a lógica de File no Photoshop e outros alvos ExtendScript. O caminho especificado deve ser um caminho absoluto:```js #include "xlsx.extendscript.js"

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

root@kitploit:~
A [`extendscript` demo](https://github.com/weareu/xlsx/blob/master/demos/extendscript) inclui um exemplo mais complexo.

</details>

<details>
  <summary><b>Arquivo local em um aplicativo Electron</b> (clique para exibir)</summary>

`readFile` pode ser usado no processo renderizador:```js
/* From the renderer process */
var XLSX = require("xlsx");

var workbook = XLSX.readFile(path);

As APIs do Electron mudaram ao longo do tempo. O demo electron mostra um exemplo completo e detalha as configurações específicas de versão necessárias.

Arquivo local em um aplicativo móvel com React Native (clique para mostrar)

O demo react inclui um aplicativo React Native de exemplo.

Como o React Native não fornece uma maneira de ler arquivos do sistema de arquivos, uma biblioteca de terceiros deve ser usada. As seguintes bibliotecas foram testadas:

  • react-native-file-access

A codificação base64 retorna strings compatíveis com o 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)

A codificação `ascii` retorna cadeias binárias compatíveis com o 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"});
Uploads de Arquivos do Servidor NodeJS (clique para mostrar)

read pode aceitar um buffer NodeJS. readFile pode ler arquivos gerados por um parser de corpo de requisição 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:~
O [`server` demo](https://github.com/weareu/xlsx/blob/master/demos/server) contém exemplos mais avançados.

</details>

<details>
  <summary><b>Baixar ficheiros num processo NodeJS</b> (clique para mostrar)</summary>

O Node 17.5 e 18.0 têm suporte 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 maior compatibilidade, recomenda-se módulos de terceiros.

request requer uma codificação null para produzir Buffers:```js var XLSX = require("xlsx"); var request = require("request");

Baixar arquivos em um aplicativo Electron (clique para mostrar)

O módulo net no processo principal pode fazer requisições HTTP/HTTPS para recursos externos. As respostas devem ser concatenadas 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>Fluxos de Leitura em NodeJS</b> (clique para exibir)</summary>

Ao lidar com fluxos de leitura, a abordagem mais fácil é armazenar em buffer o fluxo
e processar tudo no 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 no navegador (clique para mostrar)

Ao lidar com ReadableStream, a abordagem mais fácil é armazenar o fluxo em buffer e processar tudo no 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>

Exemplos mais detalhados são abordados nas [demonstrações incluídas](https://github.com/weareu/xlsx/blob/master/demos)

### Processando Dados JSON e JS

Dados JSON e JS tendem a representar planilhas únicas. Esta seção usará algumas funções utilitárias para gerar pastas de trabalho.

_Criar uma nova Pasta de Trabalho_```js
var workbook = XLSX.utils.book_new();

A função utilitária book_new cria uma pasta de trabalho vazia sem planilhas.

Softwares de planilha geralmente exigem pelo menos uma planilha e impõem esse requisito na interface do usuário. Esta biblioteca impõe o requisito no momento da gravação, gerando erros se uma pasta de trabalho vazia for passada para funções de gravação.

API

Crie uma planilha a partir de um array de arrays de valores JS```js var worksheet = XLSX.utils.aoa_to_sheet(aoa, opts);

root@kitploit:~
A função utilitária `aoa_to_sheet` percorre um "array de arrays" em ordem principal de linha, gerando um objeto de planilha. O trecho a seguir gera uma planilha com a célula `A1` definida como a string `A1`, a célula `B1` definida como `B1`, etc:```js
var worksheet = XLSX.utils.aoa_to_sheet([
  ["A1", "B1", "C1"],
  ["A2", "B2", "C2"],
  ["A3", "B3", "C3"]
]);

Processamento de Tabelas HTML

API

Criar uma planilha extraindo uma TABELA HTML da página```js var worksheet = XLSX.utils.table_to_sheet(dom_element, opts);

root@kitploit:~
A função utilitária `table_to_sheet` recebe um elemento DOM TABLE e itera pelas linhas para gerar uma planilha. O argumento `opts` é opcional.
["HTML Table Input"](#html-table-input) descreve a função em mais detalhes.



_Crie uma pasta de trabalho raspando uma TABLE HTML na página_```js
var workbook = XLSX.utils.table_to_book(dom_element, opts);

A função utilitária table_to_book segue a mesma lógica que table_to_sheet. Após gerar uma planilha, ela cria uma pasta de trabalho em branco e anexa a planilha.

O argumento de opções suporta as mesmas opções que table_to_sheet, com a adição de uma propriedade sheet para controlar o nome da planilha. Se a propriedade estiver ausente ou nenhuma opção for especificada, o nome padrão Sheet1 é usado.

Exemplos

Aqui estão alguns cenários comuns (clique em cada subtítulo para ver o código):

Elemento HTML TABLE em uma página web (clique para mostrar)```html
SheetJS
1234567
root@kitploit:~
Várias tabelas em uma página web podem ser convertidas em planilhas individuais:```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, o código HTML pode ser extraído e analisado:```js var htmlstr = document.getElementById("tableau").outerHTML; var workbook = XLSX.read(htmlstr, {type:"string"});

root@kitploit:~
</details>

<details>
  <summary><b>Extensão do Chrome/Chromium</b> (clique para mostrar)</summary>

A [`chrome` demo](https://github.com/weareu/xlsx/blob/master/demos/chrome) mostra um exemplo completo e detalha as permissões necessárias e outras configurações.

Em uma extensão, é recomendado gerar o workbook em um script de conteúdo e passar o objeto de volta para a extensão:```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);
});
Tabelas HTML no Lado do Servidor com Headless Chrome (clique para mostrar)

A demonstração headless inclui uma demonstração completa para converter arquivos HTML em pastas de trabalho XLSB. A ideia central é adicionar o script à página, analisar a tabela no contexto da página, gerar uma pasta de trabalho em base64 e enviá-la de volta para processamento adicional:```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);
Tabelas HTML do NodeJS sem navegador (clique para mostrar)

O NodeJS não inclui uma implementação DOM e o Puppeteer requer uma compilação pesada do Chromium. jsdom é uma alternativa leve:```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>

## Processamento de Dados

O ["Formato Comum de Planilha"](#common-spreadsheet-format) é uma representação simples de objeto dos conceitos centrais de uma pasta de trabalho.  As funções utilitárias trabalham com a representação do objeto e destinam-se a lidar com casos de uso comuns.

### Modificando a Estrutura da Pasta de Trabalho

**API**

_Anexar uma Planilha a uma Pasta de Trabalho_```js
XLSX.utils.book_append_sheet(workbook, worksheet, sheet_name);

A função utilitária book_append_sheet adiciona uma folha de cálculo ao livro de trabalho. O terceiro argumento especifica o nome desejado da folha de cálculo. Várias folhas de cálculo podem ser adicionadas a um livro de trabalho chamando a função várias vezes. Se o nome da folha de cálculo já estiver em uso no livro de trabalho, será lançado um erro.

Anexar uma Folha de Cálculo a um Livro de Trabalho e encontrar um nome único```js var new_name = XLSX.utils.book_append_sheet(workbook, worksheet, name, true);

root@kitploit:~
Se o quarto argumento for `true`, a função começará com o nome da planilha especificado. Se o nome da planilha existir na pasta de trabalho, um novo nome de planilha será escolhido encontrando a raiz do nome e incrementando o 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
root@kitploit:~
O resultado é uma matriz de objetos "simples" sem aninhamento:```js
[
  { name: "George Washington", birthday: "1732-02-22" },
  { name: "John Adams", birthday: "1735-10-19" },
  // ... one row per President
]

Extrair Dados

Com o conjunto de dados limpo, XLSX.utils.json_to_sheet gera uma planilha:```js const worksheet = XLSX.utils.json_to_sheet(rows);

root@kitploit:~
`XLSX.utils.book_new` cria uma nova pasta de trabalho e `XLSX.utils.book_append_sheet` anexa uma planilha à pasta de trabalho. A nova planilha será chamada de "Dates":```js
const workbook = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(workbook, worksheet, "Dates");

Dados do Processo

Corrigindo cabeçalhos

Por padrão, json_to_sheet cria uma planilha com uma linha de cabeçalho. Neste caso, os cabeçalhos vêm das chaves do objeto JS: "name" e "birthday".

Os cabeçalhos estão nas células A1 e B1. XLSX.utils.sheet_add_aoa pode escrever valores de texto na planilha existente começando na célula A1:```js XLSX.utils.sheet_add_aoa(worksheet, [["Name", "Birthday"]], { origin: "A1" });

root@kitploit:~
_Corrigindo Larguras de Colunas_

Alguns dos nomes são mais longos que a largura padrão da coluna.  As larguras das colunas são
definidas por [definir a propriedade `"!cols"` da planilha](#row-and-column-properties).

A linha a seguir define a largura da coluna A para aproximadamente 10 caracteres:```js
worksheet["!cols"] = [ { wch: 10 } ]; // set column A width to 10 characters

Uma chamada Array#reduce sobre rows pode calcular a largura máxima:```js const max_width = rows.reduce((w, r) => Math.max(w, r.name.length), 10); worksheet["!cols"] = [ { wch: max_width } ];

root@kitploit:~
Nota: Se o ponto de partida foi um arquivo ou tabela HTML, `XLSX.utils.sheet_to_json` gerará um array de objetos JS.

**Dados do Pacote e da Versão**

`XLSX.writeFile` cria um arquivo de planilha e tenta escrevê-lo no sistema.  No navegador, tentará solicitar que o usuário faça o download do arquivo.  No NodeJS, ele escreverá no diretório local.```js
XLSX.writeFile(workbook, "Presidents.xlsx");

Exemplo 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 uso no navegador web, assumindo que o snippet está salvo como `snippet.js`, tags de script devem ser usadas para incluir as builds standalone do `axios` e do `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>
typed arrays and math
  • react-data-grid
  • vue3-table-light
  • Swift JSC and other engines
  • "serverless" functions
  • internet explorer
  • root@kitploit:~
    /* DO SOMETHING WITH workbook HERE */
    

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

    root@kitploit:~
    <https://oss.sheetjs.com/sheetjs/> demonstra a técnica FileReader.
    
    </details>
    
    <details>
      <summary><b>Arquivo enviado pelo usuário com um elemento HTML INPUT</b> (clique para mostrar)</summary>
    
    Começando com um elemento HTML INPUT com `type="file"`:```html
    <input type="file" id="input_dom_element">
    

    Para sites modernos que visam Chrome 76+, Blob#arrayBuffer é recomendado:```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 suporte mais amplo (incluindo IE10+), a abordagem `FileReader` é recomendada:```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);
    

    O demo oldie mostra um cenário de fallback compatível com IE.

    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 da mesma forma no navegador e no 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 */
    })();
    

    "Array of Arrays Input" descreve a função e o argumento opcional opts em mais detalhes.

    Crie uma planilha a partir de um array de objetos JS```js var worksheet = XLSX.utils.json_to_sheet(jsa, opts);

    root@kitploit:~
    A função utilitária `json_to_sheet` percorre uma matriz de objetos JS em ordem, gerando um objeto de planilha. Por padrão, ela gerará uma linha de cabeçalho e uma linha por objeto na matriz. O argumento opcional `opts` tem configurações para controlar a ordem das colunas e a saída do cabeçalho.
    
    ["Entrada de Matriz de Objetos"](#array-of-arrays-input) descreve a função e o argumento opcional `opts` em mais detalhes.
    
    **Exemplos**
    
    ["Zen do SheetJS"](#the-zen-of-sheetjs) contém um exemplo detalhado "Obter Dados de um Endpoint JSON e Gerar uma Pasta de Trabalho"
    
    
    [`x-spreadsheet`](https://github.com/myliang/x-spreadsheet) é uma grade de dados interativa para pré-visualizar e modificar dados estruturados no navegador web. A [demonstração do `xspreadsheet`](https://github.com/weareu/xlsx/blob/master/demos/xspreadsheet) inclui um script de exemplo com a função `xtos` para converter de objeto de dados do x-spreadsheet para uma pasta de trabalho. <https://oss.sheetjs.com/sheetjs/x-spreadsheet> é uma demonstração ao vivo.
    
    <details>
      <summary><b>Registros de uma consulta de banco de dados (SQL ou no-SQL)</b> (clique para mostrar)</summary>
    
    A [demonstração do `database`](https://github.com/weareu/xlsx/blob/master/demos/database) inclui exemplos de trabalho com bancos de dados e resultados de consultas.
    
    </details>
    
    
    <details>
      <summary><b>Computações Numéricas com TensorFlow.js</b> (clique para mostrar)</summary>
    
    [`@tensorflow/tfjs`](https://github.com/weareu/xlsx/blob/master/%40tensorflow/tfjs) e outras bibliotecas esperam dados em arrays simples, bem adequados para planilhas onde cada coluna é um vetor de dados. Isso é a transposição de como a maioria das pessoas usa planilhas, onde cada linha é um vetor.
    
    Ao recuperar dados do `tfjs`, os pontos de dados retornados são armazenados em um array tipado. Um array de arrays pode ser construído com loops. `Array#unshift` pode antepor uma linha de título antes da conversão:```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);
    

    O demo array mostra um exemplo completo.

    `});

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

    root@kitploit:~
    </details>
    
    <details>
      <summary><b>Tabelas HTML no Lado do Servidor com WebKit Headless</b> (clique para mostrar)</summary>
    
    A [`headless` demo](https://github.com/weareu/xlsx/blob/master/demos/headless) inclui uma demonstração completa para converter arquivos HTML em pastas de trabalho XLSB usando [PhantomJS](https://phantomjs.org/). A ideia central é adicionar o script à página, analisar a tabela no contexto da página, gerar uma pasta de trabalho `binary` e enviá-la de volta para processamento adicional:```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();
      });
    });
    

    Liste os nomes das planilhas na ordem das guias```js var wsnames = workbook.SheetNames;

    root@kitploit:~
    A propriedade `SheetNames` do objeto workbook é uma lista dos nomes das planilhas na "ordem das guias". As funções da API consultarão este array.
    
    _Substituir uma Planilha no lugar_```js
    workbook.Sheets[sheet_name] = new_worksheet;
    

    A propriedade Sheets do objeto workbook é um objeto cujas chaves são nomes e cujos valores são objetos de planilha. Ao reatribuir a uma propriedade do objeto Sheets, o objeto de planilha pode ser alterado sem interromper o restante da estrutura da planilha.

    Exemplos

    Adicionar uma nova planilha a um workbook (clique para exibir)

    Este exemplo usa XLSX.utils.aoa_to_sheet.```js var ws_name = "SheetJS";

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

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

    root@kitploit:~
    </details>
    
    ### Modificando Valores de Células
    
    **API**
    
    _Modificar o valor de uma única célula em uma planilha_```js
    XLSX.utils.sheet_add_aoa(worksheet, [[new_value]], { origin: address });
    

    Modificar vários valores de células em uma planilha```js XLSX.utils.sheet_add_aoa(worksheet, aoa, opts);

    root@kitploit:~
    A função utilitária `sheet_add_aoa` modifica os valores das células numa folha de cálculo. O primeiro argumento é o objeto da folha de cálculo. O segundo argumento é um array de arrays de valores. A chave `origin` do terceiro argumento controla onde as células serão escritas. O seguinte trecho define `B3=1` e `E5="abc"`:```js
    XLSX.utils.sheet_add_aoa(worksheet, [
      [1],                             // <-- Write 1 to cell B3
      ,                                // <-- Do nothing in row 4
      [/*B5*/, /*C5*/, /*D5*/, "abc"]  // <-- Write "abc" to cell E5
    ], { origin: "B3" });
    

    "Entrada de Array de Arrays" descreve a função e o argumento opcional opts em mais detalhes.

    Exemplos

    Adicionando linhas a uma planilha (clique para mostrar)

    O valor de origem especial -1 instrui sheet_add_aoa a começar na coluna A da linha após a última linha no intervalo, anexando os dados:```js XLSX.utils.sheet_add_aoa(worksheet, [ ["first row after data", 1], ["second row after data", 2] ], { origin: -1 });

    root@kitploit:~
    </details>
    
    
    ### Modificando Outras Propriedades de Planilha / Pasta de Trabalho / Célula
    
    A seção ["Formato Comum de Planilha"](#common-spreadsheet-format) descreve as estruturas de objetos em maiores detalhes.
    
    ## Empacotando e Liberando Dados
    
    ### Escrevendo Pastas de Trabalho
    
    **API**
    
    _Gerar bytes de planilha (arquivo) a partir dos dados_```js
    var data = XLSX.write(workbook, opts);
    

    O método write tenta empacotar dados da pasta de trabalho em um arquivo na memória. Por padrão, arquivos XLSX são gerados, mas isso pode ser controlado com a propriedade bookType do argumento opts. Com base na opção type, os dados podem ser armazenados como uma "binary string", string JS, Uint8Array ou Buffer.

    O segundo argumento opts é obrigatório. cobre as propriedades e comportamentos suportados.

    Propriedades de Linhas e Colunas

    Suporte de Formato (clique para mostrar)

    Propriedades de Linhas: XLSX/M, XLSB, BIFF8 XLS, XLML, SYLK, DOM, ODS

    Propriedades de Colunas: XLSX/M, XLSB, BIFF8 XLS, XLML, SYLK, DOM

    As propriedades de linhas e colunas não são extraídas por padrão ao ler de um arquivo e não são persistidas por padrão ao escrever em um arquivo. A opção cellStyles: true deve ser passada para a função de leitura ou escrita relevante.

    Propriedades de Colunas

    O array !cols em cada planilha, se presente, é uma coleção de objetos ColInfo que possuem as seguintes propriedades:```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:~
    _Row Properties_
    
    O array `!rows` em cada planilha, se presente, é uma coleção de objetos `RowInfo` que possuem as seguintes propriedades:```typescript
    type RowInfo = {
      /* visibility */
      hidden?: boolean; // if true, the row is hidden
    
      /* row height is specified in one of the following ways: */
      hpx?:    number;  // height in screen pixels
      hpt?:    number;  // height in points
    
      level?:  number;  // 0-indexed outline / group level
    };
    

    Outline / Group Levels Convention

    A interface do Excel exibe o nível de estrutura base como 1 e o nível máximo como 8. Seguindo as convenções do JS, o SheetJS usa níveis de estrutura indexados a partir de 0, onde o nível de estrutura base é 0 e o nível máximo é 7.

    Por que existem três tipos de largura? (clique para mostrar)

    Existem três tipos diferentes de largura correspondentes às três maneiras diferentes de armazenar larguras de colunas em planilhas:

    Formatos de texto simples como SYLK usam contagem bruta de caracteres. Ferramentas contemporâneas como Visicalc e Multiplan eram baseadas em caracteres. Como os caracteres tinham a mesma largura, bastava armazenar uma contagem. Esta tradição foi continuada nos formatos BIFF.

    O SpreadsheetML (2003) tentou alinhar-se com o HTML padronizando a contagem de pixels na tela em todo o arquivo. Larguras de colunas, alturas de linhas e outras medidas usam pixels. Quando as contagens de pixels e caracteres não se alinham, o Excel arredonda os valores.

    O XLSX armazena internamente as larguras de colunas em uma forma nebulosa de "Largura Máxima do Dígito" (Max Digit Width). A Largura Máxima do Dígito é a largura do maior dígito quando renderizado (geralmente o caractere "0" é o mais largo). A largura interna deve ser um múltiplo inteiro da a largura dividida por 256. O ECMA-376 descreve uma fórmula para converter entre pixels e a largura interna. Isso representa uma abordagem híbrida.

    Funções de leitura tentam preencher todas as três propriedades. Funções de escrita tentarão ciclar os valores especificados para o tipo desejado. Para evitar possíveis conflitos, a manipulação deve primeiro excluir as outras propriedades. Por exemplo, ao alterar a largura em pixels, exclua as propriedades wch e width.

    Detalhes de implementação (clique para mostrar)

    Alturas de Linhas

    O Excel armazena internamente as alturas de linhas em pontos. A resolução padrão é 72 DPI ou 96 PPI, então o pixel e o tamanho do ponto devem concordar. Para diferentes resoluções, eles podem não concordar, então a biblioteca separa os conceitos.

    Mesmo que toda a informação esteja disponível, espera-se que os escritores sigam a ordem de prioridade:

    1. usar hpx altura em pixels se disponível
    2. usar hpt altura em pontos se disponível

    Larguras de Colunas

    Dadas as restrições, é possível determinar o MDW sem realmente inspecionar a fonte! Os analisadores adivinham a largura em pixels convertendo de largura para pixels e vice-versa, repetindo para todos os MDW possíveis e selecionando o MDW que minimiza o erro. O XLML na verdade armazena a largura em pixels, então o palpite funciona na direção oposta.

    Mesmo que toda a informação esteja disponível, espera-se que os escritores sigam a ordem de prioridade:

    1. usar o campo width se disponível
    2. usar wpx largura em pixels se disponível
    3. usar wch contagem de caracteres se disponível

    Formatos de Número

    O texto formatado cell.w para cada célula é produzido a partir do formato cell.v e cell.z. Se o formato não for especificado, o formato General do Excel é usado. O formato pode ser especificado como uma string ou como um índice na tabela de formatos. Espera-se que os analisadores preencham workbook.SSF com a tabela de formatos de número. Espera-se que os escritores serializem a tabela.

    Ferramentas personalizadas devem garantir que a tabela local tenha cada string de formato usada em algum lugar na tabela. A convenção do Excel determina que os formatos personalizados comecem no índice 164. O exemplo a seguir cria um formato personalizado do zero:

    Nova planilha com formato personalizado (clique 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 } } } ```

    As regras são ligeiramente diferentes de como o Excel exibe formatos de número personalizados. Em particular, caracteres literais devem ser envolvidos em aspas duplas ou precedidos por uma barra invertida. Para mais informações, consulte o artigo da documentação do Excel Create or delete a custom number format ou ECMA-376 18.8.31 (Number Formats)

    Formatos de Número Padrão (clique para mostrar)

    Os formatos padrão estão listados na ECMA-376 18.8.30:

    O formato 14 (m/d/yy) é localizado pelo Excel: mesmo que o arquivo especifique esse formato de número, ele será desenhado de forma diferente com base nas configurações do sistema. Isso faz sentido quando o produtor e o consumidor dos arquivos estão na mesma localidade, mas isso nem sempre é o caso na Internet. Para contornar essa ambiguidade, as funções de leitura aceitam a opção dateNF para substituir a interpretação dessa string de formato específica.

    Hiperlinks

    Suporte de Formato (clique para mostrar)

    Hiperlinks de Célula: XLSX/M, XLSB, BIFF8 XLS, XLML, ODS

    Dicas de Ferramenta: XLSX/M, XLSB, BIFF8 XLS, XLML

    Hiperlinks são armazenados na chave l dos objetos de célula. O campo Target do objeto de hiperlink é o destino do link, incluindo o fragmento da URI. As dicas de ferramenta são armazenadas no campo Tooltip e são exibidas quando você move o mouse sobre o texto.

    Por exemplo, o trecho a seguir cria um link da célula A3 para https://sheetjs.com com a dica "Encontre-nos no SheetJS.com!":```js ws['A1'].l = { Target:"https://sheetjs.com", Tooltip:"Find us @ SheetJS.com!" };

    root@kitploit:~
    Observe que o Excel não estiliza automaticamente hiperlinks -- eles geralmente serão exibidos como texto normal.
    
    _Links Remotos_
    
    Links HTTP / HTTPS podem ser usados diretamente:```js
    ws['A2'].l = { Target:"https://docs.sheetjs.com/#hyperlinks" };
    ws['A3'].l = { Target:"http://localhost:7262/yes_localhost_works" };
    

    O Excel também suporta links de e-mail mailto com linha de assunto:```js ws['A4'].l = { Target:"mailto:[email protected]" }; ws['A5'].l = { Target:"mailto:[email protected]?subject=Test Subject" };

    root@kitploit:~
    _Links Locais_
    
    Links para caminhos absolutos devem usar o esquema de 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 */
    

    Links para caminhos relativos podem ser especificados sem um esquema:```js ws['B3'].l = { Target:"SheetJS.xlsb" }; /* Link to SheetJS.xlsb / ws['B4'].l = { Target:"../SheetJS.xlsm" }; / Link to ../SheetJS.xlsm */

    root@kitploit:~
    Caminhos Relativos têm comportamento indefinido no formato SpreadsheetML 2003.  Excel
    2019 tratará uma marca pai `..\` como dois níveis acima.
    
    _Links Internos_
    
    Links onde o destino é uma célula, intervalo ou nome definido na mesma pasta de trabalho
    ("Links Internos") são marcados com um caractere hash inicial:```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 */
    

    Comentários de Célula

    Os comentários de célula são objetos armazenados no array c de objetos de célula. O conteúdo real do comentário é dividido em blocos com base no autor do comentário. O campo a de cada objeto de comentário é o autor do comentário e o campo t é a representação em texto simples.

    Por exemplo, o seguinte trecho adiciona um comentário de célula na célula 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: O XLSB impõe um limite de 54 caracteres para o nome do Autor. Nomes com mais de 54 caracteres podem causar problemas com outros formatos.
    
    Para marcar um comentário como normalmente oculto, defina a propriedade `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"});
    

    Threaded Comments

    Introduced in Excel 365, threaded comments are plain text comment snippets with author metadata and parent references. They are supported in XLSX and XLSB.

    To mark a comment as threaded, each comment part must have a true T property:```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:~
    Não há metadados do Active Directory ou do Office 365 associados a autores em uma thread.
    
    #### Visibilidade da Planilha
    
    O Excel permite ocultar planilhas na barra de guias inferior.  Os dados da planilha são armazenados no
    arquivo, mas a interface do usuário não os disponibiliza facilmente.  Planilhas ocultas padrão
    são reveladas no menu "Reexibir".  O Excel também possui planilhas "muito ocultas" que
    não podem ser reveladas no menu.  Só é acessível no Editor VB!
    
    A configuração de visibilidade é armazenada na propriedade `Hidden` do array de propriedades da planilha.
    
    <details>
      <summary><b>Mais detalhes</b> (clique para mostrar)</summary>
    
    | Valor | Definição  |
    |:-----:|:------------|
    |   0   | Visível     |
    |   1   | Oculta      |
    |   2   | Muito Oculta |
    
    Com <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 ] ]
    

    Formatos não Excel não suportam o estado Very Hidden. A melhor forma de testar se uma planilha está visível é verificar se a propriedade Hidden é verdade lógica:```js

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

    root@kitploit:~
    </details>
    
    #### VBA e Macros
    
    As Macros VBA são armazenadas em um blob de dados especial que é exposto na propriedade `vbaraw` do objeto da pasta de trabalho quando a opção `bookVBA` é `true`. Elas são suportadas nos formatos `XLSM`, `XLSB` e `BIFF8 XLS`. Os escritores de formato suportados inserem automaticamente os blobs de dados se eles estiverem presentes na pasta de trabalho e associam com os nomes das planilhas.
    
    <details>
    	<summary><b>Nomes de Código Personalizados</b> (clique para mostrar)</summary>
    
    O nome de código da pasta de trabalho é armazenado em `wb.Workbook.WBProps.CodeName`. Por padrão, o Excel escreverá `ThisWorkbook` ou uma frase traduzida como `DieseArbeitsmappe`. Os nomes de código das planilhas e gráficos estão no objeto de propriedades da planilha em `wb.Workbook.Sheets[i].CodeName`. Macrosheets e Dialogsheets são ignorados.
    
    Os leitores e escritores preservam os nomes de código, mas eles precisam ser definidos manualmente ao adicionar um blob VBA a uma pasta de trabalho diferente.
    
    </details>
    
    <details>
    	<summary><b>Macrosheets</b> (clique para mostrar)</summary>
    
    Versões mais antigas do Excel também suportavam um tipo de planilha "macrosheet" não-VBA que armazenava comandos de automação. Elas são expostas em objetos com a propriedade `!type` definida como `"macro"`.
    
    </details>
    
    <details>
    	<summary><b>Detectando macros em pastas de trabalho</b> (clique para mostrar)</summary>
    
    O campo `vbaraw` só será definido se houver macros presentes, então o teste é simples:```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');
    }
    

    Opções de Parsing

    As funções exportadas read e readFile aceitam um argumento de opções:

    Nome da OpçãoPadrãoDescrição
    typeCodificação dos dados de entrada (ver Tipo de Entrada abaixo)
    rawfalseSe true, a análise de texto simples não interpretará valores **
    codepageSe especificado, usa a página de código quando apropriado **
    cellFormulatrueSalva fórmulas no campo .f
    cellHTMLtrueInterpreta rich text e salva HTML no campo .h
    cellNFfalseSalva string de formato numérico no campo .z
    cellStylesfalseSalva informações de estilo/tema no campo .s
    cellTexttrueGera texto formatado no campo .w
    cellDatesfalseArmazena datas como tipo d (padrão é n)
    dateNFSe especificado, usa a string para o código de data 14 **
    sheetStubsfalseCria objetos de célula do tipo z para células stub
    sheetRows0Se >0, lê as primeiras sheetRows linhas **
    bookDepsfalseSe true, analisa cadeias de cálculo
    • Mesmo se cellNF for false, o texto formatado será gerado e salvo em .w
    • Em alguns casos, as folhas podem ser analisadas mesmo que bookSheets seja false.
    • O Excel tenta agressivamente interpretar valores de CSV e outros textos simples. Isso leva a um comportamento surpreendente! A opção raw suprime a interpretação de valores.
    • bookSheets e bookProps combinam para fornecer ambos os conjuntos de informações.
    • Deps será um objeto vazio se bookDeps for false.
    • O comportamento de bookFiles depende do tipo de arquivo:
      • array keys (caminhos no ZIP) para formatos baseados em ZIP
      • hash files (mapeando caminhos para objetos representando os arquivos) para ZIP
      • objeto cfb para formatos que usam contêineres CFB
    • sheetRows-1 linhas serão geradas ao observar a saída do objeto JSON (pois a linha de cabeçalho é contada como uma linha ao analisar os dados)
    • Por padrão, todas as planilhas são analisadas. sheets restringe com base no tipo de entrada:
      • número: índice baseado em zero da planilha a ser analisada (0 é a primeira planilha)
      • string: nome da planilha a ser analisada (não diferencia maiúsculas/minúsculas)
      • array de números e strings para selecionar múltiplas planilhas.
    • bookVBA meramente expõe o objeto VBA CFB bruto. Ele não analisa os dados. XLSM e XLSB armazenam o objeto VBA CFB em xl/vbaProject.bin. BIFF8 XLS mistura as entradas VBA junto com a entrada principal da Pasta de Trabalho, então a biblioteca gera um novo blob compatível com XLSB a partir do contêiner XLS CFB.
    • codepage é aplicado a arquivos BIFF2 - BIFF5 sem registros CodePage e a arquivos CSV sem BOM no modo type:"binary". BIFF8 XLS sempre usa 1200 por padrão.
    • PRN afeta a análise de arquivos de texto sem um caractere delimitador comum.
    • Atualmente apenas criptografia XOR é suportada. Um erro de não suportado será lançado para arquivos que empregam outros métodos de criptografia.
    • Funções mais recentes do Excel são serializadas com o prefixo _xlfn., oculto do usuário. O SheetJS remove _xlfn. normalmente. A opção xlfn os preserva.
    • WTF é principalmente para desenvolvimento. Por padrão, o analisador suprimirá erros de leitura em planilhas individuais, permitindo que você leia as planilhas que são analisadas corretamente. Definir WTF:true força esses erros a serem lançados.

    Tipo de Entrada

    Strings podem ser interpretadas de múltiplas formas. O parâmetro type para read informa à biblioteca como interpretar o argumento de dados:

    typeentrada esperada
    "base64"string: codificação Base64 do arquivo
    "binary"string: string binária (byte n é data.charCodeAt(n))
    "string"string: string JS (caracteres interpretados como UTF8)
    "buffer"Buffer do Node.js
    "array"array: array de inteiros de 8 bits sem sinal (byte n é data[n])
    "file"string: caminho do arquivo que será lido (apenas Node.js)

    Adivinhando o Tipo de Arquivo

    Detalhes de Implementação (clique para mostrar)

    O Excel e outras ferramentas de planilha leem os primeiros bytes e aplicam outras heurísticas para determinar um tipo de arquivo. Isso permite a troca de tipos de arquivo: renomear arquivos com a extensão .xls dirá ao seu computador para usar o Excel para abrir o arquivo, mas o Excel saberá como tratá-lo. Esta biblioteca aplica lógica similar:

    Byte 0Tipo de Arquivo BrutoTipos de Planilha
    0xD0Contêiner CFBBIFF 5/8 ou XLSX/XLSB protegido ou WQ3/QPW ou XLR
    0x09Fluxo BIFFBIFF 2/3/4/5
    0x3CXML/HTMLSpreadsheetML / Flat ODS / UOS1 / HTML / texto simples
    0x50Arquivo ZIPXLSB ou XLSX/M ou ODS ou UOS2 ou NUMBERS ou texto
    0x49Texto SimplesSYLK ou texto simples
    0x54Texto SimplesDIF ou texto simples
    0xEFCodificado UTF8SpreadsheetML / Flat ODS / UOS1 / HTML / texto simples
    0xFFCodificado UTF16SpreadsheetML / Flat ODS / UOS1 / HTML / texto simples
    0x00Fluxo de RegistroLotus WK* ou Quattro Pro ou texto simples
    0x7BTexto simplesRTF ou texto simples
    0x0ATexto simplesSpreadsheetML / Flat ODS / UOS1 / HTML / texto simples
    0x0DTexto simplesSpreadsheetML / Flat ODS / UOS1 / HTML / texto simples
    0x20Texto simplesSpreadsheetML / Flat ODS / UOS1 / HTML / texto simples

    Arquivos DBF são detectados com base no primeiro byte, bem como no terceiro e quarto bytes (correspondentes ao mês e dia da data do arquivo)

    Arquivos do Works para Windows são detectados com base no registro BOF com tipo 0xFF

    A adivinhação de formato de texto simples segue a ordem de prioridade:

    • Tags HTML incluem: html, table, head, meta, script, style, div
    Por que arquivos de texto aleatórios são válidos? (clique para mostrar)

    O Excel é extremamente agressivo na leitura de arquivos. Adicionar uma extensão XLS a qualquer arquivo de texto de exibição (onde os únicos caracteres são caracteres de exibição ANSI) engana o Excel fazendo-o pensar que o arquivo é potencialmente um arquivo CSV ou TSV, mesmo que seja apenas uma coluna! Esta biblioteca tenta replicar esse comportamento.

    A melhor abordagem é validar a planilha desejada e garantir que ela tenha o número esperado de linhas ou colunas. Extrair o intervalo é extremamente simples:```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>
    
    ## Opções de Escrita
    
    As funções exportadas `write` e `writeFile` aceitam um argumento de opções:
    
    | Nome da Opção |  Padrão | Descrição                                         |
    | :---------- | -------: | :-------------------------------------------------- |
    |`type`       |          | Codificação dos dados de saída (veja Tipo de Saída abaixo)        |
    |`cellDates`  |  `false` | Armazenar datas como tipo `d` (padrão é `n`)            |
    |`bookSST`    |  `false` | Gerar Tabela de Strings Compartilhada **                     |
    |`bookType`   | `"xlsx"` | Tipo de Pasta de Trabalho (veja abaixo os formatos suportados)  |
    |`sheet`      |     `""` | Nome da Planilha para formatos de folha única **       |
    |`compression`|  `false` | Usar compressão ZIP para formatos baseados em ZIP **        |
    |`Props`      |          | Sobrescrever propriedades da pasta de trabalho ao escrever **        |
    |`themeXLSX`  |          | Sobrescrever XML de tema ao escrever XLSX/XLSB/XLSM **   |
    |`ignoreEC`   |   `true` | Suprimir erros de "número como texto" **                 |
    |`numbers`    |          | Payload para exportação NUMBERS **                       |
    
    - `bookSST` é mais lento e consome mais memória, mas tem melhor compatibilidade com versões antigas do iOS Numbers
    - Os dados brutos são a única coisa garantida a serem salvos.  Recursos não descritos neste README podem não ser serializados.
    - `cellDates` se aplica apenas à saída XLSX e não é garantido que funcione com leitores de terceiros.  O próprio Excel normalmente não escreve células com tipo `d`, então ferramentas não Excel podem ignorar os dados ou apresentar erro na presença de datas.
    - `Props` é um objeto que espelha o campo `Props` da pasta de trabalho.  Veja a tabela da seção [Propriedades do Arquivo da Pasta de Trabalho](#workbook-file-properties).
    - se especificado, a string de `themeXLSX` será salva como o tema principal para arquivos XLSX/XLSB/XLSM (para `xl/theme/theme1.xml` no ZIP)
    - Devido a um bug no programa, alguns recursos como "Texto para Colunas" farão o Excel travar em planilhas onde condições de erro são ignoradas.  O escritor marcará os arquivos para ignorar o erro por padrão.  Defina `ignoreEC` como `false` para suprimir.
    - Devido ao tamanho dos dados, os dados NUMBERS não estão incluídos por padrão. Os scripts incluídos `xlsx.zahl.js` e `xlsx.zahl.mjs` contêm os dados.
    
    ### Formatos de Saída Suportados
    
    Para ampla compatibilidade com ferramentas de terceiros, esta biblioteca suporta muitos formatos de saída.  O tipo de arquivo específico é controlado com a opção `bookType`:
    
    | `bookType` | extensão de arquivo | contêiner | folhas | Descrição                     |
    | :--------- | -------: | :-------: | :----- |:------------------------------- |
    | `xlsx`     | `.xlsx`  |    ZIP    | multi  | Formato XML Excel 2007+          |
    | `xlsm`     | `.xlsm`  |    ZIP    | multi  | Formato XML de Macro Excel 2007+    |
    | `xlsb`     | `.xlsb`  |    ZIP    | multi  | Formato Binário Excel 2007+       |
    | `biff8`    | `.xls`   |    CFB    | multi  | Formato de Pasta de Trabalho Excel 97-2004   |
    | `biff5`    | `.xls`   |    CFB    | multi  | Formato de Pasta de Trabalho Excel 5.0/95    |
    | `biff4`    | `.xls`   |   none    | single | Formato de Planilha Excel 4.0      |
    | `biff3`    | `.xls`   |   none    | single | Formato de Planilha Excel 3.0      |
    | `biff2`    | `.xls`   |   none    | single | Formato de Planilha Excel 2.0      |
    | `xlml`     | `.xls`   |   none    | multi  | Excel 2003-2004 (SpreadsheetML) |
    | `numbers`  |`.numbers`|    ZIP    | single | Planilha Numbers 3.0+        |
    | `ods`      | `.ods`   |    ZIP    | multi  | Planilha OpenDocument        |
    | `fods`     | `.fods`  |   none    | multi  | Planilha OpenDocument Plana   |
    | `wk3`      | `.wk3`   |   none    | multi  | Pasta de Trabalho Lotus (WK3)            |
    | `csv`      | `.csv`   |   none    | single | Valores Separados por Vírgula          |
    | `txt`      | `.txt`   |   none    | single | Texto Unicode UTF-16 (TXT)       |
    | `sylk`     | `.sylk`  |   none    | single | Link Simbólico (SYLK)            |
    | `html`     | `.html`  |   none    | single | Documento HTML                   |
    | `dif`      | `.dif`   |   none    | single | Formato de Intercâmbio de Dados (DIF)   |
    | `dbf`      | `.dbf`   |   none    | single | dBASE II + Extensões VFP (DBF) |
    | `wk1`      | `.wk1`   |   none    | single | Planilha Lotus (WK1)           |
    | `rtf`      | `.rtf`   |   none    | single | Formato Rich Text (RTF)          |
    | `prn`      | `.prn`   |   none    | single | Texto Formatado Lotus            |
    | `eth`      | `.eth`   |   none    | single | Formato de Registro Ethercalc (ETH)   |
    
    - `compression` se aplica apenas a formatos com contêineres ZIP.
    - Formatos que suportam apenas uma folha exigem a opção `sheet` especificando a planilha.  Se a string estiver vazia, a primeira planilha é usada.
    - `writeFile` adivinhará automaticamente o formato do arquivo de saída com base na extensão do arquivo se `bookType` não for especificado.  Ele escolherá o primeiro formato na tabela mencionada que corresponda à extensão.
    
    ### Tipo de Saída
    
    O argumento `type` para `write` reflete o argumento `type` para `read`:
    
    | `type`     | saída                                                          |
    |------------|-----------------------------------------------------------------|
    | `"base64"` | string: codificação Base64 do arquivo                             |
    | `"binary"` | string: string binária (byte `n` é `data.charCodeAt(n)`)        |
    | `"string"` | string: string JS (caracteres interpretados como UTF8)              |
    | `"buffer"` | nodejs Buffer                                                   |
    | `"array"`  | ArrayBuffer, array de fallback de inteiros sem sinal de 8 bits               |
    | `"file"`   | string: caminho do arquivo que será criado (apenas nodejs)         |
    
    - Para compatibilidade com Excel, a saída `csv` sempre incluirá a marca de ordem de byte UTF-8.
    
    ## Funções Utilitárias
    
    As funções `sheet_to_*` aceitam uma planilha e um objeto de opções opcional.
    
    As funções `*_to_sheet` aceitam um objeto de dados e um objeto de opções opcional.
    
    Os exemplos são baseados na seguinte planilha:```
    XXX| A | B | C | D | E | F | G |
    ---+---+---+---+---+---+---+---+
     1 | S | h | e | e | t | J | S |
     2 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
     3 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
    

    Entrada de Array de Arrays

    XLSX.utils.aoa_to_sheet recebe um array de arrays de valores JS e retorna uma planilha semelhante aos dados de entrada. Números, Booleanos e Strings são armazenados com os estilos correspondentes. Datas são armazenadas como data ou números. Lacunas no array e valores undefined explícitos são ignorados. Valores null podem ser preenchidos com stubs. Todos os outros valores são armazenados como strings. A função aceita um argumento de opções:

    Exemplos (clique para mostrar)

    Para gerar a planilha de exemplo:```js var ws = XLSX.utils.aoa_to_sheet([ "SheetJS".split(""), [1,2,3,4,5,6,7], [2,3,4,5,6,7,8] ]);

    root@kitploit:~
    </details>
    
    `XLSX.utils.sheet_add_aoa` recebe um array de arrays de valores JS e atualiza um
    objeto de planilha existente. Segue o mesmo processo de `aoa_to_sheet` e
    aceita um argumento de opções:
    
    | Nome da Opção | Padrão  | Descrição                                          |
    | :------------ | :-----: | :------------------------------------------------- |
    |`dateNF`       |  FMT 14 | Usar formato de data especificado na saída de string|
    |`cellDates`    |  false  | Armazenar datas como tipo `d` (padrão é `n`)      |
    |`sheetStubs`   |  false  | Criar objetos de célula do tipo `z` para valores `null`|
    |`nullError`    |  false  | Se verdadeiro, emitir células de erro `#NULL!` para valores `null`|
    |`origin`       |         | Usar célula especificada como ponto de partida (ver abaixo)|
    
    `origin` deve ser um dos seguintes:
    
    | `origin`         | Descrição                                               |
    | :--------------- | :------------------------------------------------------ |
    | (cell object)    | Usar célula especificada (objeto de célula)            |
    | (string)         | Usar célula especificada (célula estilo A1)            |
    | (number >= 0)    | Começar da primeira coluna na linha especificada (0-indexado)|
    | -1               | Anexar ao final da planilha começando na primeira coluna|
    | (default)        | Começar da célula A1                                    |
    
    <details>
      <summary><b>Exemplos</b> (clique para mostrar)</summary>
    
    Considere a planilha:```
    XXX| A | B | C | D | E | F | G |
    ---+---+---+---+---+---+---+---+
     1 | S | h | e | e | t | J | S |
    
    ---
    
    [Read more](https://github.com/weareu/xlsx)
    
    "Writing Options"

    Gerar e tentar salvar arquivo```js XLSX.writeFile(workbook, filename, opts);

    root@kitploit:~
    O método `writeFile` empacota os dados e tenta salvar o novo arquivo.  O
    formato do arquivo de exportação é determinado pela extensão de `filename` (`SheetJS.xlsx`
    sinaliza exportação XLSX, `SheetJS.xlsb` sinaliza exportação XLSB, etc).
    
    O método `writeFile` usa APIs específicas da plataforma para iniciar o salvamento do arquivo. No
    NodeJS, `fs.readFileSync` pode criar um arquivo.  No navegador web, é tentado um
    download usando o atributo `download` do HTML5, com fallbacks para IE.
    
    _Gerar e tentar salvar um arquivo XLSX_```js
    XLSX.writeFileXLSX(workbook, filename, opts);
    

    O método writeFile incorpora várias funções de exportação diferentes. Isso é ótimo para a experiência do desenvolvedor, mas não é adequado para tree shaking usando as ferramentas de desenvolvimento atuais. Quando apenas exportações XLSX são necessárias, este método evita referenciar as outras funções de exportação.

    O segundo argumento opts é opcional. "Writing Options" cobre as propriedades e comportamentos suportados.

    Exemplos

    Arquivo local em um servidor NodeJS (clique para mostrar)

    writeFile usa fs.writeFileSync em ambientes de servidor:```js var XLSX = require("xlsx");

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

    root@kitploit:~
    Para Node ESM, o auxiliar `writeFile` não está habilitado. Em vez disso, `fs.writeFileSync` deve ser usado para escrever os dados do arquivo em um `Buffer` para uso com `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);
    
    Arquivo local em uma aplicação Deno (clique para mostrar)

    writeFile usa 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:~
    Aplicações que escrevem arquivos devem ser invocadas com a flag `--allow-write`.  A [demonstração do `deno`](https://github.com/weareu/xlsx/blob/master/demos/deno) tem mais exemplos
    
    </details>
    
    <details>
      <summary><b>Arquivo local em um plugin do PhotoShop ou InDesign</b> (clique para mostrar)</summary>
    
    `writeFile` encapsula a lógica do `File` no Photoshop e outros alvos do ExtendScript.
    O caminho especificado deve ser um caminho absoluto:```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 */
    

    O demonstrativo extendscript inclui um exemplo mais complexo.

    Baixar um arquivo no navegador para a máquina do usuário (clique para mostrar)

    XLSX.writeFile encapsula algumas técnicas para acionar o salvamento de um arquivo:

    • A API URL do navegador cria uma URL de objeto para o arquivo, que a biblioteca utiliza criando um link e forçando um clique. É suportada em navegadores modernos.
    • msSaveBlob é uma API do IE10+ para acionar o salvamento de um arquivo.
    • IE_FileSave usa VBScript e ActiveX para escrever um arquivo no IE6+ para Windows XP e Windows 7. O shim deve ser incluído na página HTML que o contém.

    Não há uma maneira padrão de determinar se o arquivo real foi baixado.```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>Baixar um arquivo em navegadores legados</b> (clique para mostrar)</summary>
    
    `XLSX.writeFile` técnicas funcionam para a maioria dos navegadores modernos, bem como para IE antigo.
    Para navegadores muito mais antigos, existem soluções alternativas implementadas por bibliotecas wrapper.
    
    [`FileSaver.js`](https://github.com/eligrey/FileSaver.js/) implementa `saveAs`.
    Nota: `XLSX.writeFile` chamará automaticamente `saveAs` se disponível.```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");
    

    Downloadify usa um botão Flash SWF para gerar arquivos locais, adequado para ambientes onde o ActiveX não está disponível:```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:~
    O [demo `oldie`](https://github.com/weareu/xlsx/blob/master/demos/oldie) mostra um cenário de fallback compatível com IE.
    
    </details>
    
    <details>
      <summary><b>Upload de arquivo pelo navegador (ajax)</b> (clique para mostrar)</summary>
    
    Um exemplo completo usando XHR está [incluído no demo XHR](https://github.com/weareu/xlsx/blob/master/demos/xhr), juntamente
    com exemplos para fetch e bibliotecas wrapper.  Este exemplo assume que o servidor
    pode lidar com arquivos codificados em Base64 (veja o demo para um servidor nodejs básico):```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);
    
    Geração de Arquivos com PhantomJS (Headless Webkit) (click to show)

    A demonstração headless inclui uma demonstração completa para converter arquivos HTML em pastas de trabalho XLSB usando PhantomJS. O PhantomJS fs.write suporta a escrita de arquivos a partir do processo principal, mas possui uma interface diferente do módulo fs do 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:~
    Note: A seção ["Processamento de Tabelas HTML"](#processing-html-tables) mostra como
    gerar uma pasta de trabalho a partir de tabelas HTML em uma página no "Headless WebKit".
    
    </details>
    
    
    
    Os [demos incluídos](https://github.com/weareu/xlsx/blob/master/demos) cobrem aplicativos móveis e outras implantações especiais.
    
    ### Exemplos de Escrita
    
    - <http://sheetjs.com/demos/table.html> exportando uma tabela HTML
    - <http://sheetjs.com/demos/writexlsx.html> gera um arquivo simples
    
    ### Escrita em Streaming
    
    As funções de escrita em streaming estão disponíveis no objeto `XLSX.stream`. Elas
    recebem os mesmos argumentos que as funções normais de escrita, mas retornam um
    Stream Legível do NodeJS.
    
    - `XLSX.stream.to_csv` é a versão em streaming de `XLSX.utils.sheet_to_csv`.
    - `XLSX.stream.to_html` é a versão em streaming de `XLSX.utils.sheet_to_html`.
    - `XLSX.stream.to_json` é a versão em streaming de `XLSX.utils.sheet_to_json`.
    
    <details>
      <summary><b>converter nodejs para CSV e escrever arquivo</b> (clique 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 escrever fluxo JSON para a tela (clique 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>Exportando arquivos NUMBERS</b> (clique para mostrar)</summary>
    
    O escritor NUMBERS requer uma base bastante grande.  Os scripts suplementares `xlsx.zahl`
    fornecem suporte.  `xlsx.zahl.js` é projetado para uso standalone e NodeJS
    uso, enquanto `xlsx.zahl.mjs` é adequado 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>
    

    Nó```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 encaminha streams de escrita para a resposta do nodejs.

    Gerando dados JSON e JS

    Dados JSON e JS tendem a representar planilhas individuais. As funções utilitárias nesta seção funcionam com planilhas individuais.

    A seção "Formato Comum de Planilha" descreve a estrutura do objeto em mais detalhes. workbook.SheetNames é uma lista ordenada dos nomes das planilhas. workbook.Sheets é um objeto cujas chaves são os nomes das planilhas e cujos valores são os objetos das planilhas.

    A "primeira planilha" está armazenada em workbook.Sheets[workbook.SheetNames[0]].

    API

    Cria um array de objetos JS a partir de uma planilha```js var jsa = XLSX.utils.sheet_to_json(worksheet, opts);

    root@kitploit:~
    _Criar uma matriz de arrays de valores JS a partir de uma planilha_```js
    var aoa = XLSX.utils.sheet_to_json(worksheet, {...opts, header: 1});
    

    A função utilitária sheet_to_json percorre uma pasta de trabalho em ordem de linha principal, gerando uma matriz de objetos. O segundo argumento opts controla várias decisões de exportação, incluindo o tipo de valores (valores JS ou texto formatado). A seção "JSON" descreve o argumento em mais detalhes.

    Por padrão, sheet_to_json examina a primeira linha e usa os valores como cabeçalhos. Com a opção header: 1, a função exporta uma matriz de matrizes de valores.

    Exemplos

    x-spreadsheet é uma grade de dados interativa para pré-visualizar e modificar dados estruturados no navegador. A demonstração xspreadsheet inclui um script de exemplo com a função stox para converter de uma pasta de trabalho para o objeto de dados do x-spreadsheet. https://oss.sheetjs.com/sheetjs/x-spreadsheet é uma demonstração ao vivo.

    Pré-visualizando dados em uma grade de dados React (clique para mostrar)

    react-data-grid é uma grade de dados adaptada para o React. Ela espera duas propriedades: rows de objetos de dados e columns que descrevem as colunas. Para fins de ajustar os dados à API da grade de dados React, é mais fácil começar com uma matriz de matrizes.

    Esta demonstração começa buscando um arquivo remoto e usando XLSX.read para extrair:```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>Visualizando dados em uma grade de dados VueJS</b> (clique para mostrar)</summary>
    
    [`vue3-table-lite`](https://github.com/linmasahiro/vue3-table-lite) é uma tabela
    de dados simples do VueJS 3. Ela é apresentada [no demo VueJS](https://github.com/weareu/xlsx/blob/master/demos/vue/modify).
    
    </details>
    
    <details>
      <summary><b>Preenchendo um banco de dados (SQL ou no-SQL)</b> (clique para mostrar)</summary>
    
    O [`database` demo](https://github.com/weareu/xlsx/blob/master/demos/database) inclui exemplos de trabalho com bancos de
    dados e resultados de consultas.
    
    </details>
    
    <details>
      <summary><b>Computações Numéricas com TensorFlow.js</b> (clique para mostrar)</summary>
    
    [`@tensorflow/tfjs`](https://github.com/weareu/xlsx/blob/master/%40tensorflow/tfjs) e outras bibliotecas esperam dados em
    arrays simples, bem adequados para planilhas onde cada coluna é um vetor de
    dados. Essa é a transposição de como a maioria das pessoas usa planilhas, onde
    cada linha é um vetor.
    
    Um único `Array#map` pode extrair linhas nomeadas individuais da exportação
    `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);
    

    Todos os campos podem ser processados de uma vez usando uma transposição do tensor 2D gerado com a exportação sheet_to_json com header: 1. A primeira linha, se contiver rótulos de cabeçalho, deve ser removida com um 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:~
    O [`array` demo](https://github.com/weareu/xlsx/blob/master/demos/array) mostra um exemplo completo.
    
    </details>
    
    ### Gerando Tabelas HTML
    
    **API**
    
    _Gerar Tabela HTML a partir da Planilha_```js
    var html = XLSX.utils.sheet_to_html(worksheet);
    

    A função utilitária sheet_to_html gera código HTML com base nos dados da planilha. Cada célula da planilha é mapeada para um elemento <TD>. Células mescladas na planilha são serializadas definindo os atributos colspan e rowspan.

    Exemplos

    A função utilitária sheet_to_html gera código HTML que pode ser adicionado a qualquer elemento DOM definindo o innerHTML:```js var container = document.getElementById("tavolo"); container.innerHTML = XLSX.utils.sheet_to_html(worksheet);

    root@kitploit:~
    Combinando com `fetch`, construir um site a partir de um workbook é direto:
    
    <details>
      <summary><b>Vanilla JS + HTML fetch workbook and generate table previews</b> (clique 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>
    
    Buscar workbook com React e gerar visualizações de tabela HTML (clique para mostrar)

    Geralmente, é recomendado usar um fluxo de trabalho amigável ao React, mas é possível gerar HTML e usá-lo no React com 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:~
    The [`react` demo](https://github.com/weareu/xlsx/blob/master/demos/react) inclui mais exemplos de React.
    
    </details>
    
    <details>
      <summary><b>VueJS buscar workbook e gerar prévias de tabela HTML</b> (clique para mostrar)</summary>
    
    É geralmente recomendado usar um workflow amigável ao VueJS, mas é possível
    gerar HTML e utilizá-lo no VueJS com a diretiva `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>`
    };
    

    O demos vuejs inclui mais exemplos de React.

    Gerando Snapshots de Uma Única Planilha

    As funções sheet_to_* aceitam um objeto de planilha.

    API

    Gerar um CSV a partir de uma única planilha```js var csv = XLSX.utils.sheet_to_csv(worksheet, opts);

    root@kitploit:~
    Esta captura instantânea foi projetada para replicar o tipo de saída "CSV UTF8 (`.csv`)".
    ["Saída Separada por Delimitador"](#delimiter-separated-output) descreve a
    função e o argumento opcional `opts` em mais detalhes.
    
    _Gerar "Texto" a partir de uma única planilha_```js
    var txt = XLSX.utils.sheet_to_txt(worksheet, opts);
    

    Esta captura foi projetada para replicar o tipo de saída "Texto UTF16 (.txt)". "Saída Separada por Delimitadores" descreve a função e o argumento opts opcional em mais detalhes.

    Gerar uma lista de fórmulas a partir de uma única planilha```js var fmla = XLSX.utils.sheet_to_formulae(worksheet);

    root@kitploit:~
    Este instantâneo gera um array de entradas representando as fórmulas incorporadas. As fórmulas de matriz são renderizadas na forma `range=formula` enquanto células comuns são renderizadas na forma `cell=formula or value`.  Literais de string são prefixados com um apóstrofo `'`, consistente com a exibição da barra de fórmulas do Excel.
    
    ["Saída de Fórmulas"](#formulae-output) descreve a função em mais detalhes.
    
    ## Interface
    
    `XLSX` é a variável exposta no navegador e a variável exportada do Node
    
    `XLSX.version` é a versão da biblioteca (adicionada pelo script de compilação).
    
    `XLSX.SSF` é uma versão embutida da [biblioteca de formato](https://git.io/ssf).
    
    ### Funções de análise
    
    `XLSX.read(data, read_opts)` tenta analisar `data`.
    
    `XLSX.readFile(filename, read_opts)` tenta ler `filename` e analisar.
    
    As opções de análise são descritas na seção [Opções de Análise](#parsing-options).
    
    ### Funções de escrita
    
    `XLSX.write(wb, write_opts)` tenta escrever a pasta de trabalho `wb`
    
    `XLSX.writeFile(wb, filename, write_opts)` tenta escrever `wb` em `filename`. Em ambientes baseados em navegador, tentará forçar um download no lado do cliente.
    
    `XLSX.writeFileAsync(wb, filename, o, cb)` tenta escrever `wb` em `filename`. Se `o` for omitido, o escritor usará o terceiro argumento como callback.
    
    `XLSX.stream` contém um conjunto de funções de escrita em fluxo.
    
    As opções de escrita são descritas na seção [Opções de Escrita](#writing-options).
    
    ### Utilitários
    
    Utilitários estão disponíveis no objeto `XLSX.utils` e são descritos na seção [Funções Utilitárias](#utility-functions):
    
    **Construção:**
    
    - `book_new` cria uma pasta de trabalho vazia
    - `book_append_sheet` adiciona uma planilha a uma pasta de trabalho
    
    **Importação:**
    
    - `aoa_to_sheet` converte um array de arrays de dados JS em uma planilha.
    - `json_to_sheet` converte um array de objetos JS em uma planilha.
    - `table_to_sheet` converte um elemento DOM TABLE em uma planilha.
    - `sheet_add_aoa` adiciona um array de arrays de dados JS a uma planilha existente.
    - `sheet_add_json` adiciona um array de objetos JS a uma planilha existente.
    
    **Exportação:**
    
    - `sheet_to_json` converte um objeto de planilha em um array de objetos JSON.
    - `sheet_to_csv` gera saída de valores separados por delimitador.
    - `sheet_to_txt` gera texto formatado em UTF16.
    - `sheet_to_html` gera saída HTML.
    - `sheet_to_formulae` gera uma lista das fórmulas (com fallbacks de valor).
    
    **Manipulação de células e endereços de células:**
    
    - `format_cell` gera o valor de texto para uma célula (usando formatos de número).
    - `encode_row / decode_row` converte entre linhas indexadas em 0 e linhas indexadas em 1.
    - `encode_col / decode_col` converte entre colunas indexadas em 0 e nomes de colunas.
    - `encode_cell / decode_cell` converte endereços de células.
    - `encode_range / decode_range` converte intervalos de células.
    
    ## Formato Comum de Planilha
    
    SheetJS está em conformidade com o Formato Comum de Planilha (CSF):
    
    ### Estruturas Gerais
    
    Os objetos de endereço de célula são armazenados como `{c:C, r:R}` onde `C` e `R` são números de coluna e linha indexados em 0, respectivamente.  Por exemplo, o endereço de célula `B5` é representado pelo objeto `{c:1, r:4}`.
    
    Os objetos de intervalo de células são armazenados como `{s:S, e:E}` onde `S` é a primeira célula e `E` é a última célula no intervalo.  Os intervalos são inclusivos.  Por exemplo, o intervalo `A3:B7` é representado pelo objeto `{s:{c:0, r:2}, e:{c:1, r:6}}`.
    As funções utilitárias realizam uma travessia em ordem principal de linha de um intervalo de planilha:```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);
      }
    }
    

    Objeto Cell

    Os objetos Cell são objetos JS simples com chaves e valores seguindo a convenção:

    KeyDescription
    vraw value (see Data Types section for more info)
    wformatted text (if applicable)
    ttype: b Boolean, e Error, n Number, d Date, s Text, z Stub
    fcell formula encoded as an A1-style string (if applicable)
    Frange of enclosing array if formula is array formula (if applicable)
    Dif true, array formula is dynamic (if applicable)
    rrich text encoding (if applicable)
    hHTML rendering of the rich text (if applicable)
    ccomments associated with the cell
    znumber format string associated with the cell (if requested)
    lcell hyperlink object (.Target holds link, .Tooltip is tooltip)
    sthe style/theme of the cell (if applicable)

    As utilidades de exportação integradas (como o exportador CSV) usarão o texto w se estiver disponível. Para alterar um valor, certifique-se de excluir cell.w (ou defina-o como undefined) antes de tentar exportar. As utilidades regenerarão o texto w a partir do formato de número (cell.z) e do valor bruto, se possível.

    A fórmula de matriz real é armazenada no campo f da primeira célula no intervalo da matriz. As outras células no intervalo omitirão o campo f.

    Tipos de Dados

    O valor bruto é armazenado na propriedade de valor v, interpretado com base na propriedade de tipo t. Esta separação permite a representação de números, bem como texto numérico. Existem 6 tipos de célula válidos:

    TypeDescription
    bBoolean: value interpreted as JS boolean
    eError: value is a numeric code and w property stores common name **
    nNumber: value is a JS number **
    dDate: value is a JS Date object or string to be parsed as Date **
    sText: value interpreted as JS string and written as text **
    zStub: blank stub cell that is ignored by data processing utilities **
    Valores de erro e interpretação (clique para mostrar)
    ValueError Meaning
    0x00#NULL!
    0x07#DIV/0!
    0x0F#VALUE!
    0x17#REF!
    0x1D#NAME?
    0x24#NUM!
    0x2A#N/A
    0x2B#GETTING_DATA

    O tipo n é o tipo Number. Isso inclui todas as formas de dados que o Excel armazena como números, como datas/horas e campos Booleanos. O Excel usa exclusivamente dados que podem ser ajustados em um número de ponto flutuante IEEE754, assim como o Number do JS, então o campo v contém o número bruto. O campo w contém texto formatado. As datas são armazenadas como números por padrão e convertidas com XLSX.SSF.parse_date_code.

    O tipo d é o tipo Date, gerado apenas quando a opção cellDates é passada. Como o JSON não possui um tipo Date natural, espera-se que os parsers armazenem strings de Data ISO 8601, como você obteria de date.toISOString(). Por outro lado, escritores e exportadores devem ser capazes de lidar com strings de data e objetos Date do JS. Observe que o Excel desconsidera modificadores de fuso horário e trata todas as datas no fuso horário local. A biblioteca não corrige este erro.

    O tipo s é o tipo String. Os valores são explicitamente armazenados como texto. O Excel interpretará essas células como "número armazenado como texto". Os arquivos Excel gerados suprimem automaticamente essa classe de erro, mas outros formatos podem provocar erros.

    O tipo z representa células de stub em branco. Elas são geradas em casos onde as células não têm valor atribuído, mas contêm comentários ou outros metadados. Elas são ignoradas pelas funções utilitárias de processamento de dados da biblioteca principal. Por padrão, essas células não são geradas; a opção sheetStubs do parser deve ser definida como true.

    Datas

    Detalhes do código de data do Excel (clique para mostrar)

    Por padrão, o Excel armazena datas como números com um código de formato que especifica o processamento da data. Por exemplo, a data 19-Feb-17 é armazenada como o número 42785 com um formato de número d-mmm-yy. O módulo SSF entende formatos de número e realiza a conversão apropriada.

    O XLSX também suporta um tipo de data especial d onde os dados são uma string de data ISO 8601. O formatador converte a data de volta para um número.

    O comportamento padrão para todos os parsers é gerar células numéricas. Definir cellDates como true forçará os geradores a armazenar datas.

    Fusos Horários e Datas (clique para mostrar)

    O Excel não possui um conceito nativo de tempo universal. Todos os horários são especificados no fuso horário local. As limitações do Excel impedem a especificação de datas verdadeiramente absolutas.

    Seguindo o Excel, esta biblioteca trata todas as datas como relativas ao fuso horário local.

    Épocas: 1900 e 1904 (clique para mostrar)

    O Excel suporta duas épocas (1 de Janeiro de 1900 e 1 de Janeiro de 1904). A época da pasta de trabalho pode ser determinada examinando a propriedade wb.Workbook.WBProps.date1904 da pasta de trabalho:```js !!(((wb.Workbook||{}).WBProps||{}).date1904)

    root@kitploit:~
    </details>
    
    ### Objetos de Planilha
    
    Cada chave que não começa com `!` mapeia para uma célula (usando a notação `A-1`)
    
    `sheet[address]` retorna o objeto de célula para o endereço especificado.
    
    **Chaves especiais de planilha (acessíveis como `sheet[key]`, cada uma iniciando com `!`):**
    
    - `sheet['!ref']`: intervalo baseado em A-1 representando o intervalo da planilha. Funções que trabalham com planilhas devem usar este parâmetro para determinar o intervalo. Células atribuídas fora do intervalo não são processadas. Em particular, ao escrever uma planilha manualmente, células fora do intervalo não são incluídas.
    
      Funções que manipulam planilhas devem verificar a presença do campo `!ref`. Se `!ref` for omitido ou não for um intervalo válido, as funções podem tratar a planilha como vazia ou tentar adivinhar o intervalo. As utilidades padrão que acompanham esta biblioteca tratam planilhas como vazias (por exemplo, a saída CSV é uma string vazia).
    
      Ao ler uma planilha com a propriedade `sheetRows` definida, o parâmetro ref usará o intervalo restrito. O intervalo original é definido em `ws['!fullref']`.
    
    - `sheet['!margins']`: Objeto representando as margens da página. Os valores padrão seguem o predefinido "normal" do Excel. O Excel também tem predefinições "wide" e "narrow", mas são armazenadas como medidas brutas. As principais propriedades estão listadas abaixo:
    
    <details>
      <summary><b>Detalhes das margens da página</b> (clique para mostrar)</summary>
    
    | key      | description                     | "normal" | "wide" | "narrow" |
    |----------|---------------------------------|:---------|:-------|:-------- |
    | `left`   | margem esquerda (polegadas)     | `0.7`    | `1.0`  | `0.25`   |
    | `right`  | margem direita (polegadas)      | `0.7`    | `1.0`  | `0.25`   |
    | `top`    | margem superior (polegadas)     | `0.75`   | `1.0`  | `0.75`   |
    | `bottom` | margem inferior (polegadas)     | `0.75`   | `1.0`  | `0.75`   |
    | `header` | margem do cabeçalho (polegadas) | `0.3`    | `0.5`  | `0.3`    |
    | `footer` | margem do rodapé (polegadas)    | `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 Worksheet

    Além das chaves básicas da folha, as planilhas também adicionam:

    • ws['!cols']: array de objetos de propriedades de coluna. As larguras das colunas são na verdade armazenadas em arquivos de maneira normalizada, medidas em termos da "Largura Máxima de Dígito" (a maior largura dos dígitos renderizados 0-9, em pixels). Quando analisados, os objetos de coluna armazenam a largura em pixels no campo wpx, a largura de caracteres no campo wch e a largura máxima de dígito no campo MDW.

    • ws['!rows']: array de objetos de propriedades de linha conforme explicado posteriormente na documentação. Cada objeto de linha codifica propriedades incluindo altura da linha e visibilidade.

    • ws['!merges']: array de objetos de intervalo correspondentes às células mescladas na planilha. Formatos de texto simples não suportam células mescladas. A exportação CSV escreverá todas as células no intervalo mesclado se existirem, portanto, certifique-se de que apenas a primeira célula (superior esquerda) no intervalo esteja definida.

    • ws['!outline']: configura como os contornos devem se comportar. As opções padrão são as configurações padrão do Excel 2019:

    chaveRecurso do Excelpadrão
    aboveDesmarcar "Linhas de resumo abaixo dos detalhes"false
    leftDesmarcar "Linhas de resumo à direita dos detalhes"false
    • ws['!protect']: objeto de propriedades de proteção de gravação da planilha. A chave password especifica a senha para formatos que suportam planilhas protegidas por senha (XLSX/XLSB/XLS). O escritor utiliza o método de ofuscação XOR. As seguintes chaves controlam a proteção da planilha -- defina como false para ativar um recurso quando a planilha estiver bloqueada ou true para desativar um recurso:
    Detalhes da Proteção da Planilha (clique para mostrar)
    chaverecurso (true=desabilitado / false=habilitado)padrão
    selectLockedCellsSelecionar células bloqueadashabilitado
    selectUnlockedCellsSelecionar células desbloqueadashabilitado
    formatCellsFormatar célulasdesabilitado
    formatColumnsFormatar colunasdesabilitado
    formatRowsFormatar linhasdesabilitado
    insertColumnsInserir colunasdesabilitado
    insertRowsInserir linhasdesabilitado
    insertHyperlinksInserir hiperlinksdesabilitado
    deleteColumnsExcluir colunasdesabilitado
    deleteRowsExcluir linhasdesabilitado
    sortClassificardesabilitado
    autoFilterFiltrardesabilitado
    pivotTablesUsar relatórios de Tabela Dinâmicadesabilitado
    objectsEditar objetoshabilitado
    scenariosEditar cenárioshabilitado
    • ws['!autofilter']: objeto AutoFilter seguindo o esquema:```typescript type AutoFilter = { ref:string; // A-1 based range representing the AutoFilter table range }
    root@kitploit:~
    #### Chartsheet Object
    
    Os Chartsheets são representados como planilhas padrão. Eles são distinguidos pela propriedade `!type` definida como `"chart"`.
    
    Os dados subjacentes e `!ref` referem-se aos dados em cache na chartsheet. A primeira linha da chartsheet é o cabeçalho subjacente.
    
    #### Macrosheet Object
    
    Os Macrosheets são representados como planilhas padrão. Eles são distinguidos pela propriedade `!type` definida como `"macro"`.
    
    #### Dialogsheet Object
    
    Os Dialogsheets são representados como planilhas padrão. Eles são distinguidos pela propriedade `!type` definida como `"dialog"`.
    
    ### Workbook Object
    
    `workbook.SheetNames` é uma lista ordenada das planilhas no workbook
    
    `wb.Sheets[sheetname]` retorna um objeto que representa a planilha.
    
    `wb.Props` é um objeto que armazena as propriedades padrão. `wb.Custprops` armazena propriedades personalizadas. Como as propriedades padrão do XLS desviam do padrão XLSX, a análise do XLS armazena as propriedades principais em ambos os lugares.
    
    `wb.Workbook` armazena [atributos de nível de workbook](#workbook-level-attributes).
    
    #### Workbook File Properties
    
    Os vários formatos de arquivo usam nomes internos diferentes para propriedades de arquivo. O objeto `Props` do workbook normaliza os nomes:
    
    <details>
      <summary><b>Propriedades do Arquivo</b> (clique para mostrar)</summary>
    
    | JS Name       | Excel Description              |
    |:--------------|:-------------------------------|
    | `Title`       | Aba Resumo "Título"            |
    | `Subject`     | Aba Resumo "Assunto"          |
    | `Author`      | Aba Resumo "Autor"           |
    | `Manager`     | Aba Resumo "Gerente"          |
    | `Company`     | Aba Resumo "Empresa"          |
    | `Category`    | Aba Resumo "Categoria"         |
    | `Keywords`    | Aba Resumo "Palavras-chave"         |
    | `Comments`    | Aba Resumo "Comentários"         |
    | `LastAuthor`  | Aba Estatísticas "Último Salvamento por" |
    | `CreatedDate` | Aba Estatísticas "Criada"       |
    
    </details>
    
    Por exemplo, para definir a propriedade de título do workbook:```js
    if(!wb.Props) wb.Props = {};
    wb.Props.Title = "Insert Title Here";
    

    Propriedades personalizadas são adicionadas no workbook Custprops objeto:```js if(!wb.Custprops) wb.Custprops = {}; wb.Custprops["Custom Property"] = "Custom Value";

    root@kitploit:~
    Writers processará a chave `Props` do objeto de opções:```js
    /* force the Author to be "SheetJS" */
    XLSX.write(wb, {Props:{Author:"SheetJS"}});
    

    Atributos no Nível da Pasta de Trabalho

    wb.Workbook armazena atributos no nível da pasta de trabalho.

    Nomes Definidos

    wb.Workbook.Names é um array de objetos de nomes definidos que possuem as chaves:

    Propriedades dos Nomes Definidos (clique para mostrar)
    KeyDescrição
    SheetEscopo do nome. Índice da Planilha (0 = primeira planilha) ou null (Pasta de trabalho)
    NameNome sensível a maiúsculas/minúsculas. Regras padrão se aplicam **
    RefReferência no estilo A1 ("Sheet1!$A$1:$D$20")
    CommentComentário (aplicável apenas para XLS/XLSX/XLSB)

    O Excel permite que dois nomes definidos com escopo de planilha compartilhem o mesmo nome. No entanto, um nome com escopo de planilha não pode colidir com um nome com escopo de pasta de trabalho. Os escritores de pastas de trabalho podem não impor essa restrição.

    Visualizações da Pasta de Trabalho

    wb.Workbook.Views é um array de objetos de visualização da pasta de trabalho que possuem as chaves:

    KeyDescrição
    RTLSe verdadeiro, exibe da direita para a esquerda

    Propriedades Diversas da Pasta de Trabalho

    wb.Workbook.WBProps contém outras propriedades da pasta de trabalho:

    KeyDescrição
    CodeNameNome do Código da Pasta de Trabalho do Projeto VBA
    date1904época: 0/falso para sistema 1900, 1/verdadeiro para 1904
    filterPrivacyAvisar ou remover informações de identificação pessoal ao salvar

    Recursos do Documento

    Mesmo para recursos básicos como armazenamento de datas, os formatos oficiais do Excel armazenam o mesmo conteúdo de maneiras diferentes. Espera-se que os parsers convertam da representação do formato de arquivo subjacente para o Common Spreadsheet Format. Espera-se que os escritores convertam do CSF de volta para o formato de arquivo subjacente.

    Fórmulas

    A string de fórmula no estilo A1 é armazenada no campo f. Embora diferentes formatos de arquivo armazenem as fórmulas de maneiras diferentes, os formatos são traduzidos. Embora alguns formatos armazenem fórmulas com um sinal de igual inicial, as fórmulas CSF não começam com =.

    Suporte a Formatos de Arquivo de Fórmulas (clique para mostrar)
    Representação de ArmazenamentoFormatosLeituraEscrita
    Strings no estilo A1XLSX✔✔
    Strings no estilo RCXLML e texto simples✔✔
    Fórmulas analisadas BIFFXLSB e todos os formatos XLS✔
    Fórmulas OpenFormulaODS/FODS/UOS✔✔
    Fórmulas analisadas LotusTodos os formatos Lotus WK_✔

    Como o Excel proíbe que células nomeadas colidam com nomes de referências de células no estilo A1 ou RC, uma conversão de regex (não tão simples) é possível. As fórmulas analisadas BIFF e as fórmulas analisadas Lotus precisam ser explicitamente desenroladas. As fórmulas OpenFormula podem ser convertidas com expressões regulares.

    As fórmulas compartilhadas são descomprimidas e cada célula tem a fórmula correspondente à sua célula. Os escritores geralmente não tentam gerar fórmulas compartilhadas.

    Fórmulas de Célula Única

    Para fórmulas simples, a chave f da célula desejada pode ser definida como o texto real da fórmula. Esta planilha representa A1=1, A2=2 e A3=A1+A2:```js var worksheet = { "!ref": "A1:A3", A1: { t:'n', v:1 }, A2: { t:'n', v:2 }, A3: { t:'n', v:3, f:'A1+A2' } };

    root@kitploit:~
    Utilitários como `aoa_to_sheet` aceitarão objetos de célula em vez de valores:```js
    var worksheet = XLSX.utils.aoa_to_sheet([
      [ 1 ], // A1
      [ 2 ], // A2
      [ {t: "n", v: 3, f: "A1+A2"} ] // A3
    ]);
    

    Células com entradas de fórmula, mas sem valor, serão serializadas de uma forma que o Excel e outras ferramentas de planilha reconhecerão. Esta biblioteca não calculará automaticamente os resultados das fórmulas! Por exemplo, a seguinte planilha incluirá a função BESSELJ, mas o resultado não estará disponível em JavaScript:```js var worksheet = XLSX.utils.aoa_to_sheet([ [ 3.14159, 2 ], // Row "1" [ { t:'n', f:'BESSELJ(A1,B1)' } ] // Row "2" will be calculated on file open }

    root@kitploit:~
    Se os resultados reais forem necessários em JS, o [SheetJS Pro](https://sheetjs.com/pro) oferece um componente de calculadora de fórmulas para avaliar expressões, atualizar valores e células dependentes e atualizar pastas de trabalho inteiras.
    
    **Fórmulas de Matriz**
    
    _Atribuir uma fórmula de matriz_```js
    XLSX.utils.sheet_set_array_formula(worksheet, range, formula);
    

    Fórmulas de matriz são armazenadas na célula superior esquerda do bloco de matriz. Todas as células de uma fórmula de matriz possuem um campo F correspondente ao intervalo. Uma fórmula de uma única célula pode ser distinguida de uma fórmula simples pela presença do campo F.

    Por exemplo, definindo a célula C1 para a 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 uma fórmula de matriz de várias células, cada célula tem o mesmo intervalo de matriz, mas apenas a primeira célula especifica a fórmula. Considere `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" };
    

    Espera-se que utilitários e escritores verifiquem a presença de um campo F e ignorem qualquer possível elemento de fórmula f em células que não sejam a célula inicial. Não se espera que eles realizem validação das fórmulas!

    Fórmulas de Matriz Dinâmica

    Atribuir uma fórmula de matriz dinâmica```js XLSX.utils.sheet_set_array_formula(worksheet, range, formula, true);

    root@kitploit:~
    Lançadas em 2020, as Fórmulas de Matriz Dinâmica são suportadas nos formatos de arquivo XLSX/XLSM e XLSB. Elas são representadas como fórmulas de matriz normais, mas possuem metadados especiais de célula indicando que a fórmula deve poder ajustar o intervalo.
    
    Uma fórmula de matriz pode ser marcada como dinâmica definindo a propriedade `D` da célula como true. O intervalo `F` é esperado, mas pode ser definido como a célula atual:```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
    

    Localização com Nomes de Funções

    O SheetJS opera ao nível do arquivo. O Excel armazena expressões de fórmula usando os nomes de funções em inglês (Estados Unidos). Para usuários não-ingleses, o Excel usa um conjunto localizado de nomes de funções.

    Por exemplo, quando o idioma e região do computador estão definidos como Francês (França), o Excel interpreta =SOMME(A1:C3) como se SOMME fosse a função SUM. No entanto, no arquivo real, o Excel armazena SUM(A1:C3).

    "Funções Futuras" Prefixadas

    Funções introduzidas em versões mais recentes do Excel são prefixadas com _xlfn. quando armazenadas em arquivos. Ao escrever expressões de fórmula usando essas funções, o prefixo é necessário para máxima compatibilidade:```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:~
    When reading a file, the `xlfn` option preserves the prefixes.
    
    <details>
      <summary><b> Funções que exigem o prefixo `_xlfn.`</b> (clique para mostrar)</summary>
    
    Esta lista está a crescer a cada lançamento do 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
    
    IDFormat
    0General
    10
    20.00
    3#,##0
    4#,##0.00
    90%
    100.00%
    110.00E+00
    12# ?/?
    13# ??/??
    14m/d/yy (veja abaixo)
    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#,##0.00;[Red](#,##0.00)
    45mm:ss
    46[h]:mm:ss
    47mmss.0
    48##0.0E+0
    49@
    bookFilesfalseSe true, adiciona arquivos brutos ao objeto book **
    bookPropsfalseSe true, apenas analisa o suficiente para obter metadados do book **
    bookSheetsfalseSe true, apenas analisa o suficiente para obter os nomes das folhas
    bookVBAfalseSe true, copia blob VBA para o campo vbaraw **
    password""Se definido e o arquivo estiver criptografado, usa a senha **
    WTFfalseSe true, lança erros em características inesperadas do arquivo **
    sheetsSe especificado, apenas analisa as folhas especificadas **
    PRNfalseSe true, permite análise de arquivos PRN **
    xlfnfalseSe true, preserva prefixos _xlfn. em fórmulas **
    FSSubstituição do Separador de Campo DSV
    FormatoTeste
    XML<?xml aparece nos primeiros 1024 caracteres
    HTMLcomeça com < e tags HTML aparecem nos primeiros 1024 caracteres *
    XMLcomeça com < e a primeira tag é válida
    RTFcomeça com {\rt
    DSVcomeça com /sep=.$/, o separador é o caractere especificado
    DSVmais caracteres `
    DSVmais caracteres ; não citados do que \t ou , nos primeiros 1024
    TSVmais caracteres \t não citados do que , nos primeiros 1024
    CSVum dos primeiros 1024 caracteres é uma vírgula ","
    ETHcomeça com socialcalc:version:
    PRNa opção PRN está definida como true
    CSV(fallback)
    Nome da OpçãoPadrãoDescrição
    dateNFFMT 14Usar formato de data especificado na saída de string
    cellDatesfalseArmazenar datas como tipo d (padrão é n)
    sheetStubsfalseCriar objetos de célula do tipo z para valores null
    nullErrorfalseSe verdadeiro, emitir células de erro #NULL! para valores null