アカベコマイリ

HEAR NOTHING SEE NOTHING SAY NOTHING

xlsx-extractor v1.0.0 release

March 15, 2016開発Node, npm, xlsx-extractor

XLSX ファイルを解析して JSON 化する npm をリリースした。

同じ用途の npm は既にいくつかあるけど、それらのうち excel を業務で利用していた。なぜ excel なのかというと、この npm による解析結果は空セルも要素として扱われる。npm によっては空セルを詰めてしまうのだけど excel で 4x4 のシートを解析したなら

[
  [ '', 'Data', '', '' ],
  [ 'Data', '', '', '' ],
  [ 'Data', '', 'Data', '' ],
  [ 'Data', '', '', '' ]
]

のような Array を返す。データ的に冗長だが Excel や Numbers 上の表示と同じ座標でセルを指定可能になる。これは地味に便利。

しかし excel 内で使用されている libxmljs に問題があるらしく、これを通すとマルチバイト文字の一部が化けてしまう。全部でないところが曲者。おそらく XML の encoding を真面目に解釈して文字エンコーディング変換に失敗、という感じで問題が起きているのだろう。

そんなわけで XML 解析を xml2js に変更した fork を実装したわけだが、せっかくなので OSS 化することにした。業務開発したものとの違いは以下。

  • 再設計 & 実装

    • 元は excel の処理に近づけることを目的としていた
    • 処理の大枠は参考にしつつ再設計する
    • ユニット テストする
  • 複数シート対応

    • excel はシート 1 のみ対応
    • シート識別のためにシート名と id も取得する
  • CLI 対応

    • シート数とシート JSON 出力を実装
    • 複数シートの場合は、それらがルートの Array に包まれる
    • 出力対象は stdout
    • stdout の内容を > sample.json とすればファイル生成も可能
    • 他の CLI ツールと組み合わせることを想定

ここのところ連続して npm を開発 & 公開しているのだけど、ようやく自分なりのスタイルができてきた。ざっとまとめると、

  • ES2015 で実装

    • babel-cli を採用
    • なるべくフル機能、できれば import を使いたい
    • いまの Node 標準 ES2015 対応 (use strict) だと役者不足
  • mocha + power-assert + espower-babel でユニット テスト

    • これも ES2015 で実装
  • Travis CI で複数環境テスト

    • 設計方針として現行 + ひとつ前のバージョンに対応
    • いまなら Node v5.x + 4.x
  • esdoc でコード ドキュメントを書き ESDoc Hosting Service で公開
  • なるべく CLI 対応する

    • インストールするだけで動かせる、というのを重視
    • CLI なら npm-scripts にもそのまま組み込める
  • README に Node API と CLI の説明を網羅的に書く

    • すくなくとも I/O は書いておきたい
    • たまに API の results 解説がなくて自分で調べることがあるけど、これは辛い
    • CLI は -h の出力を流用
    • -h の説明が十分か?という検証も兼ねてる

という感じ。

それにしても npm 開発は楽しい。npm publish の手軽さとか npm link みたいにローカルで CLI を試す仕組みとか、環境面がこなれていて快適なため、ちょっとしたネタでも npm 化したくなる。