grailsとPOIでExcel出力してみた

元々Excelのシートだったものをgrailsで実装してみたんですが、結局Excelがいいよねぇ、ってな話もあってExcelにエクスポートできるようにもしてみました。人って我が侭だよな。

しばらく見てない間にApache POIになってて、3.2-Finalを使ってみたんだけど、セルにいちいちエンコードを設定しなくても日本語通るみたいですね。2.5くらいのころはダメだった気がするんですけど。でも、シートの取得は日本語ではダメだったな~。ちょっと長いから続きにコードを挙げておきます。教えて!Gooの質問の回答にあったコードなどもパクって、行コピーのところも書いておきます。

def downloadXLS = {
    if (servletContext.customerPoint) {
        POIFSFileSystem fs = new POIFSFileSystem(
         new FileInputStream(
           servletContext.getRealPath("/WEB-INF/customer_point.xls")
         )
       )
        HSSFWorkbook wb = new HSSFWorkbook(fs)
        HSSFSheet s = wb.getSheetAt(0)
        println "sheet: " + s.getLastRowNum()
        short r = 1
        servletContext.customerPoint.each {
            HSSFRow row = s.getRow(r)
            if (!row) row = copyRow(s.getRow(--r), s.createRow(++r))
            r++
            short c = 0
            HSSFCell cell = row.getCell(c++)
            cell.setCellValue(it.cstmr_id)
            cell = row.getCell(c++)
            cell.setCellValue(it.customer_name)
            cell = row.getCell(c++)
            cell.setCellValue(it.display_size_name)
            cell = row.getCell(c++)
            cell.setCellValue(it.mn_point)
            cell = row.getCell(c++)
            cell.setCellValue(it.cr_point)
            cell = row.getCell(c++)
            cell.setCellValue(it.nx_point)
            cell = row.getCell(c++)
            cell.setCellValue(it.cr_month)
        }
 
        if (r < s.getLastRowNum()) {
            (r..s.getLastRowNum()).reverseEach {
                HSSFRow row = s.getRow(it)
                s.removeRow(row)
            }
        }
 
        response.setHeader("Content-disposition", "attachment; download_history.xls")
        response.contentType = "application/vnd.ms-excel"
        wb.write(response.outputStream)
    }
}
 
def copyRow(HSSFRow src, HSSFRow dst) {
    int length = src.getLastCellNum()
    for (int i = 0; i < length; i++) {
        HSSFCell srcCell = src.getCell((short)i)
        HSSFCell cell = dst.createCell((short)i)
        if (srcCell != null) {
            // スタイルをコピー
            cell.setCellStyle(srcCell.getCellStyle())
            // 値を取得
            switch (srcCell.getCellType()) {
                case HSSFCell.CELL_TYPE_BLANK:
                    break
                case HSSFCell.CELL_TYPE_BOOLEAN:
                    cell.setCellValue(srcCell.getBooleanCellValue())
                    break
                case HSSFCell.CELL_TYPE_ERROR:
                    cell.setCellValue(srcCell.getErrorCellValue())
                    break
                case HSSFCell.CELL_TYPE_FORMULA:
                    cell.setCellValue(srcCell.getStringCellValue())
                    break
                case HSSFCell.CELL_TYPE_NUMERIC:
                    cell.setCellValue(srcCell.getNumericCellValue())
                    break
                case HSSFCell.CELL_TYPE_STRING:
                    cell.setCellValue(srcCell.getStringCellValue())
                    break
            }
        }
    }
    return dst
}

コメント

  1. […] 先日の記事でExcelに出力するのを書いたけど、もっといい方法を見つけました。 […]

タイトルとURLをコピーしました