javascript(node.js)でエクセルファイル(xlsやxlsxなどの拡張子)を読み込んで中身を解析する方法を簡単に解説します。具体的には、xlsxを使うと簡単に中のデータを取り出したり、書き込みができます。

xlsxはブラウザ上でも動作するJavascriptのライブラリです。

応用すると、Node.jsでExcelを読み取って印刷データを作成する事もできるようになります。

目次

xlsxができること

xlsxでは、ExcelファイルをjavascriptやES6で読み込み、シート名や各セルの番号を指定して、好きな箇所の値を取得する事が可能です。エクセルのソフトを立ち上ることは不要ですので、jsから手っ取り早く目的の内容を処理したい時に便利です。

xlsxはnpmなどでインストールが可能です。

npm
xlsx

大まかな動作が確認できるDEMOページやReactやVueなどの有名なフレームワークを活用したデモも用意されています。ドキュメントはSheetJS js-xlsxが参考になります。

2017年以前はxlsjsだった

2017年より以前は、xlsjsというパッケージがxlsxと同様の機能を担っていました。2018年には今回ご紹介しているxlsxへ統合されたようです。詳しい使い方は、以下のドキュメントが参考になります。

xlsxのインストール

まずはnpmパッケージのxlsjsをインストールします。

bash
1
$ npm install xlsx --save

node.jsやnpm、そしてコマンドラインについてご不明な場合は以下をご覧ください。

エクセルファイルの中身をnode.jsで解析

それでは、実際にExcelファイルの中身をnode.jsで取り出してみたいと思います。下記の例ではsample.xlsというファイルのシート1に以下のようなデータが含まれているとします。

A1の内容 B1の内容 C1の内容
A2 B2 C2
A3 B3 C3
A4 B4 C4
A5 B5 C5

次に、sample.jsを作成して以下のように記述します。

sample.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let XLSX     = require('xlsx')
let workbook = XLSX.readFile('sample.xls')

let sheet_name_list = workbook.SheetNames
let Sheet1 = workbook.Sheets[sheet_name_list[0]] // シート1をデータを取得します
let Sheet1_json = XLSX.utils.sheet_to_json( Sheet1 ) // シート1のデータをJSONパースします

// (例)シート1のセルA1の値をコンソールに出力します
let Sheet1A1 = Sheet1['A1'].v
console.log( `シート1のセルA1の値:\n${Sheet1A1}` )

// シート1の全ての値をコンソールに出力します
console.log( `シート1の全ての値:` )
for( let cl of Sheet1_json){
console.log( `${cl['A1の内容']} - ${cl['B1の内容']} - ${cl['C1の内容']}` )
}

それではnode.jsを実行してみましょう。

bash
1
$ node sample.js

次のような結果が表示され、sample.xlsの内容がパースされた事が確認できます。

bash
1
2
3
4
5
6
7
8
$ node sample.js
シート1のセルA1の値:
A1の内容
シート1の全ての値:
A2 - B2 - C2
A3 - B3 - C3
A4 - B4 - C4
A5 - B5 - C5

指定範囲のセルの中身だけjavascriptで読み込み

続いて、エクセルの中でも任意の範囲だけを取り出したいケースを見ていきたいと思います。

取り出すにはSheet1['!ref']に取り出したい範囲の文字列をセットします。例えば、セルのA6からK100の範囲であれば、Sheet1['!ref'] = 'A6:K100'と指定します。

sample2.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
let XLSX = require('xlsx')
let hasha = require('hasha')
let workbook = XLSX.readFile('sample.xls')

let sheet_name_list = workbook.SheetNames
let Sheet1 = workbook.Sheets[sheet_name_list[0]] // シート1をデータを取得します

// エクセルデータの末端の行数を取得する
let endCol = Sheet1['!ref'].match(/\:[A-Z+]([0-9]+)/)[1]

// 取得したいセルの範囲を指定し直す。下記の例ではA6からK列の末端行まで
Sheet1['!ref'] = `A6:K${endCol}`

// JSONオブジェクトとして取得
let Sheet1_json = XLSX.utils.sheet_to_json( Sheet1 )

let ct = 0
for( let cl of Sheet1_json){
// 指定したセル範囲の中でも2行目から6行目だけを取得する処理
if(ct >= 1 && ct < 5){
console.log(cl)
}
if(cl['A1の内容'] == "")break
ct++
}