import org.apache.poi.ss.usermodel.*
+import org.apache.poi.ss.util.*
import java.io.File
if (args.length == 0) {
println "Use:"
- println " SpreadSheetDemo [excel-file]"
+ println " SpreadSheetDemo <excel-file> [output-file]"
return 1
}
-File f = new File(args[0]);
+File f = new File(args[0])
+DataFormatter formatter = new DataFormatter()
WorkbookFactory.create(f,null,true).withCloseable { workbook ->
println "Has ${workbook.getNumberOfSheets()} sheets"
- 0.step workbook.getNumberOfSheets(), 1, { sheetNum ->
- println "Sheet ${sheetNum} is called ${workbook.getSheetName(sheetNum)}"
+
+ // Dump the contents of the spreadsheet
+ (0..<workbook.getNumberOfSheets()).each { sheetNum ->
+ println "Sheet ${sheetNum} is called ${workbook.getSheetName(sheetNum)}"
+
+ def sheet = workbook.getSheetAt(sheetNum)
+ sheet.each { row ->
+ def nonEmptyCells = row.grep { c -> c.getCellType() != Cell.CELL_TYPE_BLANK }
+ println " Row ${row.getRowNum()} has ${nonEmptyCells.size()} non-empty cells:"
+ nonEmptyCells.each { c ->
+ def cRef = [c] as CellReference
+ println " * ${cRef.formatAsString()} = ${formatter.formatCellValue(c)}"
+ }
+ }
}
+
+ // Add two new sheets and populate
+ CellStyle headerStyle = makeHeaderStyle(workbook)
+ Sheet ns1 = workbook.createSheet("Generated 1")
+ exportHeader(ns1, headerStyle, null, ["ID","Title","Num"] as String[])
+ ns1.createRow(1).createCell(0).setCellValue("TODO - Populate with data")
+
+ Sheet ns2 = workbook.createSheet("Generated 2")
+ exportHeader(ns2, headerStyle, "This is a demo sheet",
+ ["ID","Title","Date","Author","Num"] as String[])
+ ns2.createRow(2).createCell(0).setCellValue(1)
+ ns2.createRow(3).createCell(0).setCellValue(4)
+ ns2.createRow(4).createCell(0).setCellValue(1)
+
+ // Save
+ File output = File.createTempFile("output-", (f.getName() =~ /(\.\w+$)/)[0][0])
+ output.withOutputStream { os -> workbook.write(os) }
+ println "Saved as ${output}"
}
+CellStyle makeHeaderStyle(Workbook wb) {
+ int HEADER_HEIGHT = 18
+ CellStyle style = wb.createCellStyle()
+
+ style.setFillForegroundColor(IndexedColors.AQUA.getIndex())
+ style.setFillPattern(FillPatternType.SOLID_FOREGROUND)
+
+ Font font = wb.createFont()
+ font.setFontHeightInPoints((short)HEADER_HEIGHT)
+ font.setBold(true)
+ style.setFont(font)
+
+ return style
+}
+void exportHeader(Sheet s, CellStyle headerStyle, String info, String[] headers) {
+ Row r
+ int rn = 0
+ int HEADER_HEIGHT = 18
+ // Do they want an info row at the top?
+ if (info != null && !info.isEmpty()) {
+ r = s.createRow(rn)
+ r.setHeightInPoints(HEADER_HEIGHT+1)
+ rn++
+
+ Cell c = r.createCell(0)
+ c.setCellValue(info)
+ c.setCellStyle(headerStyle)
+ s.addMergedRegion(new CellRangeAddress(0,0,0,headers.length-1))
+ }
+ // Create the header row, of the right size
+ r = s.createRow(rn)
+ r.setHeightInPoints(HEADER_HEIGHT+1)
+ // Add the column headings
+ headers.eachWithIndex { col, idx ->
+ Cell c = r.createCell(idx)
+ c.setCellValue(col)
+ c.setCellStyle(headerStyle)
+ s.autoSizeColumn(idx)
+ }
+ // Make all the columns filterable
+ s.setAutoFilter(new CellRangeAddress(rn, rn, 0, headers.length-1))
+}