From: Javen O'Neal Date: Wed, 8 Feb 2017 07:20:31 +0000 (+0000) Subject: bug 59983: correctly update shared formulas when shifting rows. Thanks to Luca Martin... X-Git-Tag: REL_3_16_FINAL~116 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=2a0c4cdde470a9641c0c56f8c7f7e689992e81e8;p=poi.git bug 59983: correctly update shared formulas when shifting rows. Thanks to Luca Martini for the initial failing unit test with test file and Chiara Marcheschi for the patch git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1782111 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java index e55b014a7f..46f0b892cf 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java @@ -142,22 +142,27 @@ public final class XSSFRowShifter extends RowShifter { int si = (int)f.getSi(); CTCellFormula sf = sheet.getSharedFormula(si); sf.setStringValue(shiftedFormula); + updateRefInCTCellFormula(row, shifter, sf); } } } //Range of cells which the formula applies to. - if (f.isSetRef()) { - String ref = f.getRef(); - String shiftedRef = shiftFormula(row, ref, shifter); - if (shiftedRef != null) f.setRef(shiftedRef); - } + updateRefInCTCellFormula(row, shifter, f); } } } + private void updateRefInCTCellFormula(Row row, FormulaShifter shifter, CTCellFormula f) { + if (f.isSetRef()) { //Range of cells which the formula applies to. + String ref = f.getRef(); + String shiftedRef = shiftFormula(row, ref, shifter); + if (shiftedRef != null) f.setRef(shiftedRef); + } + } + /** * Shift a formula using the supplied FormulaShifter * diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetShiftRows.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetShiftRows.java index 42773aa6fb..78e9d1bb25 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetShiftRows.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetShiftRows.java @@ -427,8 +427,7 @@ public final class TestXSSFSheetShiftRows extends BaseTestSheetShiftRows { return cell.getCellFormula(); } - // This test is written as expected-to-fail and should be rewritten - // as expected-to-pass when the bug is fixed. + // bug 59983: Wrong update of shared formulas after shiftRow @Test public void testSharedFormulas() throws Exception { XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("TestShiftRowSharedFormula.xlsx"); @@ -437,17 +436,44 @@ public final class TestXSSFSheetShiftRows extends BaseTestSheetShiftRows { assertEquals("SUM(D2:D4)", getCellFormula(sheet, "D5")); assertEquals("SUM(E2:E4)", getCellFormula(sheet, "E5")); + assertEquals("SUM(C3:C5)", getCellFormula(sheet, "C6")); + assertEquals("SUM(D3:D5)", getCellFormula(sheet, "D6")); + assertEquals("SUM(E3:E5)", getCellFormula(sheet, "E6")); + sheet.shiftRows(3, sheet.getLastRowNum(), 1); - // FIXME: remove try, catch, and testPassesNow, skipTest when test passes - try { - assertEquals("SUM(C2:C5)", getCellFormula(sheet, "C6")); - assertEquals("SUM(D2:D5)", getCellFormula(sheet, "D6")); - assertEquals("SUM(E2:E5)", getCellFormula(sheet, "E6")); - testPassesNow(59983); - } catch (AssertionError e) { - skipTest(e); - } - + + assertEquals("SUM(C2:C5)", getCellFormula(sheet, "C6")); + assertEquals("SUM(D2:D5)", getCellFormula(sheet, "D6")); + assertEquals("SUM(E2:E5)", getCellFormula(sheet, "E6")); + + assertEquals("SUM(C3:C6)", getCellFormula(sheet, "C7")); + assertEquals("SUM(D3:D6)", getCellFormula(sheet, "D7")); + assertEquals("SUM(E3:E6)", getCellFormula(sheet, "E7")); + wb.close(); + } + + // bug 59983: Wrong update of shared formulas after shiftRow + @Test + public void testShiftSharedFormulas() throws Exception { + XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("TestShiftRowSharedFormula.xlsx"); + XSSFSheet sheet = wb.getSheetAt(0); + assertEquals("SUM(C2:C4)", getCellFormula(sheet, "C5")); + assertEquals("SUM(D2:D4)", getCellFormula(sheet, "D5")); + assertEquals("SUM(E2:E4)", getCellFormula(sheet, "E5")); + + assertEquals("SUM(C3:C5)", getCellFormula(sheet, "C6")); + assertEquals("SUM(D3:D5)", getCellFormula(sheet, "D6")); + assertEquals("SUM(E3:E5)", getCellFormula(sheet, "E6")); + + sheet.shiftRows(sheet.getFirstRowNum(), 4, -1); + + assertEquals("SUM(C1:C3)", getCellFormula(sheet, "C4")); + assertEquals("SUM(D1:D3)", getCellFormula(sheet, "D4")); + assertEquals("SUM(E1:E3)", getCellFormula(sheet, "E4")); + + assertEquals("SUM(C2:C4)", getCellFormula(sheet, "C6")); + assertEquals("SUM(D2:D4)", getCellFormula(sheet, "D6")); + assertEquals("SUM(E2:E4)", getCellFormula(sheet, "E6")); wb.close(); } diff --git a/test-data/spreadsheet/TestShiftRowSharedFormula.xlsx b/test-data/spreadsheet/TestShiftRowSharedFormula.xlsx index d8ac0c6e2e..8fc3c15a4a 100644 Binary files a/test-data/spreadsheet/TestShiftRowSharedFormula.xlsx and b/test-data/spreadsheet/TestShiftRowSharedFormula.xlsx differ