僕達プログラマはちょっとした Excel に Scalaz を使います!
出オチ乙
この記事は Scalaz Advent Calendar 2012 の 3日目です。
poi.scala という Apache POI のラッパーを教えてもらったのですが、これに Scalaz が使用されていたので紹介します。Scalaz を使って Excel 使うなんて倒錯したなにかを感じます。
"folone/poi.scala · GitHub" https://github.com/folone/poi.scala
README には version 0.5 のインストール方法が記載されていますが、0.5 ではまだ Scalaz は導入されていません。
なので試したい方は HEAD を自分でビルドしてください。
ビルドは maven を使っているようですが、scala の version が振られていなかったり、イマイチですね。私は Build.scala を少しいじって sbt で publish-local して試しました。
poi.scala を使うと Sheet, Row, Cell などのクラスを使って、Excel シートを組立てることができます。
import info.folone.scala.poi._ import scalaz._ import syntax.monoid._ import syntax.foldable._ import std.list._ val sheet1 = Sheet("sheet1") { Set( Row(1) { Set(Cell(1, "scala"), Cell(2, "java")) } , Row(2) { Set(Cell(1, "clojure"), Cell(2, "groovy")) } ) }
もうちょっとDSLっぽくなると嬉しいかなあ。
poi.scala では Excel のセル、行、シート が Semigroup で、WorkSheet は Monoid です。まじかよ。
val sheet2 = Sheet("sheet2") { Set(Row(2) { Set(Cell(1, "ruby"), Cell(2, "python")) }) } val sheet3 = Sheet("sheet3") { Set( Row(3) { Set(Cell(1, "haskell"), Cell(2, "ocaml")) } , Row(4) { Set(Cell(1, "c"), Cell(2, "c++"), Cell(3, "c#")) } ) } val sheet = sheet1 |+| sheet2 |+| sheet3 /* Sheet ("sheet3")( Set(Row (1)(Set(Cell(1,scala), Cell(2,java))) , Row (2)(Set(Cell(1,ruby), Cell(2,python))) , Row (3)(Set(Cell(1,haskell), Cell(2,ocaml))) , Row (4)(Set(Cell(1,c), Cell(2,c++), Cell(3,c#))))) */
結合っていうかマージされていますね。こんな使いかたするか?とか気にしちゃいけないんだと思います。
作成したシートを Workbook として保存しましょう。
val workbook = Workbook(Set(sheet)) workbook.safeToFile("/tmp/lang.xls").unsafePerformIO
なんとかこんな感じの Excel ファイルができました。
今のところ機能はこれくらいしかないようです...高速HTML生成や高級コーディングはまだですか...
もう少しで Lens も使えるようになるみたいなことも書いてあるので、興味のある人はウォッチするなりプルリクするなりして、Excel 部長を目指して下さい。私は遠慮しておきます。