diff options
author | Yegor Kozlov <yegor@apache.org> | 2012-10-04 13:26:44 +0000 |
---|---|---|
committer | Yegor Kozlov <yegor@apache.org> | 2012-10-04 13:26:44 +0000 |
commit | f55e1011fffb72b46bebaa8bb7a6dca2e685bdaa (patch) | |
tree | 3d38967f26a204168da38a0b1fa7d9e59d54efef | |
parent | 8cd113ba9ef5e2f3dfe9ef3fcefdbde0000e778a (diff) | |
download | poi-f55e1011fffb72b46bebaa8bb7a6dca2e685bdaa.tar.gz poi-f55e1011fffb72b46bebaa8bb7a6dca2e685bdaa.zip |
Bugzilla 53950 - fixed setForceFormulaRecalculation to reset workbook-level manual flag<
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1394059 13f79535-47bb-0310-9956-ffa450edef68
5 files changed, 29 insertions, 7 deletions
diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 90fdb8838c..69870b19c5 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ <changes> <release version="3.9-beta1" date="2012-??-??"> + <action dev="poi-developers" type="fix">53950 - fixed setForceFormulaRecalculation to reset workbook-level "manual" flag</action> <action dev="poi-developers" type="fix">52211 - avoid unnessary re-coverting content types to US-ASCII, it can cause exceptions on ibm mainframes</action> <action dev="poi-developers" type="fix">53568 - Set shapes anchors in XSSF when reading from existing drawings</action> <action dev="poi-developers" type="add">HSSFOptimiser will now also tidy away un-used cell styles, in addition to duplicate styles</action> diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java index ccf2419873..438b1ef328 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java @@ -1502,7 +1502,9 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { * @see org.apache.poi.ss.usermodel.Workbook#setForceFormulaRecalculation(boolean) */ public void setForceFormulaRecalculation(boolean value) { - if(worksheet.isSetSheetCalcPr()) { + CTCalcPr calcPr = getWorkbook().getCTWorkbook().getCalcPr(); + + if(worksheet.isSetSheetCalcPr()) { // Change the current setting CTSheetCalcPr calc = worksheet.getSheetCalcPr(); calc.setFullCalcOnLoad(value); @@ -1512,9 +1514,10 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { CTSheetCalcPr calc = worksheet.addNewSheetCalcPr(); calc.setFullCalcOnLoad(value); } - else { - // Not set, requested not, nothing to do - } + if(value && calcPr != null && calcPr.getCalcMode() == STCalcMode.MANUAL) { + calcPr.setCalcMode(STCalcMode.AUTO); + } + } /** diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java index 639a78d423..f50c42a150 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java @@ -1672,6 +1672,10 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X // when set to 0, will tell Excel that it needs to recalculate all formulas // in the workbook the next time the file is opened. calcPr.setCalcId(0); + + if(value && calcPr.getCalcMode() == STCalcMode.MANUAL) { + calcPr.setCalcMode(STCalcMode.AUTO); + } } /** diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java index 141a06fdbf..e47632acf9 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java @@ -1074,11 +1074,18 @@ public final class TestXSSFSheet extends BaseTestSheet { // Set sheet.setForceFormulaRecalculation(true); assertEquals(true, sheet.getForceFormulaRecalculation()); - - // Check + + // calcMode="manual" is unset when forceFormulaRecalculation=true + CTCalcPr calcPr = workbook.getCTWorkbook().addNewCalcPr(); + calcPr.setCalcMode(STCalcMode.MANUAL); + sheet.setForceFormulaRecalculation(true); + assertEquals(STCalcMode.AUTO, calcPr.getCalcMode()); + + // Check sheet.setForceFormulaRecalculation(false); assertEquals(false, sheet.getForceFormulaRecalculation()); - + + // Save, re-load, and re-check workbook = XSSFTestDataSamples.writeOutAndReadBack(workbook); sheet = workbook.getSheet("Sheet 1"); diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java index 3a755d37fd..60ad9fbbdb 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java @@ -35,6 +35,7 @@ import org.apache.poi.xssf.model.StylesTable; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCalcPr; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbookPr; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCalcMode; public final class TestXSSFWorkbook extends BaseTestWorkbook { @@ -426,6 +427,12 @@ public final class TestXSSFWorkbook extends BaseTestWorkbook { wb.setForceFormulaRecalculation(true); // resets the EngineId flag to zero assertEquals(0, (int) calcPr.getCalcId()); assertFalse(wb.getForceFormulaRecalculation()); + + // calcMode="manual" is unset when forceFormulaRecalculation=true + calcPr.setCalcMode(STCalcMode.MANUAL); + wb.setForceFormulaRecalculation(true); + assertEquals(STCalcMode.AUTO, calcPr.getCalcMode()); + } public void testChangeSheetNameWithSharedFormulas() { |