2017-12-01 1 views
0

Apache POI에서 수식을 복사 할 때 수식 참조를 업데이트하는 방법이 있습니까?복사 할 때 Apache POI 업데이트 수식 참조

Excel에서 1 행에 수식 =A1/B1이 있다고 말하십시오. 당신이 그것을 복사 - 붙여 넣기하면 수식이 =A1/B1 남아

r5.getCell(2).setCellType(CellType.FORMULA); 
r5.getCell(2).setCellFormula(r1.getCell(2).getCellFormula()); 

라인을 실행하면 행 5, 공식 아파치 POI에서 =A5/B5.

됩니다 말한다.

답변

2

코드는 복사/붙여 넣기가 아니라 하나의 셀에서 수식 문자열을 가져 와서이 수식 문자열을 다른 셀에 정확하게 설정합니다. 이것은 수식 문자열을 변경하지 않습니다. 어떻게해야합니까?

따라서 하나의 셀에서 수식 문자열을 가져온 다음이 수식 문자열을 대상 셀에 맞게 조정해야합니다.

apache poi은 수식을 계산할 수 있으므로 수식도 분석 할 수 있어야합니다. 파싱 ​​클래스는 org.apache.poi.ss.formulaorg.apache.poi.ss.formula.ptg 패키지에 있습니다.

그래서 이러한 클래스를 사용하여 수식 문자열을 대상 셀로 조정할 수 있습니다.

예 :

다음 Excel 통합 문서 :

enter image description here

및 다음 코드 :

E3=C3/D3->C6=A6/B6 
E4=$C4/D$4->C7=$C7/B$4 
E5=SUM(C3:D5)->C8=SUM(A6:B8) 
E6=SUM(C$3:$D6)->C9=SUM(A$3:$D9) 
E7=C3+SUM(C3:D7)->C10=A6+SUM(A6:B10) 
E8=C$3+SUM($C3:D$8)->C11=A$3+SUM($C6:B$8) 
+0

워트 :

import java.io.FileInputStream; import org.apache.poi.ss.formula.*; import org.apache.poi.ss.formula.ptg.*; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.*; import org.apache.poi.ss.util.CellAddress; public class ExcelCopyFormula { private static String copyFormula(XSSFSheet sheet, String formula, int coldiff, int rowdiff) { XSSFEvaluationWorkbook workbookWrapper = XSSFEvaluationWorkbook.create((XSSFWorkbook) sheet.getWorkbook()); Ptg[] ptgs = FormulaParser.parse(formula, workbookWrapper, FormulaType.CELL , sheet.getWorkbook().getSheetIndex(sheet)); for (int i = 0; i < ptgs.length; i++) { if (ptgs[i] instanceof RefPtgBase) { // base class for cell references RefPtgBase ref = (RefPtgBase) ptgs[i]; if (ref.isColRelative()) ref.setColumn(ref.getColumn() + coldiff); if (ref.isRowRelative()) ref.setRow(ref.getRow() + rowdiff); } else if (ptgs[i] instanceof AreaPtgBase) { // base class for range references AreaPtgBase ref = (AreaPtgBase) ptgs[i]; if (ref.isFirstColRelative()) ref.setFirstColumn(ref.getFirstColumn() + coldiff); if (ref.isLastColRelative()) ref.setLastColumn(ref.getLastColumn() + coldiff); if (ref.isFirstRowRelative()) ref.setFirstRow(ref.getFirstRow() + rowdiff); if (ref.isLastRowRelative()) ref.setLastRow(ref.getLastRow() + rowdiff); } } formula = FormulaRenderer.toFormulaString(workbookWrapper, ptgs); return formula; } public static void main(String[] args) throws Exception { XSSFWorkbook workbook = (XSSFWorkbook)WorkbookFactory.create(new FileInputStream("test.xlsx")); XSSFSheet sheet = workbook.getSheetAt(0); for (Row row : sheet) { for (Cell cell : row) { if (cell.getCellTypeEnum() == CellType.FORMULA) { CellAddress source = cell.getAddress(); String formula = cell.getCellFormula(); System.out.print(source + "=" + formula); int rowdiff = 3; int coldiff = -2; CellAddress target = new CellAddress(source.getRow() + rowdiff, source.getColumn() + coldiff); String newformula = copyFormula(sheet, formula, coldiff, rowdiff); System.out.println("->" + target + "=" + newformula); } } } workbook.close(); } } 

다음과 같은 결과에 이르게 이것은 poi의 기본 기능이 아니라는 것을 알았습니다. – Luke