Groovy, CSV und Excel

  • Beitrags-Autor:
  • Beitrags-Kategorie:Java
  • Beitrags-Kommentare:0 Kommentare

Eine Datenmenge muss zur weiteren Bearbeitung als CSV-Datei exportiert werden. Die erzeugte Datei sollte per Doppelklick direkt in Excel 2003 geöffnet werden können. Der ursprüngliche Zeichensatz UTF-8 soll für den Windows-Anwender entsprechend konvertiert werden.

package bob.pokolm
 
DATEN = [
    ["Eins", 1, "       1,11", "        erste   Zeile   ", null],
    ["2", "null", 2.02, "2. Zeile\nmit Umbruch", "  22.3.2011 "],
    [3, 333, null, "dritter \"Versuch\"", "Zeile mit ; Trenner"]
]
 
TRENNER = ';'
CRLR = '\r\n'
 
csvFile = new File('c:/temp/CsvExcelGroovyDemo.csv')
 
// Daten bereinigen
cleanup = {
    output = new String()
    if (it == null || it.toString().toLowerCase() == 'null') {
        output = ''
    } else {
        output = it.toString().trim()
        output = output.replaceAll('[ ]+', ' ')
    }
    return output
}
 
// auf Sonderfall reagieren
escape = {
    input = it.toString()
    if (input.contains("\"")) {
        input = input.replace("\"","\"\"")
    }
    return "\"${input}\""
}
 
// Daten exportieren
DATEN.each {
    sb = new StringBuilder()
    it.eachWithIndex { value, idx ->
        if (idx > 0) {
            sb.append(TRENNER)
        }
        sb.append(escape(cleanup(value)))
    }
    sb.append(CRLR)
    csvFile.append(sb.toString(), 'Cp1252')
}

Das Ergebnis sieht in Excel wie folgt aus. Die automatische Erkennung des Werts 2.02 als 2. Februar in Zelle C2 könnte durch eine weitere Zeile in der Methode „cleanup“ verhindert werden. Wird in der Spalte kein Datum, sondern eine Dezimalzahl mit Punkt als Dezimaltrenner erwartet, nimmt output = output.replaceAll("([0-9]+)\\.([0-9]+)", '$1,$2') beispielsweise eine entsprechende Anpassung als 3. Zeile in dem Else-Block vor.

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.