読者です 読者をやめる 読者になる 読者になる

みんなのちからになりたい

コピペでブログラムつくっていきたい

NPOI使って得られた知見

NPOI

npoi.codeplex.com

ざっくりいうと.NETでExcel(xls、xlsx対応)を扱うときに使う便利ライブラリで、NuGetか公式から落とせば使える。

JavaのPOIを.NETで使えるようにした版ぽいのでNPOI自体のドキュメントはだいたいPOIみてくださいみたいな感じになっていて、実際ネットに溢れてるJavaのコードのほとんどをローワーキャメルからアッパーキャメルに変えるだけで使える。

だいたいExcel使うときってCOM(Microsoft Excel 12.0 Object Library)使ってくことになって、オブジェクトの解放をちゃんとしないとプロセスが残ってめんどくさいことになるのが常だけども、NPOIはそういうのはなく手軽に使えるのがよい。

ただ、NPOIもクセというかハマりどころがあって、ドキュメントちゃんと読めばいいんだけど、ざっくり使えるのがライブラリのいいとこでもあるのでちゃんと使いたいひとはドキュメントをちゃんと読んだほうがいいと思う。

以下、個人的にハマったところとか。

数式が元の位置を保持したままコピーされる

ざっくりいうとA1+1みたいなのを行コピーするとその行もA1+1になってる。

$A1+1みたいな相対参照にしても同じなので、コピるときに座標をずらす必要がある。

POIでもそうみたいなのでググった先のスタックオーバーフローのロジックぱくって作ったらちゃんと動いたけど、1セル単位でやらなきゃならないのでセル数が多くて行数が多い場合は死ぬほど遅いというのを覚悟する必要がある。

stackoverflow.com

こんな遅いのはどう考えても怒られるため、ぼくの場合はWSHでExcelObjectで行コピーさせるだけのScript使って動かした。

これも1行単位でやってたら死ぬほど遅いため、Range使ってやると一瞬で終わる。

自動で計算されない

数式のセルが自動計算されない(直接そのセルにぶっこんだら計算されるのかもしれないけど今回は試してない)ので、ググったら以下の方法が見つかってすごい助かった。

[POI] 数式の再計算 | So-Kai-App Note

ただし、上の方法は数式が入ってるセル数が多いと地獄のような遅さになるため、下のやつを使った方がよい。

列がまるごと空欄だとセルが詰まる

これがいちばんハマった。

データを横展開でセル埋めしていくとき、ある列からどうしてもずれてしまってなにが原因かまったくわからなかったがそういうことだった。

罫線かなんかが入ってるともしかしたら大丈夫かもしれない(試してない)

で、NPOIどうなの

オブジェクト解放忘れの参照問題からかんぜんに解放されるのもさることながら、セルに書き込むのが思った以上に速いのでそれだけでも使う価値がある(ベンチは取ってないけど使い勝手考えたら多少遅かったとしてもかんぜんにこっち使う)

Javaで使われてるライブラリで実績があるようなので、上に書いたような問題があったとしても多少難があっても解決策はあるので、今後同じような案件があったら使っていきたいと思うくらいいい感じなので、if文地獄から解放されたいひとは使ってみたらいいと思いました。