#61700 getForceFormulaRecalculation() returns wrong value

changed to use the proper OOXML attribute instead of a hack about calculation engine version ID.  Reporter was right, the behavior was wrong in some cases, but it turns out the fix was a bit more.  See issue for details.

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1856652 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Greg Woolsey 2019-03-31 01:00:05 +00:00
parent b9101138bd
commit 6b76706ef7
2 changed files with 9 additions and 11 deletions

View File

@ -2221,9 +2221,9 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Date1904Su
public void setForceFormulaRecalculation(boolean value){ public void setForceFormulaRecalculation(boolean value){
CTWorkbook ctWorkbook = getCTWorkbook(); CTWorkbook ctWorkbook = getCTWorkbook();
CTCalcPr calcPr = ctWorkbook.isSetCalcPr() ? ctWorkbook.getCalcPr() : ctWorkbook.addNewCalcPr(); CTCalcPr calcPr = ctWorkbook.isSetCalcPr() ? ctWorkbook.getCalcPr() : ctWorkbook.addNewCalcPr();
// when set to 0, will tell Excel that it needs to recalculate all formulas // when set to true, will tell Excel that it needs to recalculate all formulas
// in the workbook the next time the file is opened. // in the workbook the next time the file is opened.
calcPr.setCalcId(0); calcPr.setFullCalcOnLoad(value);
if(value && calcPr.getCalcMode() == STCalcMode.MANUAL) { if(value && calcPr.getCalcMode() == STCalcMode.MANUAL) {
calcPr.setCalcMode(STCalcMode.AUTO); calcPr.setCalcMode(STCalcMode.AUTO);
@ -2239,7 +2239,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Date1904Su
public boolean getForceFormulaRecalculation(){ public boolean getForceFormulaRecalculation(){
CTWorkbook ctWorkbook = getCTWorkbook(); CTWorkbook ctWorkbook = getCTWorkbook();
CTCalcPr calcPr = ctWorkbook.getCalcPr(); CTCalcPr calcPr = ctWorkbook.getCalcPr();
return calcPr != null && calcPr.getCalcId() != 1; return calcPr != null && calcPr.isSetFullCalcOnLoad() && calcPr.getFullCalcOnLoad();
} }

View File

@ -489,7 +489,7 @@ public final class TestXSSFWorkbook extends BaseTestXWorkbook {
CTWorkbook ctWorkbook = wb.getCTWorkbook(); CTWorkbook ctWorkbook = wb.getCTWorkbook();
assertFalse(ctWorkbook.isSetCalcPr()); assertFalse(ctWorkbook.isSetCalcPr());
wb.setForceFormulaRecalculation(true); // resets the EngineId flag to zero wb.setForceFormulaRecalculation(true);
CTCalcPr calcPr = ctWorkbook.getCalcPr(); CTCalcPr calcPr = ctWorkbook.getCalcPr();
assertNotNull(calcPr); assertNotNull(calcPr);
@ -498,8 +498,7 @@ public final class TestXSSFWorkbook extends BaseTestXWorkbook {
calcPr.setCalcId(100); calcPr.setCalcId(100);
assertTrue(wb.getForceFormulaRecalculation()); assertTrue(wb.getForceFormulaRecalculation());
wb.setForceFormulaRecalculation(true); // resets the EngineId flag to zero wb.setForceFormulaRecalculation(false);
assertEquals(0, (int) calcPr.getCalcId());
assertTrue(wb.getForceFormulaRecalculation()); assertTrue(wb.getForceFormulaRecalculation());
// calcMode="manual" is unset when forceFormulaRecalculation=true // calcMode="manual" is unset when forceFormulaRecalculation=true
@ -1145,8 +1144,7 @@ public final class TestXSSFWorkbook extends BaseTestXWorkbook {
} }
/** /**
* See bug #61700 test data tables * See bug #61700
*
* @throws Exception * @throws Exception
*/ */
@Test @Test
@ -1154,14 +1152,14 @@ public final class TestXSSFWorkbook extends BaseTestXWorkbook {
Workbook workbook = _testDataProvider.createWorkbook(); Workbook workbook = _testDataProvider.createWorkbook();
workbook.createSheet().createRow(0).createCell(0).setCellFormula("B1+C1"); workbook.createSheet().createRow(0).createCell(0).setCellFormula("B1+C1");
workbook.getCreationHelper().createFormulaEvaluator().evaluateAll(); workbook.getCreationHelper().createFormulaEvaluator().evaluateAll();
assertFalse(workbook.getForceFormulaRecalculation()); assertFalse(workbook.getForceFormulaRecalculation());
workbook.setForceFormulaRecalculation(true); workbook.setForceFormulaRecalculation(true);
assertTrue(workbook.getForceFormulaRecalculation()); assertTrue(workbook.getForceFormulaRecalculation());
Workbook wbBack = _testDataProvider.writeOutAndReadBack(workbook); Workbook wbBack = _testDataProvider.writeOutAndReadBack(workbook);
assertTrue(wbBack.getForceFormulaRecalculation()); assertTrue(wbBack.getForceFormulaRecalculation());
workbook.close(); workbook.close();
wbBack.close(); wbBack.close();
} }