<!-- Don't forget to update status.xml too! -->
<release version="3.1-beta1" date="2008-??-??">
+ <action dev="POI-DEVELOPERS" type="fix">44508 - Fix formula evaluation with evaluateInCell on boolean formulas</action>
<action dev="POI-DEVELOPERS" type="fix">44510 - Fix how DVALRecord works with dropdowns</action>
<action dev="POI-DEVELOPERS" type="fix">44495 - Handle named cell ranges in formulas that have lower case parts</action>
<action dev="POI-DEVELOPERS" type="fix">44491 - Don't have the new-style "HPSF properties are always available" affect the old-style use of HPSF alongside HSSF</action>
<!-- Don't forget to update changes.xml too! -->
<changes>
<release version="3.1-beta1" date="2008-??-??">
+ <action dev="POI-DEVELOPERS" type="fix">44508 - Fix formula evaluation with evaluateInCell on boolean formulas</action>
+ <action dev="POI-DEVELOPERS" type="fix">44510 - Fix how DVALRecord works with dropdowns</action>
<action dev="POI-DEVELOPERS" type="fix">44495 - Handle named cell ranges in formulas that have lower case parts</action>
<action dev="POI-DEVELOPERS" type="fix">44491 - Don't have the new-style "HPSF properties are always available" affect the old-style use of HPSF alongside HSSF</action>
<action dev="POI-DEVELOPERS" type="fix">44471 - Crystal Reports generates files with short StyleRecords, which isn't allowed in the spec. Work around this</action>
boolRec.setColumn(col);
if (setValue)
{
- boolRec.setValue(getBooleanCellValue());
+ boolRec.setValue(convertCellValueToBoolean());
}
boolRec.setXFIndex(styleIndex);
boolRec.setRow(row);
}
(( BoolErrRecord ) record).setValue(value);
}
+ /**
+ * Chooses a new boolean value for the cell when its type is changing.<p/>
+ *
+ * Usually the caller is calling setCellType() with the intention of calling
+ * setCellValue(boolean) straight afterwards. This method only exists to give
+ * the cell a somewhat reasonable value until the setCellValue() call (if at all).
+ * TODO - perhaps a method like setCellTypeAndValue(int, Object) should be introduced to avoid this
+ */
+ private boolean convertCellValueToBoolean() {
+
+ switch (cellType) {
+ case CELL_TYPE_BOOLEAN:
+ return (( BoolErrRecord ) record).getBooleanValue();
+ case CELL_TYPE_STRING:
+ return Boolean.valueOf(((StringRecord)record).getString()).booleanValue();
+ case CELL_TYPE_NUMERIC:
+ return ((NumberRecord)record).getValue() != 0;
+
+ // All other cases convert to false
+ // These choices are not well justified.
+ case CELL_TYPE_FORMULA:
+ // should really evaluate, but HSSFCell can't call HSSFFormulaEvaluator
+ case CELL_TYPE_ERROR:
+ case CELL_TYPE_BLANK:
+ return false;
+ }
+ throw new RuntimeException("Unexpected cell type (" + cellType + ")");
+ }
/**
* get the value of the cell as a boolean. For strings, numbers, and errors, we throw an exception.
--- /dev/null
+package org.apache.poi.hssf.usermodel;
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+
+import junit.framework.TestCase;
+
+public class TestBug44508 extends TestCase {
+ protected String cwd = System.getProperty("HSSF.testdata.path");
+
+ public void testEvaluateBooleanInCell_bug44508() {
+ HSSFWorkbook wb = new HSSFWorkbook();
+ HSSFSheet sheet = wb.createSheet();
+ wb.setSheetName(0, "Sheet1");
+ HSSFRow row = sheet.createRow(0);
+ HSSFCell cell = row.createCell((short)0);
+
+ cell.setCellFormula("1=1");
+
+ HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(sheet, wb);
+ fe.setCurrentRow(row);
+ try {
+ fe.evaluateInCell(cell);
+ } catch (NumberFormatException e) {
+ fail("Identified bug 44508");
+ }
+ assertEquals(true, cell.getBooleanCellValue());
+ }
+}