ExcelJSでExcelファイルを読み書きしてみる

業務用アプリを作る上で、Excelファイルの読み書きは切っても切れない問題です。(少なくとも私の職場ではそう)
てな訳で、node.js用ライブラリExcelJSを利用してExcelファイルを読み込んでみます。


準備

筆者の愛機MacBook(金)にはExcelなんぞ入っていません。なんで、Microsoftのテンプレートサイトからxlsxファイルを調達します。
今回は毎日のタスク リストというファイルをお借りして、Book1.xlsxという名前でダウンロードしておきます。

excel

で、毎度のごとく作業スペースの作成から。新緑の季節なのでleafにしときます。

$ mkdir leaf
$ cd leaf/
$ npm init

ExcelJSのインストール。

$ npm install exceljs

作成

公式サイトのreadmeを参考に、app.jsを作成します。
とりあえず’毎日のタスク リスト’シートのセルG6を読み込んでをコンソールに表示するだけのプログラム。

var Excel = require('exceljs');
var workbook = new Excel.Workbook();
workbook.xlsx.readFile("./Book1.xlsx")
.then(function() {
    var worksheet = workbook.getWorksheet('毎日のタスク リスト');
    var g6 = worksheet.getCell('G6');
    console.log(g6);
});

実行

実行すると…

$ node app.js

こんな結果が返ってきます。

(node:5041) fs: re-evaluating native module sources is not supported. If you are using the graceful-fs module, please update it to a more recent version.
{ _row: 
   { _worksheet: 
      { id: 1,
        name: '毎日のタスク リスト',
        _rows: [Object],
        _columns: [Object],
        _keys: {},
        _merges: [Object],
        _workbook: [Object],
        tabColor: undefined,
        dataValidations: [Object] },
     _number: 6,
     _cells: [ , [Object], [Object], , [Object], [Object], [Circular] ],
     style: {},
     height: 17.25,
     _hidden: false },
  _column: 
   { _worksheet: 
      { id: 1,
        name: '毎日のタスク リスト',
        _rows: [Object],
        _columns: [Object],
        _keys: {},
        _merges: [Object],
        _workbook: [Object],
        tabColor: undefined,
        dataValidations: [Object] },
     _number: 7,
     _key: undefined,
     width: 35,
     style: 
      { numFmt: 'mm-dd-yy',
        font: [Object],
        border: null,
        fill: [Object],
        alignment: [Object] },
     _header: [],
     _hidden: false },
  _address: 'G6',
  _value: 
   { model: 
      { address: 'G6',
        type: 3,
        value: '休み中に必要なものをカバンに詰める',
        shared: true,
        style: [Object] } },
  style: 
   { numFmt: 'General',
     font: { size: 6, name: 'メイリオ', family: 3, charset: 128, scheme: 'minor' },
     border: null,
     fill: { type: 'pattern', pattern: 'none' },
     alignment: { vertical: 'middle', wrapText: true } },
  _mergeCount: 0 }

単に文字列やスタイルだけでなく、かなりいろんな情報が取得できますね。

本題からは逸れますが、コンソールに表示されるfs: re-evaluating native module sources is not supported.とかいうメッセージは、Node.js v6に対応できていないライブラリを使った時に出るようです。どうしても気になるようなら、 Node.jsをv4.4.4(LTS)やv5に戻しましょう。

で、こんなに細かい情報はいらない、セルの値だけでいいという場合は、app.jsの6行目を

    var g6 = worksheet.getCell('G6').value;

とすると、

休み中に必要なものをカバンに詰める

とだけ返ってきます。