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をインストールします。
bash1
| $ npm install xlsx --save
|
node.jsやnpm、そしてコマンドラインについてご不明な場合は以下をご覧ください。
node.jsやコマンドラインについて
node.jsの環境を用意する方法やコマンドラインの使い方については以下を併せてご覧ください。
エクセルファイルの中身を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.js1 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]] let Sheet1_json = XLSX.utils.sheet_to_json( Sheet1 )
let Sheet1A1 = Sheet1['A1'].v console.log( `シート1のセルA1の値:\n${Sheet1A1}` )
console.log( `シート1の全ての値:` ) for( let cl of Sheet1_json){ console.log( `${cl['A1の内容']} - ${cl['B1の内容']} - ${cl['C1の内容']}` ) }
|
それではnode.jsを実行してみましょう。
次のような結果が表示され、sample.xlsの内容がパースされた事が確認できます。
bash1 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.js1 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]]
let endCol = Sheet1['!ref'].match(/\:[A-Z+]([0-9]+)/)[1]
Sheet1['!ref'] = `A6:K${endCol}`
let Sheet1_json = XLSX.utils.sheet_to_json( Sheet1 )
let ct = 0 for( let cl of Sheet1_json){ if(ct >= 1 && ct < 5){ console.log(cl) } if(cl['A1の内容'] == "")break ct++ }
|