元々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 } |
コメント
[…] 先日の記事でExcelに出力するのを書いたけど、もっといい方法を見つけました。 […]