node(TypeScript)でExcelの中身をjsonで吐き出す

xlsxというライブラリを使います。
スター数も多いし安定していそうです。

https://www.npmjs.com/package/xlsx

こちらの実験環境に中身を入れていきます。

まずはxlsxをinstallします。

npm install xlsx

適当なExcelファイルを用意する

実験用にExcelを用意して、assetsフォルダを作成してそこに突っ込んでください。
Excelデータは以下をベースに、歯抜けデータの確認したいので少しいじったものを用意しました。

https://docs.microsoft.com/ja-jp/office/dev/scripts/resources/samples/table-data-with-hyperlinks.xlsx

mkdir assets

table-data-with-hyperlinks.xlsxをそこにいれます。

index.ts

import * as xlsx from "xlsx";

const main = () => {
    let book = xlsx.readFile("assets/table-data-with-hyperlinks.xlsx")
    let sheet = xlsx.utils.sheet_to_json(book.Sheets["PlainTable"], {header: "A", raw: false, blankrows: true,defval: null})
    console.log(sheet)
};

main();

nodeでのみreadFileを使いましょう。
バイナリデータとかならreadメソッドで読めるはずです。
今回はExcelの中身をjsonに吐き出したいので、utils.sheet_to_jsonを使います。

ちなみに、これ以外にも以下のような吐き出し方があるようです。

・sheet_to_csv
・sheet_to_txt
・sheet_to_html
・sheet_to_formulae

sheet_to_formulaeについては、使い方が少しマニアックだなという印象でした。

話をsheet_to_jsonに戻します。
第二引数にオプションを指定することができます。

sheet_to_json(worksheet: WorkSheet, opts?: Sheet2JSONOpts)

オプションについての詳しい説明は以下を読んでください。

https://docs.sheetjs.com/docs/api/utilities/#formulae-output

今回使っているオプションについてざっくり説明します。
その前に、説明しやすくするために吐き出される結果を先に掲載しときます。

[
  {
    A: 'Event ID',
    B: 'Date',
    C: 'Location',
    D: 'Capacity',
    E: 'Speakers',
    F: 'Num'
  },
  {
    A: 'E107',
    B: '2020-12-10',
    C: null,
    D: null,
    E: 'Debra Berger',
    F: null
  },
  {
    A: 'E108',
    B: 'おおおお',
    C: 'Montgomery',
    D: '10',
    E: 'Delia Dennis',
    F: '2'
  },
  {
    A: 'E109',
    B: '2020-12-12',
    C: 'Montgomery',
    D: '10',
    E: 'Diego Siciliani',
    F: '3'
  },
  {
    A: 'E110',
    B: '2020-12-13',
    C: 'Boise',
    D: '25',
    E: 'Gerhart Moller',
    F: '4'
  },
  { A: null, B: null, C: null, D: null, E: null, F: null },
  {
    A: 'E112',
    B: '2020-12-15',
    C: 'Fremont',
    D: '25',
    E: 'Irvin Sayers',
    F: '6'
  },
  {
    A: 'E113',
    B: '2020-12-16',
    C: 'Salt Lake City',
    D: '20',
    E: 'Isaiah Langer',
    F: '7'
  },
  {
    A: 'E114',
    B: '2020-12-17',
    C: 'Salt Lake City',
    D: '20',
    E: 'Johanna Lorenz',
    F: '8'
  }
]

header: “A”
1行が一つのオブジェクトで表現されていています。
これはオプションで指定したheader: “A”が効いているため、このようになっています。
各値にどの列かわかるようにA,B,Cというようなキーが振られています。
Excelの列名と同じですね。

raw: false
生の値(true)またはフォーマットされた文字列(false)を使用します。
falseにすることで、セルに入っている値がそのままの文字列として表現されます。
こちらを指定しなければ型もそのままで入ってきます。数値ならnumberです。

blankrows: true
出力に空白行を含めるかどうかの設定です。

defval: nullnull
または undefined の代わりに指定された値を使用する。今回は明示的にnullにしました。