JRubyとPOIを使ってMS Officeのテキストを抜き出すライブラリを作りました

仕事で必要になりそうな気配がしてきたので、夏休み中にMS Officeドキュメントに含まれるテキストを抽出するためのツールを作ってみました。
DeltaAttackという名前でGitHubで公開しています。

http://github.com/moro/delta_attack/tree/master

最初はxlhtmlでテキストを抽出しようとしたんですが、SI屋さんがよく見かけるような複雑な段組みのExcel帳票をうまく抜けませんでした。というかよりによって抜きたい部分のテキストだけ抜けないという。そこで、Apache POIを使ってみました。Javaを書くか、、と思ったのですが、まるごとRubyを見ながらJRubyで試してみたら簡単に書けたのでそちらで。WEBrickも使えるし。やらない夫大場さん++。

JRubyは使ってますが、CRubyのRailsアプリから使いたかったので何とかならんかと思い、WEBrickを使ってクライアントサーバ型で作っています。今回もWEBrick大活躍。WEBrick++。
使い方は簡単です。まずはgemをインストール(なぜかmoro-delta_attackが作られない><)

$ git clone git://github.com/moro/delta_attack.git  
$ cd delta_attack
$ jrake install # JRubyにインストール
$ raek install  # CRubyにインストール

gemができた(gemspecがSyntax Errorだった)ので、gem経由でインストールできます。

$ gem install moro-delta_attack
$ jgem install moro-delta_attack

次にJRuby側のサーバを起動します。POIは含まれていませんので、別途ダウンロードしてCLASSPATHを設定しておいてください。*1

$ export CLASSPATH=path/to/poi-3.1-FINAL/poi-3.1-FINAL-20080629.jar:\
                   path/to/poi-3.1-FINAL/poi-scratchpad-3.1-FINAL-20080629.jar
$ delta_attack_server

ClientはJRubyでもCRubyでもどちらからでも使えます。JRubyの場合、クラサバじゃなく直接呼ぶほうが効率的ですが、それはまぁ置いておいて。

require 'delta_attack/client'
puts DeltaAttack::Client.cast("path/to/some.xls")

みたいな感じで抜けると思います。オートシェイプとかもできそうなんですが、いまのところは対応していません。

ということでJRubyWEBrickがすげー、というお話でした。enjoy!

*1:実はこのときCRubyで呼ぶとJRubyでexecし直すので、CRubyから呼んでももOKです。この挙動は紛らわしいからやめたほうがいいかも