Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
xlsx — CVE-2023-30533 および CVE-2024-22363 の修正を含む SheetJS xlsx 0.18.5 フォーク | Kitploit
ツール/GitHubGitHub/weareu/xlsx
汎用ユーティリティ暗号化/復号化ツールデータ復旧ユーティリティとフレームワーク
GitHubweareu/xlsx

xlsx

CVE-2023-30533 および CVE-2024-22363 の修正を含む SheetJS xlsx 0.18.5 フォーク

リポジトリを見る
6ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

SheetJS

SheetJS Community Editionは、実戦で検証されたオープンソースソリューションを提供し、ほぼすべての複雑なスプレッドシートから有用なデータを抽出し、レガシーおよび最新のソフトウェアの両方で動作する新しいスプレッドシートを生成します。

SheetJS Proは、データ処理を超えたソリューションを提供します。複雑なテンプレートを簡単に編集。スタイリングで内なるピカソを解き放ちましょう。画像/グラフ/ピボットテーブルを使ったカスタムシートの作成。数式の評価と計算のWebアプリへの移植。一般的なスプレッドシートタスクの自動化など、さらに多くの機能があります。

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.jsストリームユーティリティを削除

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

root@kitploit:~
**ECMAScript モジュール**

ECMAScript Module ビルドは `xlsx.mjs` に保存され、`type=module` を使用した `script` タグでページに直接追加できます:```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 パッケージ も、Angularやその他のプロジェクトでサポートされている module パラメータを使ってモジュールを公開しています。```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");

このモジュールには、import で使用するための xlsx.mjs も同梱されています。```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` は、Photoshop および InDesign 向けの ExtendScript ビルドで、`npm` パッケージに含まれています。

これは `#include` ディレクティブで直接参照できます:```extendscript
#include "xlsx.extendscript.js"
Internet Explorer と ECMAScript 3 の互換性 (クリックして表示)

JavaScriptエンジンとの広範な互換性のため、このライブラリはECMAScript 3の言語方言に加え、Array#forEachなどの一部のES5機能を使用して記述されています。 古いブラウザでは、不足している関数を提供するためにshimが必要です。

shimを使用するには、xlsx.jsを読み込むスクリプトタグの前にshimを追加してください:```html

root@kitploit:~
スクリプトには、Internet Explorer バージョン 6~9 でファイルを読み込んだり保存したりするための `IE_LoadFile` および `IE_SaveFile` も含まれています。`xlsx.extendscript.js` スクリプトは、Photoshop や他の Adobe 製品に適した形式でシムをバンドルしています。

</details>

### 使用方法

スプレッドシートとデータを含むほとんどのシナリオは、5 つの部分に分けられます。

1) **データの取得**: データはどこにでも保存できます。ローカルまたはリモートのファイル、データベース、HTML TABLE、あるいは Web ブラウザでプログラム的に生成されたものでも構いません。

2) **データの抽出**: スプレッドシートファイルの場合、生のバイトを解析してセルデータを読み取ります。一般的な JS データの場合は、データの再構成を行います。

3) **データの処理**: 要約統計の生成からデータレコードのクリーニングまで、このステップが問題の中核です。

4) **データのパッケージ化**: 新しいスプレッドシートの作成、`JSON.stringify` によるシリアライズ、XML の書き出し、あるいは UI ツール向けにデータを単純にフラット化することなどが含まれます。

5) **データのリリース**: スプレッドシートファイルはサーバーにアップロードするか、ローカルに書き出すことができます。データは HTML TABLE やデータグリッドでユーザーに提示できます。

一般的な問題として、HTML テーブルに保存されたデータから有効なスプレッドシートのエクスポートを生成することがあります。この例では、ページ上の 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");

セル値の変更

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 ユーティリティ関数は、ワークシート内のセル値を変更します。最初の引数はワークシートオブジェクトです。2番目の引数は値の配列の配列です。3番目の引数の 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"](#array-of-arrays-input) は、関数とオプションの `opts` 引数について詳しく説明しています。

**例**

<details>
  <summary><b>ワークシートに行を追加する</b> (クリックして表示)</summary>

特別な原点値 `-1` は、`sheet_add_aoa` に範囲内の最終行の次の行の列 A から開始するよう指示し、データを追加します:

```js
// sheet_add_aoa appends rows
// var ws = XLSX.utils.aoa_to_sheet(data);
// XLSX.utils.sheet_add_aoa(ws, new_data, {origin: -1});
``````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ファイルが生成されますが、これは`opts`引数の`bookType`プロパティで制御できます。`type`オプションに基づき、データは"バイナリ文字列"、JS文字列、`Uint8Array`、またはBufferとして保存できます。

2番目の`opts`引数は必須です。[“書き込みオプション”](#writing-options)では、サポートされているプロパティと動作について説明しています。

_ファイルを生成して保存を試みる_```js
XLSX.writeFile(workbook, filename, opts);

writeFileメソッドはデータをパッケージ化し、新しいファイルの保存を試みます。エクスポートファイル形式はfilenameの拡張子によって決まります(SheetJS.xlsxはXLSXエクスポート、SheetJS.xlsbはXLSBエクスポートなどを示します)。

writeFileメソッドは、プラットフォーム固有のAPIを使用してファイル保存を開始します。NodeJSでは、fs.readFileSyncでファイルを作成できます。Webブラウザでは、HTML5のdownload属性を使用してダウンロードが試みられ、IE向けのフォールバックもあります。

XLSXファイルを生成して保存を試みる```js XLSX.writeFileXLSX(workbook, filename, opts);

root@kitploit:~
The `writeFile` メソッドは、さまざまなエクスポート関数を内蔵しています。 これは
開発者にとって優れた体験を提供しますが、現在の開発ツールではツリーシェイキングに適していません。
XLSX エクスポートのみが必要な場合、このメソッドは他のエクスポート関数を参照しないようにします。

2 番目の `opts` 引数はオプションです。 ["Writing Options"](#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");

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

PhotoShop または InDesign プラグイン内のローカルファイル(クリックして表示)

writeFile は、Photoshop やその他の ExtendScript ターゲットにおける File ロジックをラップします。 指定するパスは絶対パスである必要があります:```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` は、ファイル保存をトリガーするためのIE10+ APIです。
- `IE_FileSave` は、VBScriptとActiveXを使用して、Windows XPおよびWindows 7向けのIE6+でファイルを書き込みます。 シムは、それを含む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"
});

The oldie demo は、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(ヘッドレスWebkit)ファイル生成</b>(クリックして表示)</summary>

[`headless` デモ](https://github.com/weareu/xlsx/blob/HEAD/demos/headless/) には、[PhantomJS](https://phantomjs.org/) を使用してHTMLファイルをXLSBワークブックに変換する完全なデモが含まれています。PhantomJS
の `fs.write` はメインプロセスからのファイル書き込みをサポートしていますが、NodeJSの `fs` モジュールとは異なるインターフェースを持っています:```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");

注記:セクション"Processing HTML Tables"は、「ヘッドレスWebKit」のページからHTMLテーブルを基にワークブックを生成する方法を示しています。

同梱のデモでは、モバイルアプリやその他の特別なデプロイメントをカバーしています。

書き込みの例

  • http://sheetjs.com/demos/table.html HTMLテーブルのエクスポート
  • http://sheetjs.com/demos/writexlsx.html シンプルなファイルを生成

ストリーミング書き込み

ストリーミング書き込み関数はXLSX.streamオブジェクトで利用可能です。通常の書き込み関数と同じ引数を取りますが、NodeJSのReadable Streamを返します。

  • 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 のストリーミング版です。
nodejsでCSVに変換してファイルに書き込む (クリックして表示)```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>

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

root@kitploit:~
_Deno_```ts
import * as XLSX from './xlsx.mjs';
import XLSX_ZAHL from './dist/xlsx.zahl.mjs';

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

https://github.com/sheetjs/sheetaki は write streams を nodejs の response にパイプします。

JSONおよびJSデータの生成

JSONおよびJSデータは通常、単一のワークシートを表します。このセクションのユーティリティ関数は単一のワークシートを対象としています。

「共通スプレッドシート形式」のセクションでは、オブジェクト構造について詳しく説明しています。 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 ユーティリティ関数は、ワークブックを行優先順で走査し、 オブジェクトの配列を生成します。2 番目の引数 opts は、値の型(JS 値またはフォーマット済みテキスト)など、 様々なエクスポート設定を制御します。引数の詳細については、「JSON」 セクションで説明されています。

デフォルトでは、sheet_to_json は最初の行をスキャンし、その値をヘッダーとして使用します。 header: 1 オプションを指定すると、関数は値の配列の配列をエクスポートします。

例

x-spreadsheet は、Web ブラウザ上で構造化データをプレビューおよび変更するための インタラクティブなデータグリッドです。xspreadsheet デモ には、 ワークブックを x-spreadsheet データオブジェクトに変換する stox 関数を含むサンプルスクリプトがあります。 https://oss.sheetjs.com/sheetjs/x-spreadsheet はライブデモです。

React データグリッドでのデータプレビュー (クリックして表示)

react-data-grid は、React 向けに特化したデータグリッドです。 このコンポーネントは、データオブジェクトの rows とカラムを記述する columns の 2 つのプロパティを期待します。 データを react-data-grid の API に合わせて整形するには、配列の配列から始めるのが最も簡単です。

このデモでは、まずリモートファイルを取得し、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>(クリックして表示)</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またはNoSQL)へのデータ投入</b>(クリックして表示)</summary>

[`database` デモ](https://github.com/weareu/xlsx/blob/HEAD/demos/database/)には、データベースおよびクエリ結果を扱う例が含まれています。

</details>

<details>
  <summary><b>TensorFlow.jsを用いた数値計算</b>(クリックして表示)</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に適したワークフローを使用することをお勧めしますが、dangerouslySetInnerHTMLを使用してHTMLを生成し、Reactで利用することも可能です。```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` デモ](https://github.com/weareu/xlsx/blob/HEAD/demos/react)には、さらに多くのReactの例が含まれています。

</details>

<details>
  <summary><b>VueJSでワークブックを取得し、HTMLテーブルプレビューを生成する</b>(クリックして表示)</summary>

一般的にはVueJSに適したワークフローを使用することが推奨されますが、`v-html`ディレクティブを使用してHTMLを生成し、VueJSで利用することも可能です。```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 Text (.txt)" 出力タイプを再現するように設計されています。 "デリミタ区切り出力"は、関数とオプションの opts 引数についてより詳しく説明しています。

単一のワークシートから数式のリストを生成する```js var fmla = XLSX.utils.sheet_to_formulae(worksheet);

root@kitploit:~
このスナップショットは、埋め込まれた数式を表すエントリの配列を生成します。
配列数式は `range=formula` の形式でレンダリングされ、通常のセルは
`cell=formula or value` の形式でレンダリングされます。文字列リテラルは先頭に
アポストロフィ `'` が付加され、Excelの数式バーの表示と一致します。

["Formulae Output"](#formulae-output) に関数の詳細が記載されています。

## インターフェース

`XLSX` はブラウザで公開される変数であり、エクスポートされるNode変数です。

`XLSX.version` はライブラリのバージョンです(ビルドスクリプトによって追加されます)。

`XLSX.SSF` は [format library](https://git.io/ssf) の埋め込みバージョンです。

### パース関数

`XLSX.read(data, read_opts)` は `data` のパースを試みます。

`XLSX.readFile(filename, read_opts)` は `filename` を読み取り、パースを試みます。

パースオプションは [Parsing Options](#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` が省略された場合、ライターは3番目の引数をコールバックとして使用します。

`XLSX.stream` にはストリーミング書き出し関数のセットが含まれています。

書き出しオプションは [Writing Options](#writing-options) セクションで説明されています。

### ユーティリティ

ユーティリティは `XLSX.utils` オブジェクトで利用可能で、以下に説明されています。
[Utility Functions](#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}}` で表されます。
ユーティリティ関数は、シート範囲を行優先順で走査します。```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);
  }
}

セルオブジェクト

セルオブジェクトは、以下の規則に従ったキーと値を持つプレーンなJSオブジェクトです。

組み込みのエクスポートユーティリティ (CSVエクスポーターなど) は、利用可能であれば w テキストを使用します。 値を変更するには、エクスポートを試みる前に cell.w を削除する (または undefined に設定する) ことを忘れないでください。 ユーティリティは、可能な場合、数値書式 (cell.z) と生の値から w テキストを再生成します。

実際の配列数式は、配列範囲内の最初のセルの f フィールドに格納されます。 範囲内の他のセルは f フィールドを持ちません。

データ型

生の値は v 値プロパティに格納され、t 型プロパティに基づいて解釈されます。 この分離により、数値と数値テキストの両方を表現できます。 有効なセル型は6つあります:

エラー値とその解釈 (クリックして表示)

型 n は数値型です。これには、Excelが数値として保存するすべての形式のデータ (日付/時刻やブール値フィールドなど) が含まれます。 Excelは、JSのNumberと同様に、IEEE754浮動小数点数に収まるデータのみを排他的に使用するため、v フィールドは生の数値を保持します。 w フィールドは整形されたテキストを保持します。 日付はデフォルトで数値として保存され、XLSX.SSF.parse_date_code を使用して変換されます。

型 d は日付型で、オプション cellDates が渡された場合にのみ生成されます。 JSONにはネイティブの日付型がないため、パーサーは一般的に date.toISOString() で得られるようなISO 8601日付文字列を格納することが期待されます。 一方、ライターとエクスポーターは日付文字列とJS Dateオブジェクトの両方を処理できる必要があります。 Excelはタイムゾーン修飾子を無視し、すべての日付をローカルタイムゾーンで扱うことに注意してください。 ライブラリはこのエラーを修正しません。

型 s は文字列型です。 値は明示的にテキストとして格納されます。 Excelはこれらのセルを「数値として保存されたテキスト」として解釈します。 生成されるExcelファイルは自動的にその種のエラーを抑制しますが、他の形式ではエラーが発生する可能性があります。

型 z は空白のスタブセルを表します。 これらは、セルに値が割り当てられていないが、コメントやその他のメタデータを保持している場合に生成されます。 これらはコアライブラリのデータ処理ユーティリティ関数によって無視されます。 デフォルトではこれらのセルは生成されません。 パーサーの sheetStubs オプションを true に設定する必要があります。

日付

Excel日付コードの詳細 (クリックして表示)

デフォルトでは、Excelは日付を数値と日付処理を指定する書式コードとして保存します。 たとえば、日付 19-Feb-17 は数値 42785 として、数値書式 d-mmm-yy で保存されます。 SSF モジュールは数値書式を理解し、適切な変換を実行します。

XLSXは、データがISO 8601日付文字列である特別な日付型 d もサポートしています。 フォーマッタは日付を数値に戻します。

すべてのパーサーのデフォルトの動作は、数値セルを生成することです。 cellDates をtrueに設定すると、ジェネレーターは日付を保存するよう強制されます。

タイムゾーンと日付 (クリックして表示)

Excelには、ユニバーサルタイムのネイティブな概念はありません。 すべての時刻はローカルタイムゾーンで指定されます。 Excelの制限により、真の絶対日付を指定することはできません。

Excelに従い、このライブラリはすべての日付をローカルタイムゾーンからの相対として扱います。

エポック: 1900年と1904年 (クリックして表示)

Excelは2つのエポック (1900年1月1日と1904年1月1日) をサポートしています。 ワークブックのエポックは、ワークブックの 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の"normal"プリセットに従います。Excelには"wide"と"narrow"のプリセットもありますが、それらは生の測定値として保存されます。主なプロパティは以下の通りです:

<details>
  <summary><b>ページ余白の詳細</b>(クリックして表示)</summary>

| key      | 説明                  | 標準     | 広い     | 狭い      |
|----------|------------------------|:---------|:-------|:-------- |
| `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のデフォルト設定にデフォルト設定されます。

keyExcelの機能デフォルト
above「詳細の下にサマリー行を表示」のチェックを外すfalse
left「詳細の右にサマリー列を表示」のチェックを外すfalse
  • ws['!protect']: 書き込みシート保護プロパティのオブジェクト。passwordキーは、パスワード保護されたシートをサポートする形式(XLSX/XLSB/XLS)のパスワードを指定します。ライターはXOR難読化方式を使用します。次のキーがシート保護を制御します。シートがロックされているときに機能を有効にするにはfalseに設定し、機能を無効にするにはtrueに設定します。
ワークシート保護の詳細(クリックして表示)
  • ws['!autofilter']: スキーマに従ったAutoFilterオブジェクト:```typescript type AutoFilter = { ref:string; // A-1 based range representing the AutoFilter table range }
root@kitploit:~
#### Chartシートオブジェクト

Chartシートは標準的なシートとして表現されます。`!type` プロパティが `"chart"` に設定されていることで区別されます。

基盤となるデータと `!ref` は chartシート内のキャッシュデータを参照します。chartシートの最初の行が基盤となるヘッダーです。

#### Macroシートオブジェクト

Macroシートは標準的なシートとして表現されます。`!type` プロパティが `"macro"` に設定されていることで区別されます。

#### Dialogシートオブジェクト

Dialogシートは標準的なシートとして表現されます。`!type` プロパティが `"dialog"` に設定されていることで区別されます。

### Workbookオブジェクト

`workbook.SheetNames` はワークブック内のシートの順序付きリストです。

`wb.Sheets[sheetname]` はワークシートを表すオブジェクトを返します。

`wb.Props` は標準プロパティを格納するオブジェクトです。`wb.Custprops` はカスタムプロパティを格納します。XLSの標準プロパティがXLSX標準と異なるため、XLSのパースではコアプロパティを両方の場所に格納します。

`wb.Workbook` は [ワークブックレベルの属性](#workbook-level-attributes) を格納します。

#### Workbookファイルプロパティ

様々なファイル形式はファイルプロパティに異なる内部名を使用します。ワークブックの `Props` オブジェクトは名前を正規化します:

<details>
  <summary><b>ファイルプロパティ</b> (クリックして表示)</summary>

| JS名         | Excelの説明                  |
|:-------------|:-----------------------------|
| `Title`      | 概要タブ "Title"            |
| `Subject`    | 概要タブ "Subject"          |
| `Author`     | 概要タブ "Author"           |
| `Manager`    | 概要タブ "Manager"          |
| `Company`    | 概要タブ "Company"          |
| `Category`   | 概要タブ "Category"         |
| `Keywords`   | 概要タブ "Keywords"         |
| `Comments`   | 概要タブ "Comments"         |
| `LastAuthor` | 統計タブ "Last saved by"    |
| `CreatedDate`| 統計タブ "Created"          |

</details>

例えば、ワークブックのタイトルプロパティを設定するには:

```js
 workbook.Props.Title = "Test";
``````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 では、同じ名前を共有するシートスコープの定義名を2つ使用できます。 ただし、シートスコープの名前はワークブックスコープの名前と競合することはできません。 ワークブックのライターはこの制約を強制しない場合があります。

ワークブックビュー

wb.Workbook.Views はワークブックビューオブジェクトの配列で、以下のキーを持ちます:

キー説明
RTL右から左に表示する場合は true

その他のワークブックプロパティ

wb.Workbook.WBProps はその他のワークブックプロパティを保持します:

キー説明
CodeNameVBA プロジェクトワークブックコード名
date1904エポック: 0/false は1900システム、1/true は1904
filterPrivacy保存時に個人を特定する情報を警告または削除

ドキュメント機能

日付の保存のような基本的な機能であっても、公式の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:~
If the actual results are needed in JS, [SheetJS Pro](https://sheetjs.com/pro)
offers a formula calculator component for evaluating expressions, updating
values and dependent cells, and refreshing entire workbooks.


**配列数式**

_配列数式を代入する_```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:~
ファイルを読み込むとき、`xlfn`オプションはプレフィックスを保持します。

<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

行プロパティと列プロパティ

フォーマット対応状況 (クリックして表示)

行プロパティ: 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:~
_Row Properties_

各ワークシート内の`!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

Excel UIは基本アウトラインを1、最大レベルを8として表示します。JSの規則に従い、SheetJSでは基本アウトラインを0、最大レベルを7とする0始まりのアウトラインを使用します。

なぜ3種類の幅があるのか?(クリックして表示)

スプレッドシートが列幅を保存する3つの異なる方法に対応する3つの異なる幅タイプがあります。

SYLKおよび他のプレーンテキスト形式は生の文字数を使用します。VisicalcやMultiplanなどの同時期のツールは文字ベースでした。文字の幅が同じだったため、文字数を保存すれば十分でした。この伝統はBIFF形式にも引き継がれました。

SpreadsheetML(2003)は、ファイル全体で画面ピクセル数を標準化することでHTMLとの整合性を図りました。列幅、行の高さ、その他の測定はピクセルを使用します。ピクセル数と文字数が一致しない場合、Excelは値を丸めます。

XLSXは内部的に列幅を曖昧な「最大桁幅(Max Digit Width)」形式で保存します。最大桁幅とは、レンダリング時の最大桁の幅(通常「0」の文字が最も広い)です。内部幅は、幅を256で割った値の整数倍でなければなりません。ECMA-376はピクセルと内部幅を変換する式を説明しています。これはハイブリッドなアプローチです。

読み取り関数は3つのプロパティすべてに入力しようとします。書き込み関数は指定された値を目的のタイプに変換しようとします。潜在的な競合を避けるために、操作する前に他のプロパティを削除する必要があります。例えば、ピクセル幅を変更する場合、wchおよびwidthプロパティを削除します。

実装の詳細(クリックして表示)

行の高さ

Excelは内部的に行の高さをポイントで保存します。デフォルトの解像度は72 DPIまたは96 PPIなので、ピクセルとポイントサイズは一致するはずです。異なる解像度では一致しない可能性があるため、ライブラリはこれらの概念を分離しています。

すべての情報が利用可能であるにもかかわらず、書き込み関数は以下の優先順位に従うことが期待されます:

  1. 利用可能な場合はhpxピクセル高を使用する
  2. 利用可能な場合はhptポイント高を使用する

列の幅

制約により、実際にフォントを検査しなくてもMDWを決定することが可能です!パーサーは幅からピクセルへ、そして戻す変換をすべての可能なMDWに対して繰り返し、誤差を最小化するMDWを選択することでピクセル幅を推測します。XLMLは実際にピクセル幅を保存するため、推測は逆方向に機能します。

すべての情報が利用可能であるにもかかわらず、書き込み関数は以下の優先順位に従うことが期待されます:

  1. 利用可能な場合はwidthフィールドを使用する
  2. 利用可能な場合はwpxピクセル幅を使用する
  3. 利用可能な場合はwch文字数を使用する

数値書式

各セルのcell.w形式テキストは、cell.vとcell.z形式から生成されます。形式が指定されていない場合、ExcelのGeneral形式が使用されます。形式は文字列として、または書式テーブルのインデックスとして指定できます。パーサーはworkbook.SSFに数値書式テーブルを設定することが期待されます。書き込み関数はテーブルをシリアライズすることが期待されます。

カスタムツールは、ローカルテーブルに各使用書式文字列がテーブル内のどこかに存在することを確認する必要があります。Excelの規則では、カスタム書式はインデックス164から始まることが義務付けられています。次の例では、ゼロからカスタム書式を作成します:

カスタム書式を含む新しいワークシート(クリックして表示)```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 } } } ```

ルールは、Excelがカスタム数値書式を表示する方法とは若干異なります。 特に、リテラル文字は二重引用符で囲むか、バックスラッシュを前に付ける必要があります。 詳細については、Excelのドキュメント記事「Create or delete a custom number format」またはECMA-376 18.8.31(Number Formats)を参照してください。

既定の数値書式(クリックして表示)

既定の書式はECMA-376 18.8.30に一覧表示されています。

書式14(m/d/yy)はExcelによってローカライズされます。ファイルでその数値書式が指定されていても、システム設定に基づいて異なる表示になります。ファイルの作成者と利用者が同じロケールにある場合は問題ありませんが、インターネット上では常にそうとは限りません。このあいまいさを回避するために、解析関数はdateNFオプションを受け入れ、その特定の書式文字列の解釈を上書きします。

ハイパーリンク

書式サポート(クリックして表示)

セルハイパーリンク: XLSX/M、XLSB、BIFF8 XLS、XLML、ODS

ツールチップ: XLSX/M、XLSB、BIFF8 XLS、XLML

ハイパーリンクはセルオブジェクトのlキーに保存されます。ハイパーリンクオブジェクトのTargetフィールドはリンクのターゲット(URIフラグメントを含む)です。ツールチップはTooltipフィールドに保存され、マウスをテキスト上に移動すると表示されます。

たとえば、次のスニペットは、セルA3からhttps://sheetjs.comへのリンクを作成し、ツールチップ"Find us @ SheetJS.com!"を付けます。```js ws['A1'].l = { Target:"https://sheetjs.com", Tooltip:"Find us @ SheetJS.com!" };

root@kitploit:~
Excelは自動的にハイパーリンクのスタイルを設定しないことに注意してください -- 通常は通常のテキストとして表示されます。

_リモートリンク_

HTTP / HTTPSリンクは直接使用できます:```js
ws['A2'].l = { Target:"https://docs.sheetjs.com/#hyperlinks" };
ws['A3'].l = { Target:"http://localhost:7262/yes_localhost_works" };

Excelはまたmailtoメールリンクを件名付きでサポートしています:```js ws['A4'].l = { Target:"mailto:[email protected]" }; ws['A5'].l = { Target:"mailto:[email protected]?subject=Test Subject" };

root@kitploit:~
_ローカルリンク_

絶対パスへのリンクは、`file://` URIスキームを使用する必要があります:```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 */

相対パスへのリンクは、スキームなしで指定できます:```js ws['B3'].l = { Target:"SheetJS.xlsb" }; /* Link to SheetJS.xlsb / ws['B4'].l = { Target:"../SheetJS.xlsm" }; / Link to ../SheetJS.xlsm */

root@kitploit:~
相対パスは、SpreadsheetML 2003 形式では未定義の動作をします。  Excel
2019 は、`..\` という親マークを2階層上として扱います。

_Internal Links_

ターゲットが同じワークブック内のセル、範囲、または定義された名前であるリンク("Internal Links")は、先頭のハッシュ文字でマークされます。```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 */

セルコメント

セルコメントは、セルオブジェクトの c 配列に格納されるオブジェクトです。 実際の コメントの内容は、コメント作成者に基づいてブロックに分割されます。 その 各コメントオブジェクトの a フィールドはコメントの作成者であり、t フィールドは プレーンテキスト表現です。

例えば、以下のスニペットはセル 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:~
注: XLSB は Author 名に 54 文字の制限を課しています。名前が 54 文字を超える
と、他の形式で問題を引き起こす可能性があります。

コメントを通常非表示としてマークするには、`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"});

スレッド化されたコメント

Excel 365で導入されたスレッド化されたコメントは、作成者メタデータと親参照を持つプレーンテキストのコメントスニペットです。XLSXおよびXLSBでサポートされています。

コメントをスレッド化済みとしてマークするには、各コメント部分に真の T プロパティが必要です:```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:~
スレッド内の作成者に関連付けられたActive DirectoryやOffice 365のメタデータはありません。

#### シートの表示設定

Excelでは、下部のタブバーでシートを非表示にできます。シートデータはファイルに保存されますが、UIからは簡単に利用できません。標準の非表示シートは「再表示」メニューで表示されます。Excelには、メニューでは表示できない「非常に非表示」のシートもあります。これはVBエディタでのみアクセスできます!

表示設定はシートプロパティ配列の`Hidden`プロパティに保存されます。

<details>
  <summary><b>詳細</b> (クリックして表示)</summary>

| 値    | 定義         |
|:-----:|:-------------|
|   0   | 表示         |
|   1   | 非表示       |
|   2   | 非常に非表示 |

With <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 ] ]

Excel以外のフォーマットはVery Hidden状態をサポートしていません。 シートが表示されているかどうかをテストする最善の方法は、Hidden プロパティが論理的真であるかどうかを確認することです。```js

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

root@kitploit:~
</details>

#### VBAとマクロ

VBAマクロは、`bookVBA`オプションが`true`の場合にワークブックオブジェクトの`vbaraw`プロパティで公開される特別なデータブロブに保存されます。これらは`XLSM`、`XLSB`、および`BIFF8 XLS`形式でサポートされています。対応する形式ライターは、ワークブックに存在する場合は自動的にデータブロブを挿入し、ワークシート名に関連付けます。

<details>
	<summary><b>カスタムコード名</b>(クリックして表示)</summary>

ワークブックのコード名は`wb.Workbook.WBProps.CodeName`に保存されます。デフォルトでは、Excelは`ThisWorkbook`または`DieseArbeitsmappe`のような翻訳されたフレーズを書き込みます。ワークシートとグラフシートのコード名は、ワークブックプロパティオブジェクトの`wb.Workbook.Sheets[i].CodeName`にあります。マクロシートとダイアログシートは無視されます。

リーダーとライターはコード名を保持しますが、別のワークブックにVBAブロブを追加する場合は手動で設定する必要があります。

</details>

<details>
	<summary><b>マクロシート</b>(クリックして表示)</summary>

古いバージョンのExcelでは、自動化コマンドを保存する非VBAの「マクロシート」シートタイプもサポートしていました。これらは`!type`プロパティが`"macro"`に設定されたオブジェクトで公開されます。

</details>

<details>
	<summary><b>ワークブック内のマクロの検出</b>(クリックして表示)</summary>

`vbaraw`フィールドはマクロが存在する場合にのみ設定されるため、テストは簡単です。```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');
}

解析オプション

エクスポートされた read および readFile 関数は、オプション引数を受け入れます:

  • cellNF が false の場合でも、書式設定されたテキストが生成され .w に保存されます。
  • 場合によっては、bookSheets が false でもシートが解析されることがあります。
  • Excel は CSV やその他のプレーンテキストから値を解釈しようと積極的に試みます。これにより驚くべき動作が発生します! raw オプションは値の解析を抑制します。
root@kitploit:~

---

[Read more](https://github.com/weareu/xlsx)
ツールをダウンロード
  • ドキュメント機能
    • 数式
    • 行と列のプロパティ
    • 数値形式
    • ハイパーリンク
    • セルコメント
    • シートの可視性
    • VBAとマクロ
  • 解析オプション
    • 入力タイプ
    • ファイルタイプの推測
  • 書き出しオプション
    • サポートされる出力形式
    • 出力タイプ
  • ユーティリティ関数
    • 配列の配列入力
    • オブジェクトの配列入力
    • HTMLテーブル入力
    • 数式出力
    • 区切り文字区切り出力
      • UTF-16 Unicodeテキスト
    • HTML出力
    • JSON
  • ファイル形式
  • テスト
    • Node
    • ブラウザ
    • テスト環境
    • テストファイル
  • コントリビューション
    • OSX/Linux
    • Windows
    • テスト
  • ライセンス
  • 参照
  • このライブラリは、スプレッドシートファイルから有用なデータを抽出する(read/readFile)関数と、データから新しいスプレッドシートファイルを生成する(write/writeFile)関数を用いて、ステップ2と4を簡略化しようとするものです。table_to_book のような追加のユーティリティ関数は、HTMLテーブルなどの他の一般的なデータソースと連携します。

    このドキュメントと様々なデモプロジェクトでは、ステップ1と5に関する一般的なシナリオとアプローチをいくつか取り上げています。

    ユーティリティ関数はステップ3の助けとなります。

    "Acquiring and Extracting Data" では、一般的なデータインポートシナリオの解決策について説明しています。

    "Packaging and Releasing Data" では、一般的なデータエクスポートシナリオの解決策について説明しています。

    "Processing Data" では、一般的なワークブックの処理と操作のシナリオの解決策について説明しています。

    "Utility Functions" では、JSON配列やその他の一般的なJavaScript構造をワークシートオブジェクトに変換するためのユーティリティ関数について詳しく説明しています。

    SheetJSの禅

    データ処理はあらゆるワークフローに適合するべき

    このライブラリは、独立したライフサイクルを課しません。あらゆるフレームワークで構築されたウェブサイトやアプリケーションに自然に適合します。プレーンなJavaScriptデータオブジェクトは、Web Workersや将来のAPIとも親和性が高いです。

    JavaScriptはデータ処理に強力な言語である

    "Common Spreadsheet Format" は、ワークブックのコア概念をシンプルなオブジェクトで表現したものです。ライブラリ内の様々な関数は、このオブジェクトを操作するための低レベルツールを提供します。

    親しみやすいJS処理のために、ワークシートの一部を配列の配列との間で変換するユーティリティ関数があります。次の例では、強力なJavaScript配列メソッドとネットワークリクエストライブラリを組み合わせて、データをダウンロードし、必要な情報を選択し、ワークブックファイルを生成しています。

    JSONエンドポイントからデータを取得し、ワークブックを生成する(クリックして表示)

    目標は、アメリカ合衆国大統領の名前と誕生日を含む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" ] }

    root@kitploit:~
    _Filtering for Presidents_
    
    データセットには、大統領になったことのない副大統領であるアーロン・バーが含まれています!
    
    `Array#filter` は、目的の行を含む新しい配列を作成します。大統領は、`type` が `"prez"` に設定された少なくとも1期を務めました。特定の行に少なくとも1つの `"prez"` 期があるかどうかをテストするには、`Array#some` という別のネイティブJS関数があります。完全なフィルタは次のようになります:```js
    const prez = raw_data.filter(row => row.terms.some(term => term.type === "prez"));
    

    データの準備

    この例では、名前は名と姓を組み合わせたものになります (row.name.first + " " + row.name.last)そして誕生日はサブフィールドの row.bio.birthdayになります。 Array#mapを使用すると、データセットを1回の呼び出しで整形できます:

    root@kitploit:~
    var dataset = api.list.map(function(row) {
        return {
            name: row.name.first + " " + row.name.last,
            birthday: row.bio.birthday
        };
    });
    ``````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 はワークシートをワークブックに追加します。新しいワークシートは "Dates" と呼ばれます:```js const workbook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(workbook, worksheet, "Dates");

    root@kitploit:~
    **Process Data**
    
    _Fixing headers_
    
    デフォルトでは、`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:~
    `rows`に対する`Array#reduce`の呼び出し一つで、最大幅を計算できます:```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");
    })();
    

    Webブラウザで使用する場合、スニペットが snippet.js に保存されていると仮定して、axios と xlsx のスタンドアロンビルドを含めるためにスクリプトタグを使用する必要があります。```html

    root@kitploit:~
    </details>
    
    _ファイル形式は実装の詳細です_
    
    パーサーは、実際のXLSやXLSXファイルと同様に「HTMLとして保存されたXLS」ファイルも機能するように、一般的なスプレッドシートファイル形式の広範囲をカバーしています。
    
    ライターは、データエコシステムとの幅広い互換性のために、多数の一般的な出力形式をサポートしています。
    
    可能な限り、データ処理コードは関与する特定のファイル形式を気にする必要がないようにすべきです。
    
    ### JSエコシステムデモ
    
    [`demos`ディレクトリ](https://github.com/weareu/xlsx/blob/HEAD/demos/)には以下のサンプルプロジェクトが含まれています:
    
    **フレームワークとAPI**
    - [`angularjs`](https://github.com/weareu/xlsx/blob/HEAD/demos/angular/)
    - [`angular and 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 and react-native`](https://github.com/weareu/xlsx/blob/HEAD/demos/react/)
    - [`vue 2.x and weex`](https://github.com/weareu/xlsx/blob/HEAD/demos/vue/)
    - [`XMLHttpRequest and fetch`](https://github.com/weareu/xlsx/blob/HEAD/demos/xhr/)
    - [`nodejs server`](https://github.com/weareu/xlsx/blob/HEAD/demos/server/)
    - [`databases and key/value stores`](https://github.com/weareu/xlsx/blob/HEAD/demos/database/)
    - [`typed arrays and math`](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 application`](https://github.com/weareu/xlsx/blob/HEAD/demos/electron/)
    - [`nw.js application`](https://github.com/weareu/xlsx/blob/HEAD/demos/nwjs/)
    - [`Chrome / Chromium extensions`](https://github.com/weareu/xlsx/blob/HEAD/demos/chrome/)
    - [`Download a Google Sheet locally`](https://github.com/weareu/xlsx/blob/HEAD/demos/google-sheet/)
    - [`Adobe ExtendScript`](https://github.com/weareu/xlsx/blob/HEAD/demos/extendscript/)
    - [`Headless Browsers`](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 and other engines`](https://github.com/weareu/xlsx/blob/HEAD/demos/altjs/)
    - [`"serverless" functions`](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` メソッドは、指定されたパスにあるスプレッドシートファイルの読み取りを試みます。
    ブラウザは通常、この方法でのファイル読み取りを許可しません(セキュリティリスクと見なされるため)、
    この方法でファイルを読み取ろうとするとエラーがスローされます。
    
    2番目の `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

    ウェブページ内のユーザー提出ファイル(「ドラッグ&ドロップ」)(クリックして表示)

    Chrome 76+ を対象とする最新のウェブサイトでは、File#arrayBuffer が推奨されます:```js // XLSX is a global from the standalone script

    async function handleDropAsync(e) { e.stopPropagation(); e.preventDefault(); const f = e.dataTransfer.files[0]; /* f is a File / const data = await f.arrayBuffer(); / data is an ArrayBuffer */ const workbook = XLSX.read(data);

    /* DO SOMETHING WITH workbook HERE */ } drop_dom_element.addEventListener("drop", handleDropAsync, false);

    root@kitploit:~
    最大限の互換性のために、`FileReader` APIを使用する必要があります:```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/ は、FileReader技術を実演しています。

    ユーザーが送信したファイル(HTML INPUT要素を使用)(クリックして表示)

    type=\"file\" を持つHTML INPUT要素から始めます:```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 */
    })();
    

    より広いサポートのためには、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` デモ](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`は、Photoshopおよび他のExtendScriptターゲットにおける`File`ロジックをラップします。
    指定されたパスは絶対パスである必要があります。```js
    #include "xlsx.extendscript.js"
    
    /* Read test.xlsx from the Documents folder */
    var workbook = XLSX.readFile(Folder.myDocuments + "/test.xlsx");
    

    The extendscript demo には、より複雑な例が含まれています。

    Electronアプリ内のローカルファイル (クリックして表示)

    readFile はレンダラープロセスで使用できます:```js /* From the renderer process */ var XLSX = require("xlsx");

    var workbook = XLSX.readFile(path);

    root@kitploit:~
    Electron APIは時間とともに変化しています。 [`electron`デモ](https://github.com/weareu/xlsx/blob/HEAD/demos/electron/)が完全な例を示し、必要なバージョン固有の設定を詳細に説明しています。
    
    </details>
    
    <details>
      <summary><b>React Nativeを使用したモバイルアプリでのローカルファイル</b>(クリックで表示)</summary>
    
    [`react`デモ](https://github.com/weareu/xlsx/blob/HEAD/demos/react)にはReact Nativeアプリのサンプルが含まれています。
    
    React Nativeはファイルシステムからファイルを読み込む方法を提供していないため、サードパーティのライブラリを使用する必要があります。以下のライブラリがテストされています:
    
    - [`react-native-file-access`](https://npm.im/react-native-file-access)
    
    `base64`エンコーディングは`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"});
    
    • react-native-fs

    ascii エンコーディングは 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"});

    root@kitploit:~
    </details>
    
    <details>
      <summary><b>NodeJS サーバーファイルアップロード</b> (クリックして表示)</summary>
    
    `read` は NodeJS バッファを受け入れます。  `readFile` は、[`formidable`](https://npm.im/formidable) のような HTTP POST リクエストボディパーサーによって生成されたファイルを読み取ることができます:```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);
    

    server デモには、より高度な例があります。

    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) は、Buffersを生成するために `null` エンコーディングを必要とします:```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:~
    `book_new` ユーティリティ関数は、ワークシートを持たない空のワークブックを作成します。
    
    スプレッドシートソフトウェアは通常、少なくとも1つのワークシートを必要とし、ユーザーインターフェースでその要件を強制します。このライブラリは書き込み時にその要件を強制し、空のワークブックが書き込み関数に渡された場合にエラーをスローします。
    
    
    **API**
    
    _配列の配列(JS values)からワークシートを作成する_```js
    var worksheet = XLSX.utils.aoa_to_sheet(aoa, opts);
    

    The 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 オブジェクトの配列を順に走査し、ワークシートオブジェクトを生成します。デフォルトでは、ヘッダー行と配列内のオブジェクトごとに1行を生成します。オプションの opts 引数には、列の順序とヘッダー出力を制御する設定があります。

    "オブジェクト配列入力" では、この関数とオプションの opts 引数について詳しく説明しています。

    例

    "SheetJSの禅" には、「JSONエンドポイントからデータを取得し、ワークブックを生成する」という詳細な例が含まれています。

    x-spreadsheet は、Webブラウザ上で構造化データをプレビューおよび修正するためのインタラクティブなデータグリッドです。xspreadsheet デモ には、x-spreadsheetデータオブジェクトからワークブックに変換するための xtos 関数を含むサンプルスクリプトが含まれています。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:~
    The [`array` demo](https://github.com/weareu/xlsx/blob/HEAD/demos/array/) shows a complete example.
    
    </details>
    
    
    ### HTMLテーブルの処理
    
    **API**
    
    _ページ内のHTML TABLEをスクレイピングしてワークシートを作成する_```js
    var worksheet = XLSX.utils.table_to_sheet(dom_element, opts);
    

    The table_to_sheet ユーティリティ関数は、DOM TABLE要素を受け取り、行を反復処理してワークシートを生成します。opts引数はオプションです。"HTMLテーブル入力"セクションがこの関数の詳細を説明しています。

    ページ内のHTMLテーブルをスクレイピングしてワークブックを作成する```js var workbook = XLSX.utils.table_to_book(dom_element, opts);

    root@kitploit:~
    The `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"});
    
    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>ヘッドレスChromeを使用したサーバーサイドHTMLテーブル</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();
    })();
    
    ヘッドレスWebKitを使用したサーバーサイドHTMLテーブル (click to show)

    headless デモ には、PhantomJS を使用して HTML ファイルを XLSB ワークブックに変換する完全なデモが含まれています。核心となる考え方は、ページにスクリプトを追加し、ページコンテキストでテーブルを解析し、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>ブラウザなしのNodeJS HTMLテーブル</b>(クリックして表示)</summary>
    
    NodeJSにはDOM実装が含まれておらず、Puppeteerには大規模なChromiumビルドが必要です。[`jsdom`](https://npm.im/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);
    

    データ処理

    「共通スプレッドシート形式」は、ワークブックの核となる概念をシンプルなオブジェクトで表現したものです。ユーティリティ関数はこのオブジェクト表現で動作し、一般的なユースケースを処理することを目的としています。

    ワークブック構造の変更

    API

    ワークシートをワークブックに追加する```js XLSX.utils.book_append_sheet(workbook, worksheet, sheet_name);

    root@kitploit:~
    book_append_sheet ユーティリティ関数は、ワークシートをワークブックに追加します。
    第3引数で目的のワークシート名を指定します。関数を複数回呼び出すことで、複数のワークシートを
    ワークブックに追加できます。指定したワークシート名がワークブック内で既に使用されている場合、
    エラーがスローされます。
    
    _ワークブックにワークシートを追加し、一意の名前を見つける_```js
    var new_name = XLSX.utils.book_append_sheet(workbook, worksheet, name, true);
    

    第4引数が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 プロパティは、「タブ順」のワークシート名のリストです。API関数はこの配列を参照します。

    ワークシートをその場で置き換える```js workbook.Sheets[sheet_name] = new_worksheet;

    root@kitploit:~
    The `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);
    

    すべてのフィールドは、header: 1 を使用した sheet_to_json エクスポートで生成された2Dテンソルの転置を使用して一度に処理できます。ヘッダーラベルが含まれている場合、最初の行はスライスで削除する必要があります:```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:~
    [`array` デモ](https://github.com/weareu/xlsx/blob/HEAD/demos/array/) は完全な例を示しています。
    
    </details>
    
    
    ### HTMLテーブルの生成
    
    **API**
    
    _ワークシートからHTMLテーブルを生成する_```js
    var html = XLSX.utils.sheet_to_html(worksheet);
    

    sheet_to_htmlユーティリティ関数は、ワークシートデータに基づいてHTMLコードを生成し ます。ワークシートの各セルは<TD>要素にマッピングされます。結合セル は、colspan属性とrowspan属性を設定することでシリアライズされます。 例 sheet_to_htmlユーティリティ関数は、innerHTMLを設定することで任意のDOM要素に 追加できるHTMLコードを生成します:```js var container = document.getElementById("tavolo"); container.innerHTML = XLSX.utils.sheet_to_html(worksheet);

    root@kitploit:~
    `fetch` と組み合わせることで、ワークブックからサイトを構築するのは簡単です:
    
    <details>
      <summary><b>Vanilla JS + HTML fetch workbook とテーブルプレビューの生成</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 の例を含んでいます。

    キー説明
    v生の値 (詳細はデータ型のセクションを参照)
    w整形されたテキスト (該当する場合)
    t型: b ブール値, e エラー, n 数値, d 日付, s テキスト, z スタブ
    fA1形式の文字列としてエンコードされたセル数式 (該当する場合)
    F数式が配列数式の場合の包含配列範囲 (該当する場合)
    Dtrueの場合、配列数式が動的であることを示す (該当する場合)
    rリッチテキストエンコーディング (該当する場合)
    hリッチテキストのHTMLレンダリング (該当する場合)
    cセルに関連付けられたコメント
    zセルに関連付けられた数値書式文字列 (要求された場合)
    lセルのハイパーリンクオブジェクト (.Target がリンク、.Tooltip がツールチップ)
    sセルのスタイル/テーマ (該当する場合)
    型説明
    bブール値: 値はJSの boolean として解釈
    eエラー: 値は数値コード、w プロパティに一般名が格納 **
    n数値: 値はJSの number **
    d日付: 値はJSの Date オブジェクトまたは日付として解析される文字列 **
    sテキスト: 値はJSの string として解釈され、テキストとして書き込まれる **
    zスタブ: データ処理ユーティリティによって無視される空白のスタブセル **
    値エラーの意味
    0x00#NULL!
    0x07#DIV/0!
    0x0F#VALUE!
    0x17#REF!
    0x1D#NAME?
    0x24#NUM!
    0x2A#N/A
    0x2B#GETTING_DATA
    key機能(true=無効 / false=有効)デフォルト
    selectLockedCellsロックされたセルの選択有効
    selectUnlockedCellsロック解除されたセルの選択有効
    formatCellsセルの書式設定無効
    formatColumns列の書式設定無効
    formatRows行の書式設定無効
    insertColumns列の挿入無効
    insertRows行の挿入無効
    insertHyperlinksハイパーリンクの挿入無効
    deleteColumns列の削除無効
    deleteRows行の削除無効
    sort並べ替え無効
    autoFilterフィルター無効
    pivotTablesピボットテーブルレポートの使用無効
    objectsオブジェクトの編集有効
    scenariosシナリオの編集有効
    キー説明
    Sheet名前のスコープ。 シートインデックス (0 = 最初のシート) または null (ワークブック)
    Name大文字と小文字を区別する名前。 標準ルールが適用されます **
    RefA1スタイルの参照 ("Sheet1!$A$1:$D$20")
    Commentコメント (XLS/XLSX/XLSB にのみ適用)
    ストレージ表現形式読み取り書き込み
    A1スタイルの文字列XLSX✔✔
    RCスタイルの文字列XLML およびプレーンテキスト✔✔
    BIFF 解析数式XLSB およびすべてのXLS形式✔
    OpenFormula 数式ODS/FODS/UOS✔✔
    Lotus 解析数式すべての Lotus WK_ 形式✔

    Excel は名前付きセルが A1 または RC スタイルのセル参照の名前と衝突することを禁止しているため、(それほど単純ではない)正規表現変換が可能です。 BIFF 解析数式と Lotus 解析数式は明示的に展開する必要があります。 OpenFormula 数式は正規表現で変換できます。

    共有数式は展開され、各セルにはそのセルに対応する数式が格納されます。 ライターは通常、共有数式を生成しようとはしません。

    ID書式
    0General
    10
    20.00
    3#,##0
    4#,##0.00
    90%
    100.00%
    110.00E+00
    12# ?/?
    13# ??/??
    14m/d/yy(下記参照)
    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@
    オプション名デフォルト説明
    type入力データエンコーディング (下記の入力タイプを参照)
    rawfalsetrue の場合、プレーンテキスト解析は値を解析しません **
    codepage指定された場合、適切なコードページを使用します **
    cellFormulatrue数式を .f フィールドに保存します
    cellHTMLtrueリッチテキストを解析し、HTML を .h フィールドに保存します
    cellNFfalse数値形式の文字列を .z フィールドに保存します
    cellStylesfalseスタイル/テーマ情報を .s フィールドに保存します
    cellTexttrue書式設定されたテキストを .w フィールドに生成します
    cellDatesfalse日付をタイプ d で保存します (デフォルトは n)
    dateNF指定された場合、日付コード14にその文字列を使用します **
    sheetStubsfalseスタブセルに対してタイプ z のセルオブジェクトを作成します
    sheetRows0>0 の場合、最初の sheetRows 行を読み取ります **
    bookDepsfalsetrue の場合、計算チェーンを解析します
    bookFilesfalsetrue の場合、生ファイルをブックオブジェクトに追加します **
    bookPropsfalsetrue の場合、ブックのメタデータを取得するのに十分な解析のみを行います **
    bookSheetsfalsetrue の場合、シート名を取得するのに十分な解析のみを行います
    bookVBAfalsetrue の場合、VBA blob を vbaraw フィールドにコピーします **
    password""定義されておりファイルが暗号化されている場合、パスワードを使用します **
    WTFfalsetrue の場合、予期しないファイル機能に対してエラーをスローします **
    sheets指定された場合、指定されたシートのみを解析します **
    PRNfalsetrue の場合、PRN ファイルの解析を許可します **
    xlfnfalsetrue の場合、数式内の _xlfn. プレフィックスを保持します **
    FSDSV フィールド区切り文字のオーバーライド