Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
xlsx — SheetJS xlsx 0.18.5 fork with CVE-2023-30533 and CVE-2024-22363 fixes | Kitploit
Инструменты/GitHubGitHub/weareu/xlsx
General Purpose UtilitiesEncryption/Decryption ToolsData RecoveryUtilities & Frameworks
GitHubweareu/xlsx

xlsx

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

Репозиторий
6 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

SheetJS

Редакция SheetJS Community Edition предлагает проверенные в бою решения с открытым исходным кодом для извлечения полезных данных из практически любых сложных электронных таблиц и создания новых таблиц, которые будут работать как с устаревшим, так и с современным программным обеспечением.

SheetJS Pro предлагает решения, выходящие за рамки обработки данных: легко редактируйте сложные шаблоны; дайте волю своему внутреннему Пикассо с помощью стилей; создавайте пользовательские листы с изображениями, графиками и сводными таблицами; вычисляйте формулы и переносите расчёты в веб-приложения; автоматизируйте обычные задачи работы с таблицами и многое другое!

License Build Status Snyk Vulnerabilities npm Downloads Analytics

Матрица тестов и поддержки браузеров

Build Status

Поддерживаемые форматы файлов

График circo поддержки форматов

Легенда графика

Содержание

Развернуть, чтобы показать содержание
  • Начало работы
    • Установка
    • Использование
    • Дзен SheetJS
    • Демонстрации экосистемы JS
  • Получение и извлечение данных
    • Разбор книг
    • Обработка JSON и JS данных
    • Обработка HTML-таблиц
  • Обработка данных
    • Изменение структуры книги
    • Изменение значений ячеек
    • Изменение других свойств листа / книги / ячейки
  • Упаковка и выпуск данных
    • Запись книг
    • Примеры записи
    • Потоковая запись
    • Генерация JSON и JS данных
    • Генерация HTML-таблиц
    • Генерация снимков одного листа
  • Интерфейс
    • Функции разбора
    • Функции записи
    • Утилиты
  • Общий формат электронных таблиц
    • Общие структуры
    • Объект ячейки
      • Типы данных
      • Даты
    • Объекты листов
      • Объект листа
      • Объект диаграммы
      • Объект макроса
      • Объект диалога
    • Объект книги
      • Свойства файла книги

Начало работы

Установка

Автономные скрипты для браузера

Полная автономная сборка для браузера сохраняется в dist/xlsx.full.min.js и может быть напрямую добавлена на страницу с помощью тега script:```html

root@kitploit:~
<details>
  <summary><b>Доступность CDN</b> (нажмите, чтобы показать)</summary>

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

Например, `unpkg` предоставляет последнюю версию по адресу:```html
<script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script>
Сборки для браузера (нажмите, чтобы показать)

Полная однофайловая версия создаётся в dist/xlsx.full.min.js

dist/xlsx.core.min.js не включает библиотеку кодовых страниц (без поддержки кодировок XLS)

Более компактная сборка создаётся в dist/xlsx.mini.min.js. По сравнению с полной сборкой:

  • библиотека кодовых страниц пропущена (без поддержки кодировок XLS)
  • нет поддержки XLSB / XLS / Lotus 1-2-3 / SpreadsheetML 2003 / Numbers
  • утилиты потоков Node удалены

С помощью bower:```bash $ bower install js-xlsx

root@kitploit:~
**Модули ECMAScript**

Сборка модуля ECMAScript сохраняется в `xlsx.mjs` и может быть напрямую добавлена на страницу с помощью тега `script` с атрибутом `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>

Этот npm-пакет также предоставляет модуль с параметром module, поддерживаемый в Angular и других проектах:```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` можно импортировать в Deno.  Он доступен на `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

С помощью npm:```bash $ npm install xlsx

root@kitploit:~
По умолчанию модуль поддерживает `require`:```js
var XLSX = require("xlsx");

Модуль также поставляется с xlsx.mjs для использования с 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 и InDesign**

`dist/xlsx.extendscript.js` — это сборка ExtendScript для Photoshop и InDesign, которая включена в пакет `npm`. На неё можно напрямую ссылаться с помощью директивы `#include`:```extendscript
#include "xlsx.extendscript.js"
Совместимость с Internet Explorer и ECMAScript 3 (нажмите, чтобы показать)

Для широкой совместимости с JavaScript-движками библиотека написана с использованием диалекта языка ECMAScript 3, а также некоторых функций ES5, таких как Array#forEach. Старые браузеры требуют шаймов (shim) для предоставления недостающих функций.

Чтобы использовать шайм, добавьте шайм перед тегом скрипта, который загружает xlsx.js:

```html ``` Скрипт также включает `IE_LoadFile` и `IE_SaveFile` для загрузки и сохранения файлов в Internet Explorer версий 6-9. Скрипт `xlsx.extendscript.js` собирает обёртку (shim) в формате, подходящем для Photoshop и других продуктов Adobe.

Использование

Большинство сценариев работы с электронными таблицами и данными можно разбить на 5 частей:

  1. Получение данных: Данные могут храниться где угодно: локальные или удаленные файлы, базы данных, HTML TABLE или даже генерироваться программно в веб-браузере.

  2. Извлечение данных: Для файлов электронных таблиц это включает разбор сырых байтов для чтения данных ячеек. Для обычных JS-данных это включает преобразование данных.

  3. Обработка данных: От генерации сводной статистики до очистки записей данных — этот шаг является сердцем задачи.

  4. Упаковка данных: Это может включать создание новой электронной таблицы или сериализацию с помощью JSON.stringify, или запись XML, или просто уплощение данных для инструментов пользовательского интерфейса.

  5. Выпуск данных: Файлы электронных таблиц могут быть загружены на сервер или записаны локально. Данные могут быть представлены пользователям в HTML TABLE или таблице данных.

Распространённая задача — создание корректного экспорта электронной таблицы из данных, хранящихся в HTML table. В этом примере HTML TABLE на странице будет извлечена, внизу будет добавлена строка с датой отчета, а новый файл будет сгенерирован и загружен локально. XLSX.writeFile берёт на себя упаковку данных и попытку локальной загрузки:```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");

root@kitploit:~
Эта библиотека пытается упростить шаги 2 и 4 с помощью функций для извлечения полезных
данных из файлов электронных таблиц (`read` / `readFile`) и генерации новых файлов
электронных таблиц из данных (`write` / `writeFile`). Дополнительные служебные функции, такие как
`table_to_book`, работают с другими распространенными источниками данных, такими как HTML-таблицы.

Эта документация и различные демонстрационные проекты охватывают ряд распространенных сценариев
и подходов для шагов 1 и 5.

Служебные функции помогают с шагом 3.

["Получение и извлечение данных"](#acquiring-and-extracting-data) описывает
решения для типичных сценариев импорта данных.

["Упаковка и выпуск данных"](#packaging-and-releasing-data) описывает
решения для типичных сценариев экспорта данных.

["Обработка данных"](#packaging-and-releasing-data) описывает решения для
типичных сценариев обработки и манипуляции рабочими книгами.

["Служебные функции"](#utility-functions) подробно описывает служебные функции для
преобразования массивов JSON и других распространенных структур JS в объекты листов.

### Дзен SheetJS

_Обработка данных должна вписываться в любой рабочий процесс_

Библиотека не навязывает отдельный жизненный цикл. Она отлично вписывается в веб-сайты
и приложения, созданные с использованием любого фреймворка. Обычные объекты данных JS хорошо взаимодействуют с
Web Workers и будущими API.

_JavaScript — мощный язык для обработки данных_

["Общий формат электронных таблиц"](#common-spreadsheet-format) представляет собой простое объектное
представление основных понятий рабочей книги. Различные функции в
библиотеке предоставляют низкоуровневые инструменты для работы с объектом.

Для удобной обработки на JS существуют служебные функции для преобразования частей
листа в массив массивов и обратно. Следующий пример объединяет мощные
методы массивов JS с библиотекой сетевых запросов для загрузки данных, выбора
нужной информации и создания файла рабочей книги:

<details>
  <summary><b>Получить данные из конечной точки JSON и создать рабочую книгу</b> (нажмите, чтобы показать)</summary>

Цель — создать книгу XLSB с именами и датами рождения президентов США.

**Получение данных**

_Сырые данные_

<https://theunitedstates.io/congress-legislators/executive.json> содержит нужные
данные. Например, Джон Адамс:```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"
  ]
}

Фильтрация президентов

Набор данных включает Аарона Бёрра, вице-президента, который никогда не был президентом!

Array#filter создаёт новый массив с нужными строками. Президент отслужил как минимум один срок с type, равным "prez". Чтобы проверить, есть ли у конкретной строки хотя бы один срок "prez", Array#some — ещё одна встроенная функция JS. Полный фильтр будет таким:```js const prez = raw_data.filter(row => row.terms.some(term => term.type === "prez"));

root@kitploit:~
_Выравнивание данных_

В этом примере имя будет объединением имени и фамилии (`row.name.first + " " + row.name.last`), а день рождения — подполем `row.bio.birthday`. Используя `Array#map`, набор данных можно преобразовать одним вызовом:```js
const rows = prez.map(row => ({
  name: row.name.first + " " + row.name.last,
  birthday: row.bio.birthday
}));

Результатом является массив «простых» объектов без вложенности:```js [ { name: "George Washington", birthday: "1732-02-22" }, { name: "John Adams", birthday: "1735-10-19" }, // ... one row per President ]

root@kitploit:~
**Извлечение данных**

С очищенным набором данных `XLSX.utils.json_to_sheet` генерирует лист:```js
const worksheet = XLSX.utils.json_to_sheet(rows);

XLSX.utils.book_new создает новую рабочую книгу, а XLSX.utils.book_append_sheet добавляет рабочий лист в книгу. Новый рабочий лист будет называться "Даты":```js const workbook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(workbook, worksheet, "Dates");

root@kitploit:~
**Process Data**

_Исправление заголовков_

По умолчанию `json_to_sheet` создает лист с строкой заголовков. В данном случае
заголовки берутся из ключей JS-объекта: "name" и "birthday".

Заголовки находятся в ячейках A1 и B1.  `XLSX.utils.sheet_add_aoa` может записывать текстовые значения в существующий лист, начиная с ячейки A1:```js
XLSX.utils.sheet_add_aoa(worksheet, [["Name", "Birthday"]], { origin: "A1" });

Настройка ширины столбцов

Некоторые названия длиннее, чем ширина столбца по умолчанию. Ширина столбцов задается с помощью установки свойства "!cols" рабочего листа.

Следующая строка устанавливает ширину столбца A равной примерно 10 символам:```js worksheet["!cols"] = [ { wch: 10 } ]; // set column A width to 10 characters

root@kitploit:~
Один вызов `Array#reduce` по `rows` может вычислить максимальную ширину:```js
const max_width = rows.reduce((w, r) => Math.max(w, r.name.length), 10);
worksheet["!cols"] = [ { wch: max_width } ];

Примечание: Если исходной точкой был файл или HTML-таблица, XLSX.utils.sheet_to_json сгенерирует массив объектов JS.

Данные пакета и релиза

XLSX.writeFile создаёт файл электронной таблицы и пытается записать его в систему. В браузере он попытается предложить пользователю скачать файл. В NodeJS он запишет его в локальную директорию.```js XLSX.writeFile(workbook, "Presidents.xlsx");

root@kitploit:~
**Полный пример**```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");
})();

Для использования в веб-браузере, предполагая, что сниппет сохранен в snippet.js, следует использовать теги script для включения автономных сборок axios и xlsx:```html

root@kitploit:~
</details>

_Форматы файлов являются деталями реализации_

Парсер охватывает широкий спектр распространенных форматов файлов электронных таблиц, чтобы гарантировать, что файлы, «сохраненные как HTML-XLS», работают так же, как и реальные файлы XLS или XLSX.

Писатель поддерживает ряд распространенных выходных форматов для широкой совместимости с экосистемой данных.

Насколько это возможно, код обработки данных не должен беспокоиться о конкретных используемых форматах файлов.

### Демонстрации экосистемы JS

Каталог [`demos`](https://github.com/weareu/xlsx/blob/HEAD/demos/) включает примеры проектов для:

**Фреймворки и API**
- [`angularjs`](https://github.com/weareu/xlsx/blob/HEAD/demos/angular/)
- [`angular и ionic`](https://github.com/weareu/xlsx/blob/HEAD/demos/angular2/)
- [`knockout`](https://github.com/weareu/xlsx/blob/HEAD/demos/knockout/)
- [`meteor`](https://github.com/weareu/xlsx/blob/HEAD/demos/meteor/)
- [`react и react-native`](https://github.com/weareu/xlsx/blob/HEAD/demos/react/)
- [`vue 2.x и weex`](https://github.com/weareu/xlsx/blob/HEAD/demos/vue/)
- [`XMLHttpRequest и fetch`](https://github.com/weareu/xlsx/blob/HEAD/demos/xhr/)
- [`nodejs сервер`](https://github.com/weareu/xlsx/blob/HEAD/demos/server/)
- [`базы данных и хранилища ключ/значение`](https://github.com/weareu/xlsx/blob/HEAD/demos/database/)
- [`типизированные массивы и математика`](https://github.com/weareu/xlsx/blob/HEAD/demos/array/)

**Сборщики и инструменты**
- [`browserify`](https://github.com/weareu/xlsx/blob/HEAD/demos/browserify/)
- [`fusebox`](https://github.com/weareu/xlsx/blob/HEAD/demos/fusebox/)
- [`parcel`](https://github.com/weareu/xlsx/blob/HEAD/demos/parcel/)
- [`requirejs`](https://github.com/weareu/xlsx/blob/HEAD/demos/requirejs/)
- [`rollup`](https://github.com/weareu/xlsx/blob/HEAD/demos/rollup/)
- [`systemjs`](https://github.com/weareu/xlsx/blob/HEAD/demos/systemjs/)
- [`typescript`](https://github.com/weareu/xlsx/blob/HEAD/demos/typescript/)
- [`webpack 2.x`](https://github.com/weareu/xlsx/blob/HEAD/demos/webpack/)

**Платформы и интеграции**
- [`deno`](https://github.com/weareu/xlsx/blob/HEAD/demos/deno/)
- [`electron приложение`](https://github.com/weareu/xlsx/blob/HEAD/demos/electron/)
- [`nw.js приложение`](https://github.com/weareu/xlsx/blob/HEAD/demos/nwjs/)
- [`Расширения Chrome / Chromium`](https://github.com/weareu/xlsx/blob/HEAD/demos/chrome/)
- [`Скачать Google Sheet локально`](https://github.com/weareu/xlsx/blob/HEAD/demos/google-sheet/)
- [`Adobe ExtendScript`](https://github.com/weareu/xlsx/blob/HEAD/demos/extendscript/)
- [`Безголовые браузеры`](https://github.com/weareu/xlsx/blob/HEAD/demos/headless/)
- [`canvas-datagrid`](https://github.com/weareu/xlsx/blob/HEAD/demos/datagrid/)
- [`x-spreadsheet`](https://github.com/weareu/xlsx/blob/HEAD/demos/xspreadsheet/)
- [`react-data-grid`](https://github.com/weareu/xlsx/blob/HEAD/demos/react/modify/)
- [`vue3-table-light`](https://github.com/weareu/xlsx/blob/HEAD/demos/vue/modify/)
- [`Swift JSC и другие движки`](https://github.com/weareu/xlsx/blob/HEAD/demos/altjs/)
- [`функции "без сервера"`](https://github.com/weareu/xlsx/blob/HEAD/demos/function/)
- [`Internet Explorer`](https://github.com/weareu/xlsx/blob/HEAD/demos/oldie/)

Другие примеры включены в [витрину](https://github.com/weareu/xlsx/blob/HEAD/demos/showcase/).

<https://sheetjs.com/demos/modify.html> показывает полный пример чтения, изменения и записи файлов.

<https://github.com/SheetJS/sheetjs/blob/HEAD/bin/xlsx.njs> — это инструмент командной строки, включенный в установки node, который читает файлы электронных таблиц и экспортирует содержимое в различных форматах.
## Получение и извлечение данных

### Разбор книг

**API**

_Извлечение данных из байтов электронных таблиц_```js
var workbook = XLSX.read(data, opts);

Метод read может извлекать данные из байтов электронной таблицы, хранящихся в JS строке, "двоичной строке", буфере NodeJS или типизированном массиве (Uint8Array или ArrayBuffer).

Чтение байтов электронной таблицы из локального файла и извлечение данных```js var workbook = XLSX.readFile(filename, opts);

root@kitploit:~
Метод `readFile` пытается прочитать файл электронной таблицы по указанному пути. Браузеры, как правило, не позволяют читать файлы таким образом (это считается угрозой безопасности), и попытки чтения таким способом приведут к ошибке.

Второй аргумент `opts` необязателен. В разделе ["Параметры парсинга"](#parsing-options) описаны поддерживаемые свойства и поведение.

**Примеры**

Вот несколько типичных сценариев (нажмите на каждый заголовок, чтобы увидеть код):

<details>
  <summary><b>Локальный файл на сервере NodeJS</b> (нажмите, чтобы показать)</summary>

`readFile` использует `fs.readFileSync` под капотом:```js
var XLSX = require("xlsx");

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

Для Node ESM помощник readFile не включен. Вместо этого следует использовать fs.readFileSync для чтения данных файла как Buffer для использования с 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);

root@kitploit:~
</details>

<details>
  <summary><b>Локальный файл в приложении Deno</b> (нажмите, чтобы показать)</summary>

`readFile` использует `Deno.readFileSync` под капотом:```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");

Applications reading files must be invoked with the --allow-read flag. The deno demo has more examples

Файл, предоставленный пользователем на веб-странице ("Drag-and-Drop") (кликните для показа)

For modern websites targeting Chrome 76+, File#arrayBuffer is recommended:```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);

root@kitploit:~
Для максимальной совместимости следует использовать API `FileReader`:```js
function handleDrop(e) {
  e.stopPropagation(); e.preventDefault();
  var f = e.dataTransfer.files[0];
  /* f is a File */
  var reader = new FileReader();
  reader.onload = function(e) {
    var data = e.target.result;
    /* reader.readAsArrayBuffer(file) -> data will be an ArrayBuffer */
    var workbook = XLSX.read(data);

    /* DO SOMETHING WITH workbook HERE */
  };
  reader.readAsArrayBuffer(f);
}
drop_dom_element.addEventListener("drop", handleDrop, false);

https://oss.sheetjs.com/sheetjs/ demonstrates the FileReader technique.

Файл, отправленный пользователем, с HTML элементом INPUT (нажмите, чтобы показать)

Начиная с HTML элемента INPUT с type="file":```html

root@kitploit:~
Для современных веб-сайтов, ориентированных на Chrome 76+, рекомендуется использовать `Blob#arrayBuffer`:```js
// XLSX is a global from the standalone script

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

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

Для более широкой поддержки (включая IE10+), рекомендуется подход FileReader:```js function handleFile(e) { var file = e.target.files[0]; var reader = new FileReader(); reader.onload = function(e) { var data = e.target.result; /* reader.readAsArrayBuffer(file) -> data will be an ArrayBuffer */ var workbook = XLSX.read(e.target.result);

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

}; reader.readAsArrayBuffer(file); } input_dom_element.addEventListener("change", handleFile, false);

root@kitploit:~
Демо [`oldie`](https://github.com/weareu/xlsx/blob/HEAD/demos/oldie/) показывает сценарий обратной совместимости с IE.

</details>

<details>
  <summary><b>Загрузка файла в веб-браузере ("Ajax")</b> (нажмите, чтобы показать)</summary>

Для современных сайтов, ориентированных на Chrome 42+, рекомендуется `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 */
})();
Локальный файл в приложении Electron (нажмите, чтобы показать)

readFile можно использовать в процессе рендеринга:```js /* From the renderer process */ var XLSX = require("xlsx");

var workbook = XLSX.readFile(path);

root@kitploit:~
Electron APIs have changed over time.  The [`electron` demo](https://github.com/weareu/xlsx/blob/HEAD/demos/electron/) shows a complete example and details the required version-specific settings.

</details>

<details>
  <summary><b>Local file in a mobile app with React Native</b> (click to show)</summary>

The [`react` demo](https://github.com/weareu/xlsx/blob/HEAD/demos/react) includes a sample React Native app.

Since React Native does not provide a way to read files from the filesystem, a
third-party library must be used.  The following libraries have been tested:

- [`react-native-file-access`](https://npm.im/react-native-file-access)

The `base64` encoding returns strings compatible with the `base64` type:```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"});
  • react-native-fs

Кодировка ascii возвращает двоичные строки, совместимые с типом :```js import XLSX from "xlsx"; import { readFile } from "react-native-fs";

Загрузка файлов в процессе NodeJS (нажмите, чтобы показать)

Node 17.5 и 18.0 имеют встроенную поддержку fetch:```js const XLSX = require("xlsx");

const data = await (await fetch(url)).arrayBuffer(); /* data is an ArrayBuffer */ const workbook = XLSX.read(data);

root@kitploit:~
Для более широкой совместимости рекомендуется использовать сторонние модули.

[`request`](https://npm.im/request) требует кодировки `null`, чтобы получить Buffers:```js
var XLSX = require("xlsx");
var request = require("request");

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

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

axios работает одинаково в браузере и в 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 */ })();

root@kitploit:~
</details>

<details>
  <summary><b>Загрузка файлов в приложении Electron</b> (нажмите, чтобы показать)</summary>

Модуль `net` в главном процессе может выполнять HTTP/HTTPS-запросы к внешним
ресурсам. Ответы должны быть вручную объединены с помощью `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));

    /* DO SOMETHING WITH workbook HERE */
  });
});
req.end();
Читаемые потоки в NodeJS (нажмите, чтобы показать)

При работе с читаемыми потоками самый простой подход — буферизировать поток и обработать всё целиком в конце:```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"});

root@kitploit:~
/* DO SOMETHING WITH workbook IN THE CALLBACK */
cb(workbook);

}); }

root@kitploit:~
</details>

<details>
  <summary><b>ReadableStream в браузере</b> (нажмите, чтобы показать)</summary>

При работе с `ReadableStream` самый простой подход — буферизировать поток и обработать всё в конце:```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);

Более подробные примеры приведены в включенных демо-примерах

Обработка данных JSON и JS

Данные JSON и JS обычно представляют собой отдельные рабочие листы. В этом разделе будут использоваться несколько вспомогательных функций для создания книг.

Создание новой книги```js var workbook = XLSX.utils.book_new();

root@kitploit:~
The `book_new` utility функция создает пустую книгу без листов.

Программы для работы с электронными таблицами обычно требуют наличия хотя бы одного листа и принудительно обеспечивают это требование в пользовательском интерфейсе. Данная библиотека обеспечивает это требование на этапе записи, выдавая ошибки, если пустая книга передается в функции записи.


**API**

_Создание листа из массива массивов значений JS_```js
var worksheet = XLSX.utils.aoa_to_sheet(aoa, opts);

Функция-утилита aoa_to_sheet проходит по "массиву массивов" в построчном порядке, создавая объект листа. Следующий фрагмент генерирует лист с ячейкой A1, установленной в строку A1, ячейкой B1, установленной в B1 и т.д.:```js var worksheet = XLSX.utils.aoa_to_sheet([ ["A1", "B1", "C1"], ["A2", "B2", "C2"], ["A3", "B3", "C3"] ]);

root@kitploit:~
["Array of Arrays Input"](#array-of-arrays-input) описывает функцию и необязательный аргумент `opts` более подробно.

_Создать рабочий лист из массива JS-объектов_```js
var worksheet = XLSX.utils.json_to_sheet(jsa, opts);

Утилитная функция json_to_sheet последовательно обходит массив JS-объектов, генерируя объект рабочего листа. По умолчанию она создает строку заголовка и по одной строке на каждый объект в массиве. Необязательный аргумент opts содержит настройки для управления порядком столбцов и выводом заголовков.

"Ввод массива объектов" описывает функцию и необязательный аргумент opts более подробно.

Примеры

"Zen of SheetJS" содержит подробный пример "Получение данных из конечной точки JSON и создание рабочей книги"

x-spreadsheet — это интерактивная таблица для предварительного просмотра и изменения структурированных данных в веб-браузере. Демонстрация xspreadsheet включает пример скрипта с функцией xtos для преобразования объекта данных x-spreadsheet в рабочую книгу. https://oss.sheetjs.com/sheetjs/x-spreadsheet — это живая демонстрация.

Записи из запроса к базе данных (SQL или no-SQL) (нажмите, чтобы показать)

Демонстрация database включает примеры работы с базами данных и результатами запросов.

Численные вычисления с TensorFlow.js (нажмите, чтобы показать)

@tensorflow/tfjs и другие библиотеки ожидают данные в виде простых массивов, что хорошо подходит для рабочих листов, где каждый столбец является вектором данных. Это транспонирование того, как большинство людей используют электронные таблицы, где каждая строка является вектором.

При восстановлении данных из tfjs возвращаемые точки данных хранятся в типизированном массиве. Массив массивов можно построить с помощью циклов. Array#unshift может добавить строку заголовка перед преобразованием:```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);

root@kitploit:~
Демонстрация [`array`](https://github.com/weareu/xlsx/blob/HEAD/demos/array/) показывает полный пример.

</details>


### Обработка HTML-таблиц

**API**

_Создание листа путём скрейпинга HTML-таблицы на странице_```js
var worksheet = XLSX.utils.table_to_sheet(dom_element, opts);

Утилитарная функция table_to_sheet принимает элемент DOM TABLE и перебирает строки для создания рабочего листа. Аргумент opts является необязательным. описывает функцию более подробно.

Расширение Chrome/Chromium (нажмите, чтобы показать)

В chrome демо представлен полный пример и описаны необходимые разрешения и другие настройки.

В расширении рекомендуется генерировать книгу в контентном скрипте и передавать объект обратно в расширение:```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); });

root@kitploit:~
</details>

<details>
  <summary><b>Серверные HTML-таблицы с Headless Chrome</b> (нажмите, чтобы показать)</summary>

Демо [`headless`](https://github.com/weareu/xlsx/blob/HEAD/demos/headless/) включает полную демонстрацию преобразования HTML-файлов в книги XLSB. Основная идея — добавить скрипт на страницу, разобрать таблицу в контексте страницы, сгенерировать книгу в `base64` и отправить её обратно для дальнейшей обработки:```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" });

    /* 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"));

    /* generate XLSX file */
    var b64 = XLSX.write(workbook, {type: "base64", bookType: "xlsb"});

    /* call "s5s" hook exposed from the node process */
    window.s5s(b64);
  `});

  /* cleanup */
  await browser.close();
})();
Серверные HTML-таблицы с Headless WebKit (нажмите, чтобы показать)

Демонстрация headless включает полный пример преобразования HTML-файлов в книги XLSB с помощью PhantomJS. Основная идея заключается в добавлении скрипта на страницу, разборе таблицы в контексте страницы, создании книги в формате binary и отправке её обратно для дальнейшей обработки:```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);

root@kitploit:~
var workbook = XLSX.read(bin, {type: "binary"});
/* DO SOMETHING WITH workbook HERE */

phantom.exit();

}); });

root@kitploit:~
</details>

<details>
  <summary><b>Таблицы HTML в NodeJS без браузера</b> (нажмите, чтобы показать)</summary>

NodeJS не содержит реализации DOM, а Puppeteer требует громоздкой сборки Chromium.  `jsdom` является легковесной альтернативой:```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);

Обработка данных

«Common Spreadsheet Format» — это простое объектное представление основных концепций рабочей книги. Вспомогательные функции работают с объектным представлением и предназначены для обработки типичных случаев использования.

Изменение структуры рабочей книги

API

Добавление листа в рабочую книгу```js XLSX.utils.book_append_sheet(workbook, worksheet, sheet_name);

root@kitploit:~
Вспомогательная функция `book_append_sheet` добавляет лист в книгу.
Третий аргумент задает желаемое имя листа. Несколько листов можно
добавить в книгу, вызывая функцию несколько раз. Если имя листа
уже используется в книге, будет вызвана ошибка.

_Добавить лист в книгу и найти уникальное имя_```js
var new_name = XLSX.utils.book_append_sheet(workbook, worksheet, name, true);

Если четвертый аргумент равен true, функция будет начинать с указанного имени рабочего листа. Если имя листа существует в книге, новое имя рабочего листа будет выбрано путем поиска основы имени и увеличения счетчика.```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:~
_Перечислить названия листов в порядке вкладок_```js
var wsnames = workbook.SheetNames;

Свойство SheetNames объекта workbook — это список имен листов в «порядке вкладок». API-функции будут обращаться к этому массиву.

Заменить лист на месте```js workbook.Sheets[sheet_name] = new_worksheet;

root@kitploit:~
Свойство `Sheets` объекта книги — это объект, ключами которого являются названия, а значениями — объекты листов. Переприсваивая свойству объекта `Sheets`, можно изменить объект листа, не нарушая остальную структуру листов.

**Примеры**

<details>
  <summary><b>Добавить новый лист в книгу</b> (нажмите, чтобы показать)</summary>

В этом примере используется [`XLSX.utils.aoa_to_sheet`](#array-of-arrays-input).```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);

Изменение значений ячеек

API

Изменить одно значение ячейки на листе```js XLSX.utils.sheet_add_aoa(worksheet, [[new_value]], { origin: address });

root@kitploit:~
_Изменить несколько значений ячеек на листе_```js
XLSX.utils.sheet_add_aoa(worksheet, aoa, opts);

Вспомогательная функция sheet_add_aoa изменяет значения ячеек на рабочем листе. Первый аргумент — объект рабочего листа. Второй аргумент — массив массивов значений. Ключ origin третьего аргумента управляет тем, куда будут записаны ячейки. Следующий фрагмент устанавливает B3=1 и 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" });

root@kitploit:~
["Ввод массива массивов"](#array-of-arrays-input) описывает функцию и необязательный аргумент `opts` более подробно.

**Примеры**

<details>
  <summary><b>Добавление строк на лист</b> (нажмите, чтобы показать)</summary>

Особое значение источника `-1` указывает `sheet_add_aoa` начать в столбце A строки, следующей за последней строкой в диапазоне, добавляя данные:```js
XLSX.utils.sheet_add_aoa(worksheet, [
  ["first row after data", 1],
  ["second row after data", 2]
], { origin: -1 });

Изменение других свойств листа, книги или ячейки

В разделе "Common Spreadsheet Format" более подробно описываются структуры объектов.

Упаковка и выпуск данных

Запись книг

API

Сгенерировать байты электронной таблицы (файл) из данных```js var data = XLSX.write(workbook, opts);

root@kitploit:~
Метод `write` пытается упаковать данные из рабочей книги в файл в памяти. По умолчанию создаются файлы XLSX, но это можно контролировать с помощью свойства `bookType` аргумента `opts`. В зависимости от опции `type` данные могут быть сохранены как «двоичная строка», JS-строка, `Uint8Array` или Buffer.

Второй аргумент `opts` обязателен. В разделе ["Опции записи"](#writing-options) описаны поддерживаемые свойства и поведение.

_Сгенерировать и попытаться сохранить файл_```js
XLSX.writeFile(workbook, filename, opts);

Метод writeFile упаковывает данные и пытается сохранить новый файл. Формат экспортируемого файла определяется расширением filename (SheetJS.xlsx означает экспорт в XLSX, SheetJS.xlsb — экспорт в XLSB и т.д.).

Метод writeFile использует платформо-зависимые API для инициирования сохранения файла. В NodeJS fs.readFileSync может создать файл. В веб-браузере предпринимается попытка скачивания с использованием HTML5-атрибута download с запасными вариантами для IE.

Создать и попытаться сохранить файл XLSX```js XLSX.writeFileXLSX(workbook, filename, opts);

root@kitploit:~
Метод `writeFile` включает в себя несколько различных функций экспорта. Это отлично подходит для удобства разработчика, но не поддается tree-shaking с помощью текущих инструментов разработчика. Когда требуются только экспорт XLSX, этот метод избегает ссылок на другие функции экспорта.

Второй аргумент `opts` является необязательным. В разделе [«Параметры записи»](#writing-options) описаны поддерживаемые свойства и поведение.

**Примеры**

<details>
  <summary><b>Локальный файл на сервере NodeJS</b> (нажмите, чтобы показать)</summary>

`writeFile` использует `fs.writeFileSync` в серверных средах:```js
var XLSX = require("xlsx");

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

Для Node ESM вспомогательная функция writeFile не включена. Вместо этого следует использовать fs.writeFileSync для записи данных файла в Buffer для использования с 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);

root@kitploit:~
</details>

<details>
  <summary><b>Локальный файл в приложении Deno</b> (нажмите, чтобы показать)</summary>

`writeFile` использует `Deno.writeFileSync` под капотом:```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");

Приложения, записывающие файлы, должны запускаться с флагом --allow-write. Демо-версия deno содержит больше примеров

Локальный файл в плагине PhotoShop или InDesign (нажмите, чтобы показать)

writeFile оборачивает логику File в Photoshop и других целях ExtendScript. Указанный путь должен быть абсолютным:```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 */

root@kitploit:~
The [`extendscript` демо-версия](https://github.com/weareu/xlsx/blob/HEAD/demos/extendscript/) включает более сложный пример.

</details>

<details>
  <summary><b>Скачать файл в браузере на компьютер пользователя</b> (нажмите, чтобы показать)</summary>

`XLSX.writeFile` объединяет несколько методов для запуска сохранения файла:

- `URL` API браузера создает объектный URL для файла, который библиотека использует, создавая ссылку и вызывая щелчок. Он поддерживается в современных браузерах.
- `msSaveBlob` — это API IE10+ для запуска сохранения файла.
- `IE_FileSave` использует VBScript и ActiveX для записи файла в IE6+ для Windows XP и Windows 7. Shim должен быть включен в содержащую HTML-страницу.

Не существует стандартного способа определить, был ли файл фактически загружен.```js
/* output format determined by filename */
XLSX.writeFile(workbook, "out.xlsb");
/* at this point, out.xlsb will have been downloaded */
Загрузить файл в устаревших браузерах (нажмите, чтобы показать)

XLSX.writeFile методы работают в большинстве современных браузеров, а также в старых IE. Для гораздо более старых браузеров существуют обходные пути, реализованные библиотеками-обёртками.

FileSaver.js реализует saveAs. Примечание: XLSX.writeFile автоматически вызовет saveAs, если он доступен.```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");

root@kitploit:~
[`Downloadify`](https://github.com/dcneiner/downloadify) использует Flash SWF кнопку для создания локальных файлов, подходит для сред, где ActiveX недоступен:```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"
});

Демо oldie показывает совместимый с IE сценарий резервного поведения.

Загрузка файла браузером (ajax) (нажмите, чтобы показать)

Полный пример с использованием XHR включен в демо XHR, а также примеры для fetch и библиотек-обёрток. Этот пример предполагает, что сервер может обрабатывать файлы в кодировке Base64 (см. демо для базового сервера на nodejs):```js /* in this example, send a base64 string to the server */ var wopts = { bookType:"xlsx", bookSST:false, type:"base64" };

var wbout = XLSX.write(workbook,wopts);

var req = new XMLHttpRequest(); req.open("POST", "/upload", true); var formdata = new FormData(); formdata.append("file", "test.xlsx"); // <-- server expects file to hold name formdata.append("data", wbout); // <-- data holds the base64-encoded data req.send(formdata);

root@kitploit:~
</details>

<details>
  <summary><b>PhantomJS (Headless Webkit) Генерация файлов</b> (нажмите, чтобы показать)</summary>

Демонстрация [`headless`](https://github.com/weareu/xlsx/blob/HEAD/demos/headless/) включает полный пример преобразования HTML-файлов в книги XLSB с помощью [PhantomJS](https://phantomjs.org/). `fs.write` в PhantomJS поддерживает запись файлов из основного процесса, но имеет другой интерфейс по сравнению с модулем `fs` 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");

Примечание. В разделе «Обработка HTML-таблиц» показано, как создать книгу из HTML-таблиц на странице в «Headless WebKit».

Включенные демонстрации охватывают мобильные приложения и другие специальные развертывания.

Примеры записи

  • http://sheetjs.com/demos/table.html экспорт HTML-таблицы
  • http://sheetjs.com/demos/writexlsx.html создает простой файл

Потоковая запись

Функции потоковой записи доступны в объекте XLSX.stream. Они принимают те же аргументы, что и обычные функции записи, но возвращают читаемый поток NodeJS.

  • XLSX.stream.to_csv это потоковая версия XLSX.utils.sheet_to_csv.
  • XLSX.stream.to_html это потоковая версия XLSX.utils.sheet_to_html.
  • XLSX.stream.to_json это потоковая версия XLSX.utils.sheet_to_json.
преобразование в CSV и запись файла с помощью Node.js (нажмите, чтобы показать)```js var output_file_name = "out.csv"; var stream = XLSX.stream.to_csv(worksheet); stream.pipe(fs.createWriteStream(output_file_name)); ```
nodejs запись JSON потока на экран (нажмите, чтобы показать)```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>Экспорт файлов NUMBERS</b> (нажмите, чтобы показать)</summary>

Редактор NUMBERS требует довольно крупной базы. Дополнительные скрипты `xlsx.zahl` обеспечивают поддержку. `xlsx.zahl.js` предназначен для автономного использования и NodeJS, а `xlsx.zahl.mjs` подходит для ESM.

_Браузер_```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>

Узел```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 направляет потоки записи в ответ nodejs.

Генерация данных JSON и JS

Данные JSON и JS обычно представляют отдельные листы. Вспомогательные функции в этом разделе работают с отдельными листами.

Раздел "Common Spreadsheet Format" описывает структуру объектов более подробно. workbook.SheetNames — это упорядоченный список названий листов. workbook.Sheets — это объект, ключами которого являются названия листов, а значениями — объекты листов.

«Первый лист» хранится в workbook.Sheets[workbook.SheetNames[0]].

API

Создание массива объектов JS из листа```js var jsa = XLSX.utils.sheet_to_json(worksheet, opts);

root@kitploit:~
_Создать массив массивов значений JS из рабочего листа_```js
var aoa = XLSX.utils.sheet_to_json(worksheet, {...opts, header: 1});

Функция sheet_to_json обходит рабочую книгу в порядке строк, создавая массив объектов. Второй аргумент opts управляет рядом решений по экспорту, включая тип значений (значения JS или форматированный текст). Раздел "JSON" описывает этот аргумент подробнее.

По умолчанию sheet_to_json сканирует первую строку и использует её значения в качестве заголовков. С опцией header: 1 функция экспортирует массив массивов значений.

Примеры

x-spreadsheet — это интерактивная таблица данных для предварительного просмотра и изменения структурированных данных в веб-браузере. Демонстрация xspreadsheet включает пример скрипта с функцией stox для преобразования из рабочей книги в объект данных x-spreadsheet. https://oss.sheetjs.com/sheetjs/x-spreadsheet — это живая демонстрация.

Предварительный просмотр данных в сетке данных React (нажмите, чтобы показать)

react-data-grid — это сетка данных, адаптированная для React. Она ожидает два свойства: rows — объекты данных и columns — описание столбцов. Для преобразования данных в соответствии с API react-data-grid проще всего начать с массива массивов.

Эта демонстрация начинается с загрузки удалённого файла и использования XLSX.read для извлечения:```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>Предварительный просмотр данных в таблице VueJS</b> (click to show)</summary>

[`vue3-table-lite`](https://github.com/linmasahiro/vue3-table-lite) — это простая таблица данных VueJS 3. Она представлена [в демонстрации VueJS](https://github.com/weareu/xlsx/blob/HEAD/demos/vue/modify/).

</details>

<details>
  <summary><b>Заполнение базы данных (SQL или no-SQL)</b> (click to show)</summary>

[Демонстрация `database`](https://github.com/weareu/xlsx/blob/HEAD/demos/database/) включает примеры работы с базами данных и результатами запросов.

</details>

<details>
  <summary><b>Численные вычисления с TensorFlow.js</b> (click to show)</summary>

[`@tensorflow/tfjs`](https://github.com/weareu/xlsx/blob/HEAD/@tensorflow/tfjs) и другие библиотеки ожидают данные в виде простых массивов, что хорошо подходит для электронных таблиц, где каждый столбец является вектором данных. Это транспонирование того, как большинство людей используют таблицы, где каждая строка является вектором. Один `Array#map` может извлечь отдельные именованные строки из экспорта `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);
Получение рабочей книги в React и генерация предпросмотра HTML-таблиц (нажмите, чтобы показать)

Обычно рекомендуется использовать React-совместимый рабочий процесс, но возможно сгенерировать HTML и использовать его в React с помощью 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:~
Демо [`react` демо](https://github.com/weareu/xlsx/blob/HEAD/demos/react) включает больше примеров React.

</details>

<details>
  <summary><b>VueJS получение рабочей книги и генерация предпросмотров HTML-таблиц</b> (нажмите, чтобы показать)</summary>

Обычно рекомендуется использовать дружественный к VueJS рабочий процесс, но можно также сгенерировать HTML и использовать его в VueJS с помощью директивы `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>`
};

Создание снимков одного листа

Функции sheet_to_* принимают объект рабочего листа.

API

Сгенерировать CSV из одного рабочего листа```js var csv = XLSX.utils.sheet_to_csv(worksheet, opts);

root@kitploit:~
Этот снимок предназначен для воспроизведения типа вывода "CSV UTF8 (`.csv`)".
["Вывод с разделителями"](#delimiter-separated-output) описывает
функцию и необязательный аргумент `opts` более подробно.

___

_Сгенерировать "Text" из одного рабочего листа_```js
var txt = XLSX.utils.sheet_to_txt(worksheet, opts);

Этот снимок предназначен для воспроизведения типа вывода "Текст UTF16 (.txt)". "Вывод с разделителями" описывает функцию и необязательный аргумент opts более подробно.

Сгенерировать список формул из одного рабочего листа```js var fmla = XLSX.utils.sheet_to_formulae(worksheet);

root@kitploit:~
Этот снимок генерирует массив записей, представляющих встроенные формулы.
Формулы массивов отображаются в виде `диапазон=формула`, а обычные ячейки — в виде `ячейка=формула или значение`.  Строковые литералы предваряются апострофом `'`, как в строке формул Excel.

Функция подробно описана в разделе ["Вывод формул"](#formulae-output).

## Интерфейс

`XLSX` — это глобальная переменная в браузере и экспортируемая переменная в Node.

`XLSX.version` — версия библиотеки (добавляется скриптом сборки).

`XLSX.SSF` — встроенная версия [библиотеки форматирования](https://git.io/ssf).

### Функции парсинга

`XLSX.read(data, read_opts)` пытается распарсить `data`.

`XLSX.readFile(filename, read_opts)` пытается прочитать `filename` и распарсить.

Параметры парсинга описаны в разделе [Параметры парсинга](#parsing-options).

### Функции записи

`XLSX.write(wb, write_opts)` пытается записать книгу `wb`.

`XLSX.writeFile(wb, filename, write_opts)` пытается записать `wb` в `filename`.
В браузерной среде пытается инициировать скачивание на стороне клиента.

`XLSX.writeFileAsync(wb, filename, o, cb)` пытается записать `wb` в `filename`.
Если `o` опущен, функция записи использует третий аргумент как обратный вызов.

`XLSX.stream` содержит набор потоковых функций записи.

Параметры записи описаны в разделе [Параметры записи](#writing-options).

### Утилиты

Утилиты доступны в объекте `XLSX.utils` и описаны в разделе
[Функции утилит](#utility-functions):

**Создание:**

- `book_new` создаёт пустую книгу
- `book_append_sheet` добавляет лист в книгу

**Импорт:**

- `aoa_to_sheet` преобразует массив массивов JS-данных в лист.
- `json_to_sheet` преобразует массив JS-объектов в лист.
- `table_to_sheet` преобразует DOM-элемент TABLE в лист.
- `sheet_add_aoa` добавляет массив массивов JS-данных в существующий лист.
- `sheet_add_json` добавляет массив JS-объектов в существующий лист.

**Экспорт:**

- `sheet_to_json` преобразует объект листа в массив JSON-объектов.
- `sheet_to_csv` генерирует вывод с разделителями-разделителями.
- `sheet_to_txt` генерирует текст в формате UTF16.
- `sheet_to_html` генерирует HTML-вывод.
- `sheet_to_formulae` генерирует список формул (с запасными значениями).

**Манипуляции с ячейками и адресами ячеек:**

- `format_cell` генерирует текстовое значение для ячейки (с использованием числовых форматов).
- `encode_row / decode_row` преобразует между строками с 0-индексацией и строками с 1-индексацией.
- `encode_col / decode_col` преобразует между столбцами с 0-индексацией и именами столбцов.
- `encode_cell / decode_cell` преобразует адреса ячеек.
- `encode_range / decode_range` преобразует диапазоны ячеек.

## Общий формат электронных таблиц

SheetJS соответствует Общему формату электронных таблиц (CSF):

### Общие структуры

Объекты адресов ячеек хранятся как `{c:C, r:R}`, где `C` и `R` — это номера столбца и строки с 0-индексацией соответственно. Например, адрес ячейки `B5` представлен объектом `{c:1, r:4}`.

Объекты диапазонов ячеек хранятся как `{s:S, e:E}`, где `S` — первая ячейка, а `E` — последняя ячейка в диапазоне. Диапазоны включают обе границы. Например, диапазон `A3:B7` представлен объектом `{s:{c:0, r:2}, e:{c:1, r:6}}`.
Функции утилит выполняют обход диапазона листа в порядке строк (row-major):```js
for(var R = range.s.r; R <= range.e.r; ++R) {
  for(var C = range.s.c; C <= range.e.c; ++C) {
    var cell_address = {c:C, r:R};
    /* if an A1-style address is needed, encode the address */
    var cell_ref = XLSX.utils.encode_cell(cell_address);
  }
}

Cell Object

Объекты ячеек представляют собой простые JS-объекты с ключами и значениями, следующими соглашению:

Встроенные утилиты экспорта (например, экспортер CSV) будут использовать текст w, если он доступен. Чтобы изменить значение, обязательно удалите cell.w (или установите его на undefined) перед попыткой экспорта. Утилиты при возможности восстановят текст w из числового формата (cell.z) и исходного значения.

Фактическая формула массива хранится в поле f первой ячейки в диапазоне массива. Другие ячейки в диапазоне будут опускать поле f.

Data Types

Исходное значение хранится в свойстве значения v и интерпретируется на основе свойства типа t. Это разделение позволяет представлять как числа, так и числовой текст. Существует 6 допустимых типов ячеек:

Значения ошибок и интерпретация (нажмите, чтобы показать)

Тип n — это числовой тип. Он включает все формы данных, которые Excel хранит как числа, такие как даты/время и логические поля. Excel использует исключительно данные, которые могут быть представлены числом с плавающей запятой IEEE754, как и JS Number, поэтому поле v содержит исходное число. Поле w содержит форматированный текст. Даты по умолчанию хранятся как числа и преобразуются с помощью XLSX.SSF.parse_date_code.

Тип d — это тип Date (дата), генерируемый только при передаче опции cellDates. Поскольку JSON не имеет естественного типа Date, ожидается, что парсеры обычно будут хранить строки дат в формате ISO 8601, подобные тем, которые вы получили бы от date.toISOString(). С другой стороны, писатели и экспортеры должны уметь обрабатывать строки дат и объекты JS Date. Обратите внимание, что Excel игнорирует модификаторы часового пояса и обрабатывает все даты в местном часовом поясе. Библиотека не исправляет эту ошибку.

Тип s — это строковый тип. Значения явно хранятся как текст. Excel будет интерпретировать эти ячейки как «число, сохраненное как текст». Сгенерированные файлы Excel автоматически подавляют ошибки такого класса, но другие форматы могут вызывать ошибки.

Тип z представляет пустые ячейки-заглушки. Они генерируются в случаях, когда ячейки не имеют присвоенного значения, но содержат комментарии или другие метаданные. Они игнорируются основными функциями утилит обработки данных библиотеки. По умолчанию эти ячейки не генерируются; опция парсера sheetStubs должна быть установлена в true.

Dates

Подробности кода даты Excel (нажмите, чтобы показать)

По умолчанию Excel хранит даты как числа с кодом формата, указывающим обработку даты. Например, дата 19-Feb-17 хранится как число 42785 с числовым форматом d-mmm-yy. Модуль SSF понимает числовые форматы и выполняет соответствующее преобразование.

XLSX также поддерживает специальный тип даты d, где данные представляют собой строку даты в формате ISO 8601. Форматировщик преобразует дату обратно в число.

Поведение по умолчанию для всех парсеров — генерировать числовые ячейки. Установка cellDates в true заставит генераторы хранить даты.

Часовые пояса и даты (нажмите, чтобы показать)

Excel не имеет собственной концепции универсального времени. Все время указывается в местном часовом поясе. Ограничения Excel не позволяют задавать истинные абсолютные даты.

Следуя Excel, эта библиотека обрабатывает все даты как относительные к местному часовому поясу.

Эпохи: 1900 и 1904 (нажмите, чтобы показать)

Excel поддерживает две эпохи (1 января 1900 г. и 1 января 1904 г.). Эпоху книги можно определить, проверив свойство wb.Workbook.WBProps.date1904:```js !!(((wb.Workbook||{}).WBProps||{}).date1904)

root@kitploit:~
</details>

### Объекты листов

Каждый ключ, который не начинается с `!`, сопоставляется с ячейкой (в нотации `A-1`)

`sheet[address]` возвращает объект ячейки для указанного адреса.

**Специальные ключи листа (доступны как `sheet[key]`, каждый начинается с `!`):**

- `sheet['!ref']`: диапазон в нотации A-1, представляющий диапазон листа. Функции, работающие с листами, должны использовать этот параметр для определения диапазона. Ячейки, назначенные вне диапазона, не обрабатываются. В частности, при ручном составлении листа ячейки за пределами диапазона не включаются.

Функции, обрабатывающие листы, должны проверять наличие поля `!ref`. Если `!ref` опущено или не является допустимым диапазоном, функции могут считать лист пустым или попытаться угадать диапазон. Стандартные утилиты, поставляемые с этой библиотекой, считают листы пустыми (например, вывод CSV будет пустой строкой).

При чтении рабочего листа с установленным свойством `sheetRows` параметр ref будет использовать ограниченный диапазон. Исходный диапазон устанавливается в `ws['!fullref']`.

- `sheet['!margins']`: Объект, представляющий поля страницы. Значения по умолчанию соответствуют «нормальному» пресету Excel. В Excel также есть пресеты «широкий» и «узкий», но они хранятся как необработанные измерения. Основные свойства перечислены ниже:

<details>
  <summary><b>Подробности о полях страницы</b> (нажмите, чтобы показать)</summary>

| ключ      | описание                   | «нормальный» | «широкий» | «узкий» |
|----------|----------------------------|:-------------|:----------|:--------|
| `left`   | левое поле (дюймы)         | `0.7`        | `1.0`     | `0.25`  |
| `right`  | правое поле (дюймы)        | `0.7`        | `1.0`     | `0.25`  |
| `top`    | верхнее поле (дюймы)       | `0.75`       | `1.0`     | `0.75`  |
| `bottom` | нижнее поле (дюймы)        | `0.75`       | `1.0`     | `0.75`  |
| `header` | поле верхнего колонтитула (дюймы) | `0.3`  | `0.5`     | `0.3`   |
| `footer` | поле нижнего колонтитула (дюймы) | `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}

Объект рабочего листа

В дополнение к базовым ключам листа, рабочие листы также добавляют:

  • ws['!cols']: массив объектов свойств столбцов. Ширина столбцов на самом деле хранится в файлах нормализованным образом, измеряемая в терминах «Максимальной ширины цифры» (наибольшая ширина отображаемых цифр 0-9, в пикселях). При разборе объекты столбцов хранят ширину в пикселях в поле wpx, ширину символов в поле wch и максимальную ширину цифры в поле MDW.

  • ws['!rows']: массив объектов свойств строк, как описано далее в документации. Каждый объект строки кодирует свойства, включая высоту строки и видимость.

  • ws['!merges']: массив объектов диапазонов, соответствующих объединённым ячейкам на рабочем листе. Простые текстовые форматы не поддерживают объединение ячеек. Экспорт в CSV запишет все ячейки в объединённом диапазоне, если они существуют, поэтому убедитесь, что установлена только первая ячейка (верхняя левая) в диапазоне.

  • ws['!outline']: настройка поведения структур. Параметры по умолчанию соответствуют настройкам по умолчанию в Excel 2019:

keyФункция Excelпо умолчанию
aboveСнять флажок «Итоговые строки под деталями»false
leftСнять флажок «Итоговые строки справа от деталей»
  • ws['!protect']: объект свойств защиты листа при записи. Ключ password задаёт пароль для форматов, поддерживающих защиту паролем (XLSX/XLSB/XLS). Запись использует метод обфускации XOR. Следующие ключи управляют защитой листа — установите false, чтобы включить функцию, когда лист заблокирован, или true, чтобы отключить функцию:
Детали защиты рабочего листа (нажмите, чтобы показать)
  • ws['!autofilter']: объект автофильтра, следующий схеме:```typescript type AutoFilter = { ref:string; // A-1 based range representing the AutoFilter table range }
root@kitploit:~
#### Объект диаграммы

Диаграммы представлены как стандартные листы. Они отличаются
свойством `!type`, установленным в `"chart"`.

Базовые данные и `!ref` относятся к кэшированным данным на листе диаграммы.
Первая строка листа диаграммы является базовым заголовком.

#### Объект макроса

Макросы представлены как стандартные листы. Они отличаются
свойством `!type`, установленным в `"macro"`.

#### Объект диалогового листа

Диалоговые листы представлены как стандартные листы. Они отличаются
свойством `!type`, установленным в `"dialog"`.

### Объект рабочей книги

`workbook.SheetNames` — упорядоченный список листов в рабочей книге.

`wb.Sheets[sheetname]` возвращает объект, представляющий рабочий лист.

`wb.Props` — объект, хранящий стандартные свойства. `wb.Custprops` хранит
пользовательские свойства. Поскольку стандартные свойства XLS отличаются от
стандарта XLSX, разбор XLS сохраняет основные свойства в обоих местах.

`wb.Workbook` хранит [атрибуты уровня рабочей книги](#workbook-level-attributes).

#### Свойства файла рабочей книги

Различные форматы файлов используют разные внутренние имена для свойств файлов.
Объект `Props` рабочей книги нормализует имена:

<details>
  <summary><b>Свойства файла</b> (нажмите, чтобы показать)</summary>

| JS Name       | Excel Description              |
|:--------------|:-------------------------------|
| `Title`       | Вкладка «Сводка» «Название»    |
| `Subject`     | Вкладка «Сводка» «Тема»       |
| `Author`      | Вкладка «Сводка» «Автор»      |
| `Manager`     | Вкладка «Сводка» «Руководитель»|
| `Company`     | Вкладка «Сводка» «Организация» |
| `Category`    | Вкладка «Сводка» «Категория»   |
| `Keywords`    | Вкладка «Сводка» «Ключевые слова»|
| `Comments`    | Вкладка «Сводка» «Примечания»  |
| `LastAuthor`  | Вкладка «Статистика» «Кем сохранено»|
| `CreatedDate` | Вкладка «Статистика» «Создан»  |

</details>

Например, чтобы установить свойство названия рабочей книги:```js
if(!wb.Props) wb.Props = {};
wb.Props.Title = "Insert Title Here";

Пользовательские свойства добавляются в объект Custprops рабочей книги:```js if(!wb.Custprops) wb.Custprops = {}; wb.Custprops["Custom Property"] = "Custom Value";

root@kitploit:~
Писатели будут обрабатывать ключ `Props` объекта параметров:```js
/* force the Author to be "SheetJS" */
XLSX.write(wb, {Props:{Author:"SheetJS"}});

Атрибуты уровня книги

wb.Workbook хранит атрибуты уровня книги.

Именованные диапазоны

wb.Workbook.Names — массив объектов именованных диапазонов со следующими ключами:

Свойства именованного диапазона (нажмите, чтобы показать)

Excel позволяет двум именованным диапазонам на уровне листа иметь одно и то же имя. Однако имя на уровне листа не может конфликтовать с именем на уровне книги. Разработчики книг могут не соблюдать это ограничение.

Представления книги

wb.Workbook.Views — массив объектов представления книги со следующими ключами:

КлючОписание
RTLЕсли true, отображать справа налево

Прочие свойства книги

wb.Workbook.WBProps содержит другие свойства книги:

КлючОписание
CodeNameКодовое имя проекта VBA
date1904эпоха: 0/false для системы 1900, 1/true для системы 1904

Функции документа

Даже для базовых функций, таких как хранение дат, официальные форматы Excel хранят одно и то же содержимое по-разному. Ожидается, что парсеры преобразуют данные из нижележащего представления файлового формата в общий формат электронной таблицы (CSF). Разработчики должны преобразовывать данные из CSF обратно в нижележащий формат.

Формулы

Строка формулы в стиле A1 хранится в поле f. Хотя разные форматы файлов хранят формулы по-разному, форматы транслируются. Хотя некоторые форматы хранят формулы с ведущим знаком равенства, формулы CSF не начинаются с =.

Поддержка форматов файлов формул (нажмите, чтобы показать)

Одноячеечные формулы

Для простых формул ключ f нужной ячейки можно установить на текст фактической формулы. Этот лист представляет A1=1, A2=2 и 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:~
Утилиты, такие как `aoa_to_sheet`, принимают объекты ячеек вместо значений:```js
var worksheet = XLSX.utils.aoa_to_sheet([
  [ 1 ], // A1
  [ 2 ], // A2
  [ {t: "n", v: 3, f: "A1+A2"} ] // A3
]);

Ячейки с записями формул, но без значений, будут сериализованы таким образом, что Excel и другие программы для работы с электронными таблицами их распознают. Эта библиотека не будет автоматически вычислять результаты формул! Например, следующий лист будет включать функцию BESSELJ, но результат не будет доступен в 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:~
Если необходимы реальные результаты в JS, [SheetJS Pro](https://sheetjs.com/pro)
предлагает компонент для вычисления формул, позволяющий обрабатывать выражения,
обновлять значения и зависимые ячейки, а также пересчитывать целые книги.


**Формулы массива**

_Назначить формулу массива_```js
XLSX.utils.sheet_set_array_formula(worksheet, range, formula);

Формулы массива хранятся в верхней левой ячейке блока массива. Все ячейки формулы массива имеют поле F, соответствующее диапазону. Одноклеточную формулу можно отличить от обычной формулы по наличию поля F.

Например, установка ячейки C1 в формулу массива {=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:~
Для многоклеточной формулы массива каждая ячейка имеет один и тот же диапазон массива, но только первая ячейка задает формулу. Рассмотрим `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" };

Утилиты и средства записи должны проверять наличие поля F и игнорировать любой возможный элемент формулы f в ячейках, отличных от начальной ячейки. Они не обязаны выполнять проверку корректности формул!

Динамические формулы массивов

Назначить динамическую формулу массива```js XLSX.utils.sheet_set_array_formula(worksheet, range, formula, true);

root@kitploit:~
Опубликованные в 2020 году, динамические формулы массива поддерживаются в форматах файлов XLSX/XLSM и XLSB. Они представлены как обычные формулы массива, но имеют специальные метаданные ячейки, указывающие, что формуле должно быть разрешено корректировать диапазон.

Формула массива может быть помечена как динамическая путем установки свойства `D` ячейки в true. Ожидается диапазон `F`, но он может быть установлен на текущую ячейку:```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

Локализация с именами функций

SheetJS работает на уровне файлов. Excel хранит формулы, используя английские (США) имена функций. Для пользователей, использующих другие языки, Excel применяет локализованный набор имен функций.

Например, когда язык и регион компьютера установлены на французский (Франция), Excel интерпретирует =SOMME(A1:C3) так, как если бы SOMME была функцией SUM. Однако в самом файле Excel сохраняет SUM(A1:C3).

Префиксные "будущие функции"

Функции, появившиеся в новых версиях Excel, сохраняются в файлах с префиксом _xlfn.. При написании формул с использованием этих функций префикс необходим для максимальной совместимости:```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> Функции, требующие префикса `_xlfn.`</b> (нажмите, чтобы показать)</summary>

Этот список растёт с каждым новым выпуском 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

Свойства строк и столбцов

Поддержка форматов (click to show)

Свойства строк: XLSX/M, XLSB, BIFF8 XLS, XLML, SYLK, DOM, ODS

Свойства столбцов: XLSX/M, XLSB, BIFF8 XLS, XLML, SYLK, DOM

Свойства строк и столбцов не извлекаются по умолчанию при чтении из файла и не сохраняются по умолчанию при записи в файл. Необходимо передать опцию cellStyles: true соответствующей функции чтения или записи.

Свойства столбцов

Массив !cols в каждом рабочем листе, если он присутствует, представляет собой коллекцию объектов ColInfo, которые имеют следующие свойства:```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:~
_Свойства строк_

Массив `!rows` в каждом листе, если он присутствует, представляет собой коллекцию объектов `RowInfo`, обладающих следующими свойствами:```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


Read more

Скачать инструмент
  • Атрибуты уровня книги
    • Определённые имена
    • Представления книги
    • Различные свойства книги
  • Возможности документа
    • Формулы
    • Свойства строк и столбцов
    • Форматы чисел
    • Гиперссылки
    • Комментарии к ячейкам
    • Видимость листа
    • VBA и макросы
  • Параметры разбора
    • Тип ввода
    • Определение типа файла
  • Параметры записи
    • Поддерживаемые выходные форматы
    • Тип вывода
  • Вспомогательные функции
    • Ввод массива массивов
    • Ввод массива объектов
    • Ввод HTML-таблицы
    • Вывод формул
    • Вывод с разделителями
      • Текст Unicode UTF-16
    • HTML-вывод
    • JSON
  • Форматы файлов
  • Тестирование
    • Node
    • Браузер
    • Протестированные окружения
    • Тестовые файлы
  • Вклад
    • OSX/Linux
    • Windows
    • Тесты
  • Лицензия
  • Ссылки
  • Для более широкой поддержки рекомендуется подход XMLHttpRequest:```js var url = "http://oss.sheetjs.com/test_files/formula_stress_test.xlsx";

    /* set up async GET request */ var req = new XMLHttpRequest(); req.open("GET", url, true); req.responseType = "arraybuffer";

    req.onload = function(e) { var workbook = XLSX.read(req.response);

    /* DO SOMETHING WITH workbook HERE */ };

    req.send();

    root@kitploit:~
    The [`xhr` demo](https://github.com/weareu/xlsx/blob/HEAD/demos/xhr/) включает более длинное обсуждение и больше примеров.
    
    <http://oss.sheetjs.com/sheetjs/ajax.html> показывает запасные подходы для IE6+.
    
    </details>
    
    <details>
      <summary><b>Локальный файл в плагине PhotoShop или InDesign</b> (нажмите, чтобы показать)</summary>
    
    `readFile` оборачивает логику `File` в Photoshop и других целях ExtendScript.
    Указанный путь должен быть абсолютным:```js
    #include "xlsx.extendscript.js"
    
    /* Read test.xlsx from the Documents folder */
    var workbook = XLSX.readFile(Folder.myDocuments + "/test.xlsx");
    

    Демонстрация extendscript включает более сложный пример.

    binary

    const bstr = await readFile(path, "ascii"); /* bstr is a binary string */ const workbook = XLSX.read(bstr, {type: "binary"});

    root@kitploit:~
    </details>
    
    <details>
      <summary><b>Загрузка файлов на сервер NodeJS</b> (нажмите, чтобы показать)</summary>
    
    `read` может принимать буфер NodeJS.  `readFile` может читать файлы, сгенерированные парсером тела HTTP POST запроса, таким как [`formidable`](https://npm.im/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);
    
        /* DO SOMETHING WITH workbook HERE */
      });
    }).listen(process.env.PORT || 7262);
    

    The server demo has more advanced examples.

    "HTML Table Input"

    Создание рабочей книги путем извлечения HTML-таблицы на странице```js var workbook = XLSX.utils.table_to_book(dom_element, opts);

    root@kitploit:~
    Вспомогательная функция `table_to_book` следует той же логике, что и `table_to_sheet`.
    После создания рабочего листа она создает пустую книгу и добавляет туда электронную таблицу.
    
    Аргумент `options` поддерживает те же параметры, что и `table_to_sheet`, с добавлением свойства `sheet` для управления именем рабочего листа. Если свойство отсутствует или параметры не указаны, используется имя по умолчанию `Sheet1`.
    
    **Примеры**
    
    Вот несколько распространенных сценариев (нажмите на каждый подзаголовок, чтобы увидеть код):
    
    <details>
      <summary><b>HTML TABLE элемент на веб-странице</b> (нажмите, чтобы показать)</summary>```html
    <!-- include the standalone script and shim.  this uses the UNPKG CDN -->
    <script src="https://unpkg.com/xlsx/dist/shim.min.js"></script>
    <script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script>
    
    <!-- example table with id attribute -->
    <table id="tableau">
      <tr><td>Sheet</td><td>JS</td></tr>
      <tr><td>12345</td><td>67</td></tr>
    </table>
    
    <!-- this block should appear after the table HTML and the standalone script -->
    <script type="text/javascript">
      var workbook = XLSX.utils.table_to_book(document.getElementById("tableau"));
    
      /* DO SOMETHING WITH workbook HERE */
    </script>
    

    Несколько таблиц на веб-странице можно преобразовать в отдельные рабочие листы:```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 */

    root@kitploit:~
    В качестве альтернативы, HTML-код может быть извлечен и проанализирован:```js
    var htmlstr = document.getElementById("tableau").outerHTML;
    var workbook = XLSX.read(htmlstr, {type:"string"});
    

    Все поля можно обработать сразу, используя транспонирование 2D-тензора, созданного с помощью экспорта sheet_to_json с header: 1. Первая строка, если она содержит заголовки, должна быть удалена срезом:```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:~
    The [`array` demo](https://github.com/weareu/xlsx/blob/HEAD/demos/array/) shows a complete example.
    
    </details>
    
    
    ### Создание HTML-таблиц
    
    **API**
    
    _Сгенерировать HTML-таблицу из рабочего листа_```js
    var html = XLSX.utils.sheet_to_html(worksheet);
    

    Функция утилиты sheet_to_html генерирует HTML-код на основе данных рабочего листа. Каждая ячейка рабочего листа отображается в элемент <TD>. Объединённые ячейки рабочего листа сериализуются с помощью установки атрибутов colspan и rowspan.

    Примеры

    Функция утилиты sheet_to_html генерирует HTML-код, который можно добавить в любой DOM-элемент, установив свойство innerHTML:```js var container = document.getElementById("tavolo"); container.innerHTML = XLSX.utils.sheet_to_html(worksheet);

    root@kitploit:~
    В сочетании с `fetch` создание сайта из рабочей книги — это просто:
    
    <details>
      <summary><b>Vanilla JS + HTML: получение рабочей книги через fetch и создание предпросмотра таблиц</b> (нажмите, чтобы показать)</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>
    

    Демонстрация vuejs включает больше примеров React.

    KeyОписание
    vисходное значение (см. раздел Data Types для получения дополнительной информации)
    wформатированный текст (если применимо)
    tтип: b Boolean (логическое), e Error (ошибка), n Number (число), d Date (дата), s Text (текст), z Stub (заглушка)
    fформула ячейки, закодированная в виде строки в стиле A1 (если применимо)
    Fдиапазон окружающего массива, если формула является формулой массива (если применимо)
    Dесли true, формула массива является динамической (если применимо)
    rкодировка форматированного текста (если применимо)
    hHTML-представление форматированного текста (если применимо)
    cкомментарии, связанные с ячейкой
    zстрока числового формата, связанная с ячейкой (если запрошено)
    lобъект гиперссылки ячейки (.Target содержит ссылку, .Tooltip — подсказка)
    sстиль/тема ячейки (если применимо)
    ТипОписание
    bBoolean (логическое): значение интерпретируется как JS boolean
    eError (ошибка): значение — числовой код, а свойство w хранит общепринятое имя **
    nNumber (число): значение — JS number **
    dDate (дата): значение — объект JS Date или строка, которая должна быть разобрана как дата **
    sText (текст): значение интерпретируется как JS string и записывается как текст **
    zStub (заглушка): пустая ячейка-заглушка, игнорируемая утилитами обработки данных **
    ЗначениеЗначение ошибки
    0x00#NULL!
    0x07#DIV/0!
    0x0F#VALUE!
    0x17#REF!
    0x1D#NAME?
    0x24#NUM!
    0x2A#N/A
    0x2B#GETTING_DATA
    false
    keyфункция (true=отключено / false=включено)по умолчанию
    selectLockedCellsВыбор заблокированных ячееквключено
    selectUnlockedCellsВыбор разблокированных ячееквключено
    formatCellsФорматирование ячеекотключено
    formatColumnsФорматирование столбцовотключено
    formatRowsФорматирование строкотключено
    insertColumnsВставка столбцовотключено
    insertRowsВставка строкотключено
    insertHyperlinksВставка гиперссылокотключено
    deleteColumnsУдаление столбцовотключено
    deleteRowsУдаление строкотключено
    sortСортировкаотключено
    autoFilterФильтрацияотключено
    pivotTablesИспользование отчётов сводных таблицотключено
    objectsРедактирование объектоввключено
    scenariosРедактирование сценариеввключено
    КлючОписание
    SheetОбласть имени. Индекс листа (0 = первый лист) или null (книга)
    NameИмя с учетом регистра. Применяются стандартные правила **
    RefСсылка в стиле A1 ("Лист1!$A$1:$D$20")
    CommentКомментарий (применимо только для XLS/XLSX/XLSB)
    filterPrivacy
    Предупреждать или удалять идентифицирующую информацию при сохранении
    Представление храненияФорматыЧтениеЗапись
    Строки в стиле A1XLSX✔✔
    Строки в стиле RCXLML и обычный текст✔✔
    BIFF Parsed formulaeXLSB и все форматы XLS✔
    OpenFormula формулыODS/FODS/UOS✔✔
    Lotus Parsed formulaeВсе форматы Lotus WK_✔

    Поскольку Excel запрещает именованным ячейкам совпадать с именами ссылок в стиле A1 или RC, возможно (не такое уж и простое) преобразование с помощью регулярных выражений. BIFF Parsed formulae и Lotus Parsed formulae необходимо явно разворачивать. OpenFormula формулы можно преобразовывать с помощью регулярных выражений.

    Общие формулы распаковываются, и каждая ячейка получает формулу, соответствующую своей ячейке. Разработчики обычно не пытаются создавать общие формулы.