mirror of https://github.com/apache/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
This commit is contained in:
parent
2355970252
commit
2a0c4cdde4
|
@ -142,22 +142,27 @@ public final class XSSFRowShifter extends RowShifter {
|
||||||
int si = (int)f.getSi();
|
int si = (int)f.getSi();
|
||||||
CTCellFormula sf = sheet.getSharedFormula(si);
|
CTCellFormula sf = sheet.getSharedFormula(si);
|
||||||
sf.setStringValue(shiftedFormula);
|
sf.setStringValue(shiftedFormula);
|
||||||
|
updateRefInCTCellFormula(row, shifter, sf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Range of cells which the formula applies to.
|
//Range of cells which the formula applies to.
|
||||||
if (f.isSetRef()) {
|
updateRefInCTCellFormula(row, shifter, f);
|
||||||
String ref = f.getRef();
|
|
||||||
String shiftedRef = shiftFormula(row, ref, shifter);
|
|
||||||
if (shiftedRef != null) f.setRef(shiftedRef);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
* Shift a formula using the supplied FormulaShifter
|
||||||
*
|
*
|
||||||
|
|
|
@ -427,8 +427,7 @@ public final class TestXSSFSheetShiftRows extends BaseTestSheetShiftRows {
|
||||||
return cell.getCellFormula();
|
return cell.getCellFormula();
|
||||||
}
|
}
|
||||||
|
|
||||||
// This test is written as expected-to-fail and should be rewritten
|
// bug 59983: Wrong update of shared formulas after shiftRow
|
||||||
// as expected-to-pass when the bug is fixed.
|
|
||||||
@Test
|
@Test
|
||||||
public void testSharedFormulas() throws Exception {
|
public void testSharedFormulas() throws Exception {
|
||||||
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("TestShiftRowSharedFormula.xlsx");
|
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(D2:D4)", getCellFormula(sheet, "D5"));
|
||||||
assertEquals("SUM(E2:E4)", getCellFormula(sheet, "E5"));
|
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);
|
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(C2:C5)", getCellFormula(sheet, "C6"));
|
assertEquals("SUM(D2:D5)", getCellFormula(sheet, "D6"));
|
||||||
assertEquals("SUM(D2:D5)", getCellFormula(sheet, "D6"));
|
assertEquals("SUM(E2:E5)", getCellFormula(sheet, "E6"));
|
||||||
assertEquals("SUM(E2:E5)", getCellFormula(sheet, "E6"));
|
|
||||||
testPassesNow(59983);
|
assertEquals("SUM(C3:C6)", getCellFormula(sheet, "C7"));
|
||||||
} catch (AssertionError e) {
|
assertEquals("SUM(D3:D6)", getCellFormula(sheet, "D7"));
|
||||||
skipTest(e);
|
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();
|
wb.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue