やあ (´・ω・`)
ようこそ、バーボンハウスへ。
このテキーラはサービスだから、まず飲んで落ち着いて欲しい。
うん、「また」なんだ。済まない。
仏の顔もって言うしね、謝って許してもらおうとも思っていない。
でも、このブログを見たとき、君は、きっと言葉では言い表せない
「ときめき」みたいなものを感じてくれたと思う。
殺伐とした世の中で、そういう気持ちを忘れないで欲しい
そう思って、このブログを作ったんだ。
じゃあ、注文を聞こうか。
「POIでエクセルの指定した範囲をコピーしたいよ」
っていう注文が入ったので早速作ったよ(*´ω`*)
苦戦したのが、セルの幅と結合したセルのコピーね(;´Д`)
/** * 指定した範囲のセルをコピーする。 * * @param copyRow0 * 開始行 * @param copyColumn0 * 開始列 * @param copyRow1 * 終了行 * @param copyColumn1 * 終了列 * @param startRow * 貼り付け行 * @param startColumn * 貼り付け列 */ public void copyCellArea(final int copyRow0, final int copyColumn0, final int copyRow1, final int copyColumn1, final int startRow, final int startColumn) { for (int i = 0; copyRow0 + i <= copyRow1; i++) { for (int j = 0; copyColumn0 + j <= copyColumn1; j++) { Cell srcCell = getCell(copyRow0 + i, copyColumn0 + j); Cell destCell = getCell(startRow + i, startColumn + j); // スタイルを取得 destCell.setCellStyle(cloneCellStyle(srcCell.getCellStyle())); destCell.setCellType(srcCell.getCellType()); // 値の設定 switch (srcCell.getCellType()) { case Cell.CELL_TYPE_BOOLEAN: destCell.setCellValue(srcCell.getBooleanCellValue()); break; case Cell.CELL_TYPE_ERROR: destCell.setCellValue(srcCell.getErrorCellValue()); break; case Cell.CELL_TYPE_FORMULA: destCell.setCellFormula(srcCell.getCellFormula()); break; case Cell.CELL_TYPE_NUMERIC: destCell.setCellValue(srcCell.getNumericCellValue()); break; case Cell.CELL_TYPE_STRING: destCell.setCellValue(srcCell.getStringCellValue()); break; default: } // 結合の設定 for (int k = 0; k < sheet.getNumMergedRegions(); k++) { CellRangeAddress merged = sheet.getMergedRegion(k); if (merged.isInRange(copyRow0 + i, copyColumn0 + j)) { int moveRows = startRow - copyRow0; int moveCols = startColumn - copyColumn0; CellRangeAddress newMaerged = new CellRangeAddress(moveRows + merged.getFirstRow(), moveRows + merged.getLastRow(), moveCols + merged.getFirstColumn(), moveCols + merged.getLastColumn()); sheet.addMergedRegion(newMaerged); break; } } // 幅サイズ調節 if (i == 0) { sheet.setColumnWidth(startColumn + j, sheet.getColumnWidth(copyColumn0 + j)); } } } } /** * Cell を返す。 * * @param row * 行 * @param column * 列 * @return Cell */ protected Cell getCell(final int row, final int column) { return CellUtil.getCell(CellUtil.getRow(row, sheet), column); } /** * セルの書式設定を複製します。 * * @param originalStyle * 複製元となるPOIのセルスタイルオブジェクト * @return 複製されたPOIのセルスタイルオブジェクト */ private CellStyle cloneCellStyle(final CellStyle originalStyle) { CellStyle newStyle = workbook.createCellStyle(); newStyle.cloneStyleFrom(originalStyle); return newStyle; }
注目するのがsheet.getNumMergedRegions()かな
sheet.getNumMergedRegions()で結合している箇所の数を取得して
CellRangeAddress merged = sheet.getMergedRegion(k); で結合範囲を取得
merged.isInRange(copyRow0 + i, copyColumn0 + j) でコピー元範囲か検索(´・ω・`)
面倒臭かったですwwww
あとセルの取得はCellUtilを使ったほうがいいです(´・ω・`)
これはおすすめします(`・ω・´)
0 件のコメント:
コメントを投稿