Javaに依存せずにxlsxを読む

R Advent Calendar2014@Qiitaの2日目です。

Javaに依存したくない方、いると思います。
こちらにあるようにこれまでxlsxファイルを扱おうと思うと、多くのパッケージではJavaを必要としていました。
そんな事態を解決すべく開発されたのがopenxlsxパッケージです。

コード例

以下は入出力の例です。

# ブックから直接データフレームとして読み込みたい場合
read.xlsx("iris.xlsx", sheet=1)
readWorkbook("iris.xlsx",sheet=1)
# 仮想ブックとして読み込みたい場合
loadWorkbook("iris.xlsx")

# 出力
# 作成した仮想ブックを出力したい場合
saveWorkbook(wb, file = "iris.xlsx", overwrite = TRUE)
# 仮想ブックを作成せずデータ(data.frame)を直接出力したい場合
write.xlsx(iris, "iris.xlsx")

以下は条件付き書式などを使った例です。

# 仮想ブックの作成
wb <- createWorkbook()
addWorksheet(wb, "sample")

# スタイルを作成(文字色とセルの色を指定)
negStyle <- createStyle(fontColour = "white", bgFill = "red")
posStyle <- createStyle(fontColour = "black", bgFill = "grey")

# データの書き込み
writeData(wb, sheet=1, x=-5:5)
writeData(wb, sheet=1, x=LETTERS[1:11], startCol=2)

# 条件付き書式の設定
conditionalFormat(wb, 1, cols=1, rows=1:11, rule="!=0", style = negStyle)
conditionalFormat(wb, 1, cols=1, rows=1:11, rule="==0", style = posStyle)
# 出力
saveWorkbook(wb, "sample.xlsx",overwrite = TRUE)
# 出力をExcelを開いて確認
openXL("sample.xlsx")

なにが嬉しいのか

Javaに依存しないのでOutOfMemoryErrorを気にしなくて良いという利点があります。
例えばJavaに依存するXLConnectパッケージの場合、以下のコードはエラーになります。

library(XLConnect)
iris1000 <- do.call("rbind", rep(list(iris), 1000))
wb <- loadWorkbook("smp.xlsx", create=TRUE)
wb["hoge"] <- iris1000
 以下にエラー .jcall("RJavaTools", "Ljava/lang/Object;", "newInstance", .jfindClass(class),  : 
  java.lang.OutOfMemoryError: Java heap space

まあ出力でそんなでかいデータxlsxに吐き出すなよって話かもしれませんが、そういうこともあるんだ。
ただしxlsファイルは読めないから、負の遺産に悩まされてる方はおとなしくJava入れてください。
enjoy!