2017-12-01 4 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で、式には、Apache POIで=A5/B5.

になりますと言います。

答えて

2

あなたのコードは何かをコピー/ペーストするのではなく、あるセルから数式文字列を取得し、この数式文字列を別のセルに正確に設定します。これは数式文字列を変更しません。どのようにそれを行う必要がありますか?

したがって、1つのセルから数式文字列を取得し、この数式文字列をターゲットセルに調整する必要があります。

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

関連する問題