POIでエクセルの指定した範囲をコピーしたいよ



やあ (´・ω・`)

ようこそ、バーボンハウスへ。


このテキーラはサービスだから、まず飲んで落ち着いて欲しい。

うん、「また」なんだ。済まない。
仏の顔もって言うしね、謝って許してもらおうとも思っていない。


でも、このブログを見たとき、君は、きっと言葉では言い表せない
「ときめき」みたいなものを感じてくれたと思う。
殺伐とした世の中で、そういう気持ちを忘れないで欲しい
そう思って、このブログを作ったんだ。


じゃあ、注文を聞こうか。



「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 件のコメント:

コメントを投稿