POI 数式をコピーしたらセル座標もそのままコピーされる件

1 2 =A1+B1
2 2
3 2
4 2



という数式のセルをPOIでコピーしようとし
destCell.setCellValue(srcCell.getCellFormula();

って行ったら


1 2 =A1+B1
2 2 =A1+B1
3 2 =A1+B1
4 2 =A1+B1


こうなって全部3が入ってた(T_T)
ふざけんじゃねーよww


1 2 =A1+B1
2 2 =A2+B2
3 2 =A3+B3
4 2 =A4+B4



ってなるにはどうなるか調べたら結構処理が多かった(^_^;)





/**
 * セルをコピーする。
 * @param srcCell コピー元
 * @param destCell コピー先
 */
private void copyCell2Cell(Cell srcCell, Cell destCell) {
   String formula = srcCell.getCellFormula();
   EvaluationWorkbook ew;
   FormulaRenderingWorkbook rw;
   Ptg[] ptgs;
   if (workbook instanceof HSSFWorkbook) {
      ew = HSSFEvaluationWorkbook.create((HSSFWorkbook) workbook);
      ptgs = FormulaParser.parse(formula, (HSSFEvaluationWorkbook) ew, FormulaType.CELL, getActiveSheet());
      rw = (HSSFEvaluationWorkbook) ew;
   } else {
      ew = XSSFEvaluationWorkbook.create((XSSFWorkbook) workbook);
      ptgs = FormulaParser.parse(formula, (XSSFEvaluationWorkbook) ew, FormulaType.CELL, getActiveSheet());
      rw = (XSSFEvaluationWorkbook) ew;
   }
   for (Ptg ptg : ptgs) {
      // 座標の計算
      int shiftRows = destCell.getRowIndex() - srcCell.getRowIndex();
      int shiftCols = destCell.getColumnIndex() - srcCell.getColumnIndex();
      if (ptg instanceof RefPtgBase) {
         RefPtgBase ref = (RefPtgBase) ptg;
         if (ref.isColRelative()) {
       ref.setColumn(ref.getColumn() + shiftCols);
         }
         if (ref.isRowRelative()) {
       ref.setRow(ref.getRow() + shiftRows);
         }
      } else if (ptg instanceof AreaPtg) {
         AreaPtg ref = (AreaPtg) ptg;
         if (ref.isFirstColRelative()) {
       ref.setFirstColumn(ref.getFirstColumn() + shiftCols);
         }
         if (ref.isLastColRelative()) {
       ref.setLastColumn(ref.getLastColumn() + shiftCols);
         }
         if (ref.isFirstRowRelative()) {
       ref.setFirstRow(ref.getFirstRow() + shiftRows);
         }
         if (ref.isLastRowRelative()) {
       ref.setLastRow(ref.getLastRow() + shiftRows);
         }
      }
   }
   destCell.setCellFormula(FormulaRenderer.toFormulaString(rw, ptgs));
}


やっぱりGoogle先生は答えを知ってるね(ノ´∀`*)





0 件のコメント:

コメントを投稿