]> source.dussan.org Git - poi.git/commitdiff
bug 59983: correctly update shared formulas when shifting rows. Thanks to Luca Martin...
authorJaven O'Neal <onealj@apache.org>
Wed, 8 Feb 2017 07:20:31 +0000 (07:20 +0000)
committerJaven O'Neal <onealj@apache.org>
Wed, 8 Feb 2017 07:20:31 +0000 (07:20 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1782111 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetShiftRows.java
test-data/spreadsheet/TestShiftRowSharedFormula.xlsx

index e55b014a7f97e30a6cfddef5188eb9224eb17000..46f0b892cf3f50fc9788241601bfb5cfb5697e17 100644 (file)
@@ -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
      *
index 42773aa6fb8938328cf413dfaed517ebf93e09ab..78e9d1bb254d10a1750ad4ccfa6e8018dcfce70e 100644 (file)
@@ -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();
     }
     
index d8ac0c6e2e650e7cbe896cb589a16f7d11507c59..8fc3c15a4a263bdd3cb4b965f268bf0bdd5f25b0 100644 (file)
Binary files a/test-data/spreadsheet/TestShiftRowSharedFormula.xlsx and b/test-data/spreadsheet/TestShiftRowSharedFormula.xlsx differ