僕達プログラマはちょっとした 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 部長を目指して下さい。私は遠慮しておきます。