JRuby + POI で Excel ファイルを作る(税理士業界のSaaS開発も大変だ・・)
当社のような税理士法人では、クライアントさんに毎月さまざまな資料を提供しています。
今でもその資料の多くはExcelで作られています。いま社内向けのWebアプリ開発をしていて帳票類はPDFを自動生成させているのですが、やっぱりスタッフからは「Excelで自由に加工したい」という要望があとをたちません。後々熟成したらSaaSにする予定ですので要望には耳をかたむけねばなりません。
というわけで、本当はやりたくないのですが、サーバーサイドでExcelファイルを自動生成させないといけなくなりました。税理士業界って独自のシステム作って自動化しても、スタッフの人たちは結局最後は自分で資料をカスタマイズしたがるんです。。。
まぁこれはもちろんクライアント企業のために各スタッフがいろいろ考えてのことなので、我々開発する人間はスタッフたちの要望を満たすようにあれこれ試行錯誤しながら実現するだけなんですけどね。
というわけで本題に。
環境
RubyでExcelを扱うなら、Win32OLEモジュールというのがあるようですが、Windowsサーバーじゃないとだめっぽいので、どうせJRuby使ってるしJavaのライブラリでExcelを扱えるのがないかと調べたところ、POIプロジェクトというのがありましたので、これを使用することに決定!
さっそくPOIのjarファイルをGETしまして、jruby/lib にコピー。
ちなみに以下の6ファイルをコピーしました。
・commons-logging-1.1.jar
・junit-3.8.1.jar
・log4j-1.2.13.jar
・poi-3.2-FINAL-20081019.jar
・poi-contrib-3.2-FINAL-20081019.jar
・poi-scratchpad-3.2-FINAL-20081019.jar
もちろんCLASSPATHの設定をお忘れなく。最初から設定してたらOKですよ。
で、早速簡単なサンプルを書いてみる。
include_class "org.apache.poi.poifs.filesystem.POIFSFileSystem" include_class "org.apache.poi.hssf.usermodel.HSSFWorkbook" include_class "org.apache.poi.hssf.usermodel.HSSFSheet" include_class "org.apache.poi.hssf.usermodel.HSSFRow" include_class "org.apache.poi.hssf.usermodel.HSSFCell" include_class "org.jruby.util.IOInputStream" def test_excel wb = HSSFWorkbook.new sheet = wb.createSheet wb.setSheetName(0, "シート1") row = sheet.createRow(0) cell = row.createCell(0) cell.setCellValue("POIテスト") baos = ByteArrayOutputStream.new wb.write(baos) baos.close send_data String.from_java_bytes(baos.toByteArray), :type=> "application/vnd.ms-excel", :filename => "JrubyPOItest.xls" end
できたーー!
こんな感じです。
フォントやセルの色や罫線やその他いろんな細かい設定については、POI HSSF機能ガイド を見るとだいたいわかります。
これで税理士事務所のスタッフも納得してくれるでしょう・・・税理士業界のSaaS開発もなかなか大変です。