テンプレートファイルからのコピーがうまく出来なかったため、POIとJRubyでExcelファイルを作成しました。
include_class "org.apache.poi.poifs.filesystem.POIFSFileSystem" include_class "org.apache.poi.hssf.usermodel.HSSFWorkbook" include_class "org.apache.poi.hssf.usermodel.HSSFSheet" include_class "org.apache.poi.hssf.usermodel.HSSFRow" include_class "org.apache.poi.hssf.usermodel.HSSFCell" include_class "org.apache.poi.hssf.usermodel.HSSFDateUtil" include_class "org.apache.poi.ss.util.CellRangeAddress" include_class "org.jruby.util.IOInputStream" def make_excel filename = "template.xls" ist = java.io.FileInputStream.new filename template = HSSFWorkbook.new ist @newSheet = template.createSheet template.setSheetName(1, "シート名") # シートの倍率設定 @newSheet.setZoom(85, 100) # セルの結合数 unionCellCount = @tempsheet.getNumMergedRegions() # 行のコピー rowCopy(0, 4, unionCellCount, 0) #値入力 setCellValue(@newSheet.getRow(1), 1, 10) # 印刷倍率設定 ps = @newSheet.getPrintSetup() ps.setScale(58) template.removeSheetAt(0) newFileName = "ファイル名.xls" io = java.io.FileOutputStream.new(newFileName) template.write(io) end
シートの倍率設定など、基本的な操作は簡単に出来ます。
ただ、テンプレートからのコピーになると、若干めんどくさくなります。
# セルに値を設定 def setCellValue(targetRow, cellNum, content) targetCell = targetRow.getCell(cellNum) targetCell.setCellValue(content) end # セルの書式を設定 def setCellFormula(targetRow, cellNum, content) targetCell = targetRow.getCell(cellNum) targetCell.setCellFormula(content) end # 指定範囲の行コピー def rowCopy(startCount, endCount, unionCount, cnt) for i in startCount .. endCount # テンプレートの行情報取得 copyRow = @tempsheet.getRow(i) # 新しい行を追加 newRow = @newSheet.createRow(i + cnt) length = copyRow.getLastCellNum() copyHeight = copyRow.getHeight() newRow.setHeight(copyHeight) for j in 0 .. length copyCell = copyRow.getCell(j) if copyCell != nil newCell = newRow.createCell(j) copyWidth = @tempsheet.getColumnWidth(j) @newSheet.setColumnWidth(j, copyWidth) copyCellStyle = copyCell.getCellStyle() newCell.setCellStyle(copyCellStyle) # セルの書式コピー case copyCell.getCellType() when HSSFCell::CELL_TYPE_STRING newCell.setCellValue(copyCell.getRichStringCellValue()) when HSSFCell::CELL_TYPE_NUMERIC if HSSFDateUtil::isCellDateFormatted(copyCell) then newCell.setCellValue(copyCell.getDateCellValue()) else newCell.setCellValue(copyCell.getNumericCellValue()) end when HSSFCell::CELL_TYPE_FORMULA newCell.setCellFormula(copyCell.getCellFormula()) when HSSFCell::CELL_TYPE_BOOLEAN newCell.setCellValue(copyCell.getBooleanCellValue()) end end end end cra = nil # セルの結合設定のコピー for i in 0 .. unionCount - 1 cra = @tempsheet.getMergedRegion(i) if cra.getFirstRow() >= startCount && cra.getFirstRow() <= endCount then cra.setFirstRow(cra.getFirstRow() + cnt) cra.setLastRow(cra.getLastRow() + cnt) @newSheet.addMergedRegion(cra); end end end行をコピーする際には、1行、1セルずつ、値、書式をコピーしています。