LoginSignup
1
0

More than 5 years have passed since last update.

groovyでexcelをCSV化する

Last updated at Posted at 2016-11-08

groovy勉強のメモを残していきたいと思います。

環境

Windwows上でVM入れたりしていますが、Git bash 上で動かす方が多いと思います。
groovyは 2.4.7 でやっています。
groovyのソースはGGTSやEclipse neon上でいじっていますが、フリーズしたら vim でいじります。

text化(csv)

またtextの話です(笑)
Qiitaはじめたばっかりなので似たような話でもいいですよねぇ(^ ^;

やっぱり excel もgrepしたいんですよね。
前はtextにするのに、こちらの
http://tatssuki.hatenablog.com/entry/2015/06/14/232111
のツールを使って、JSONにして扱ったんですよねぇ。
nodeやってるとjsonにして何かするっていう手順が多くなってきたんですけど、
ワンライナー的なものですとこったりしなくてもいいのでとりあえず使える的なところを落とし所にするので
短く(タイピング遅いものですから・・・)早くできるものがいいのでまた書いてみました。

Office関係を java でやるときはやっぱり POI ですね。

全シートを標準出力に出すのでパイプで区切ってここでも grep です(笑)

/**
 * Excelを読み込んで cell のテキストを出力するサンプル2
 */

import static groovy.io.FileType.*


@Grab("org.apache.poi:poi-ooxml:3.14")
@Grab("org.apache.poi:ooxml-schemas:1.1")
import org.apache.poi.ss.usermodel.*

/*
 * 後付で Cell の拡張を行う
 */
Cell.metaClass.define {
  getCellValue {
    switch (getCellType()) {
      case Cell.CELL_TYPE_STRING:
        return getRichStringCellValue().getString()
      case Cell.CELL_TYPE_NUMERIC:
        if (DateUtil.isCellDateFormatted(delegate)) { // thisではなくて delegate
          return getDateCellValue()
        } else {
          return getNumericCellValue()
        }
      case Cell.CELL_TYPE_BOOLEAN:
        return getBooleanCellValue()
      case Cell.CELL_TYPE_FORMULA:
        return getCellFormula()
      default:
        return ""
    }
  }
}


/**
 * 特定のディレクトリのexcelをcsv化する。
 */
def convertDir(dir) {
  dir.eachFileMatch(FILES, ~/.*\.xlsx?/) {
    convertFile(it)
  }
}

/**
 * 特定のファイルのexcelをcsv化する。
 */
def convertFile(file) {
  new FileInputStream(file).withStream { ins ->
    WorkbookFactory.create(ins).with { workbook ->
      workbook.each { sheet ->
  //      println sheet.getClass().getSimpleName()//getCellValue(cell)
        sheet.each { row ->
          println row.collect { cell ->
            return cell.getCellValue(cell)
          }.join(",") // Cellの値をとりあえずカンマで区切ってCSVっぽくする
        }
      }
    }
  }
}

def convert(path) {
  File target = new File(path)
  if (target.isDirectory()) {
    convertDir(target)
  } else if (target.isFile()) {
    convertFile(target)
  } else {
    println "skip $path"
  }
}

args.each {
  convert(it)
}

groovyの場合静的じゃないので、クラスとかが無いって言われて動かないこと多いんですよねぇ。
そのときには必要な jar を足していきますけど、今回は xlsとxlsxが混在するときにうまくいったりうまくいかなかったり...

@Grab("org.apache.poi:poi-ooxml:3.14")
@Grab("org.apache.poi:ooxml-schemas:1.1")

なのでこんな感じにしています。
なんちゃってCSV出力出来る感じになりました。


実は groovy も JSON 強かったりするので、 node使ってjsで書くよりは groovy の方がファイル1つで楽かもですね。
ま、どこかに見えないファイルはいっぱいたまっていきますが(笑)

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0