Fix cell.getRichStringCellValue() for formula cells with string results
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@675727 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
fa00b16511
commit
1e5b805dfd
@ -37,6 +37,7 @@
|
|||||||
|
|
||||||
<!-- Don't forget to update status.xml too! -->
|
<!-- Don't forget to update status.xml too! -->
|
||||||
<release version="3.1.1-alpha1" date="2008-??-??">
|
<release version="3.1.1-alpha1" date="2008-??-??">
|
||||||
|
<action dev="POI-DEVELOPERS" type="fix">Fix cell.getRichStringCellValue() for formula cells with string results</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">45365 - Handle more excel number formatting rules in FormatTrackingHSSFListener / XLS2CSVmra</action>
|
<action dev="POI-DEVELOPERS" type="fix">45365 - Handle more excel number formatting rules in FormatTrackingHSSFListener / XLS2CSVmra</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">45373 - Improve the performance of HSSFSheet.shiftRows</action>
|
<action dev="POI-DEVELOPERS" type="fix">45373 - Improve the performance of HSSFSheet.shiftRows</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">45367 - Fixed bug when last row removed from sheet is row zero</action>
|
<action dev="POI-DEVELOPERS" type="fix">45367 - Fixed bug when last row removed from sheet is row zero</action>
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
<!-- Don't forget to update changes.xml too! -->
|
<!-- Don't forget to update changes.xml too! -->
|
||||||
<changes>
|
<changes>
|
||||||
<release version="3.1.1-alpha1" date="2008-??-??">
|
<release version="3.1.1-alpha1" date="2008-??-??">
|
||||||
|
<action dev="POI-DEVELOPERS" type="fix">Fix cell.getRichStringCellValue() for formula cells with string results</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">45365 - Handle more excel number formatting rules in FormatTrackingHSSFListener / XLS2CSVmra</action>
|
<action dev="POI-DEVELOPERS" type="fix">45365 - Handle more excel number formatting rules in FormatTrackingHSSFListener / XLS2CSVmra</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">45373 - Improve the performance of HSSFSheet.shiftRows</action>
|
<action dev="POI-DEVELOPERS" type="fix">45373 - Improve the performance of HSSFSheet.shiftRows</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">45367 - Fixed bug when last row removed from sheet is row zero</action>
|
<action dev="POI-DEVELOPERS" type="fix">45367 - Fixed bug when last row removed from sheet is row zero</action>
|
||||||
|
@ -601,13 +601,28 @@ public class HSSFCell
|
|||||||
// Set the 'pre-evaluated result' for the formula
|
// Set the 'pre-evaluated result' for the formula
|
||||||
// note - formulas do not preserve text formatting.
|
// note - formulas do not preserve text formatting.
|
||||||
FormulaRecordAggregate fr = (FormulaRecordAggregate) record;
|
FormulaRecordAggregate fr = (FormulaRecordAggregate) record;
|
||||||
// must make new sr because fr.getStringRecord() may be null
|
|
||||||
StringRecord sr = new StringRecord();
|
// Save the string into a String Record, creating
|
||||||
sr.setString(value.getString()); // looses format
|
// one if required
|
||||||
fr.setStringRecord(sr);
|
StringRecord sr = fr.getStringRecord();
|
||||||
|
if(sr == null) {
|
||||||
|
// Wasn't a string before, need a new one
|
||||||
|
sr = new StringRecord();
|
||||||
|
fr.setStringRecord(sr);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save, loosing the formatting
|
||||||
|
sr.setString(value.getString());
|
||||||
|
// Update our local cache to the un-formatted version
|
||||||
|
stringValue = new HSSFRichTextString(sr.getString());
|
||||||
|
|
||||||
|
// All done
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If we get here, we're not dealing with a formula,
|
||||||
|
// so handle things as a normal rich text cell
|
||||||
|
|
||||||
if (cellType != CELL_TYPE_STRING) {
|
if (cellType != CELL_TYPE_STRING) {
|
||||||
setCellType(CELL_TYPE_STRING, false, row, col, styleIndex);
|
setCellType(CELL_TYPE_STRING, false, row, col, styleIndex);
|
||||||
}
|
}
|
||||||
|
BIN
src/testcases/org/apache/poi/hssf/data/43623.xls
Normal file
BIN
src/testcases/org/apache/poi/hssf/data/43623.xls
Normal file
Binary file not shown.
@ -31,9 +31,7 @@ import org.apache.poi.hssf.HSSFTestDataSamples;
|
|||||||
import org.apache.poi.hssf.model.Workbook;
|
import org.apache.poi.hssf.model.Workbook;
|
||||||
import org.apache.poi.hssf.record.CellValueRecordInterface;
|
import org.apache.poi.hssf.record.CellValueRecordInterface;
|
||||||
import org.apache.poi.hssf.record.EmbeddedObjectRefSubRecord;
|
import org.apache.poi.hssf.record.EmbeddedObjectRefSubRecord;
|
||||||
import org.apache.poi.hssf.record.FormulaRecord;
|
|
||||||
import org.apache.poi.hssf.record.NameRecord;
|
import org.apache.poi.hssf.record.NameRecord;
|
||||||
import org.apache.poi.hssf.record.Record;
|
|
||||||
import org.apache.poi.hssf.record.aggregates.FormulaRecordAggregate;
|
import org.apache.poi.hssf.record.aggregates.FormulaRecordAggregate;
|
||||||
import org.apache.poi.hssf.record.formula.DeletedArea3DPtg;
|
import org.apache.poi.hssf.record.formula.DeletedArea3DPtg;
|
||||||
import org.apache.poi.hssf.util.Region;
|
import org.apache.poi.hssf.util.Region;
|
||||||
@ -1151,10 +1149,12 @@ public final class TestBugs extends TestCase {
|
|||||||
s.createRow(0);
|
s.createRow(0);
|
||||||
HSSFCell c1 = s.getRow(0).createCell((short)0);
|
HSSFCell c1 = s.getRow(0).createCell((short)0);
|
||||||
HSSFCell c2 = s.getRow(0).createCell((short)1);
|
HSSFCell c2 = s.getRow(0).createCell((short)1);
|
||||||
|
HSSFCell c3 = s.getRow(0).createCell((short)2);
|
||||||
|
|
||||||
// As number and string
|
// As number and string
|
||||||
c1.setCellFormula("70164");
|
c1.setCellFormula("70164");
|
||||||
c2.setCellFormula("\"70164\"");
|
c2.setCellFormula("\"70164\"");
|
||||||
|
c3.setCellFormula("\"90210\"");
|
||||||
|
|
||||||
// Check the formulas
|
// Check the formulas
|
||||||
assertEquals("70164.0", c1.getCellFormula());
|
assertEquals("70164.0", c1.getCellFormula());
|
||||||
@ -1165,20 +1165,31 @@ public final class TestBugs extends TestCase {
|
|||||||
assertEquals("", c1.getRichStringCellValue().getString());
|
assertEquals("", c1.getRichStringCellValue().getString());
|
||||||
assertEquals(0.0, c2.getNumericCellValue(), 0.00001);
|
assertEquals(0.0, c2.getNumericCellValue(), 0.00001);
|
||||||
assertEquals("", c2.getRichStringCellValue().getString());
|
assertEquals("", c2.getRichStringCellValue().getString());
|
||||||
|
assertEquals(0.0, c3.getNumericCellValue(), 0.00001);
|
||||||
|
assertEquals("", c3.getRichStringCellValue().getString());
|
||||||
|
|
||||||
// Now evaluate
|
// Try changing the cached value on one of the string
|
||||||
|
// formula cells, so we can see it updates properly
|
||||||
|
c3.setCellValue(new HSSFRichTextString("test"));
|
||||||
|
assertEquals(0.0, c3.getNumericCellValue(), 0.00001);
|
||||||
|
assertEquals("test", c3.getRichStringCellValue().getString());
|
||||||
|
|
||||||
|
|
||||||
|
// Now evaluate, they should all be changed
|
||||||
HSSFFormulaEvaluator eval = new HSSFFormulaEvaluator(s, wb);
|
HSSFFormulaEvaluator eval = new HSSFFormulaEvaluator(s, wb);
|
||||||
eval.setCurrentRow(s.getRow(0));
|
eval.setCurrentRow(s.getRow(0));
|
||||||
eval.evaluateFormulaCell(c1);
|
eval.evaluateFormulaCell(c1);
|
||||||
eval.evaluateFormulaCell(c2);
|
eval.evaluateFormulaCell(c2);
|
||||||
|
eval.evaluateFormulaCell(c3);
|
||||||
|
|
||||||
// Check
|
// Check that the cells now contain
|
||||||
|
// the correct values
|
||||||
assertEquals(70164.0, c1.getNumericCellValue(), 0.00001);
|
assertEquals(70164.0, c1.getNumericCellValue(), 0.00001);
|
||||||
assertEquals("", c1.getRichStringCellValue().getString());
|
assertEquals("", c1.getRichStringCellValue().getString());
|
||||||
assertEquals(0.0, c2.getNumericCellValue(), 0.00001);
|
assertEquals(0.0, c2.getNumericCellValue(), 0.00001);
|
||||||
|
assertEquals("70164", c2.getRichStringCellValue().getString());
|
||||||
// TODO - why isn't this working?
|
assertEquals(0.0, c3.getNumericCellValue(), 0.00001);
|
||||||
// assertEquals("70164", c2.getRichStringCellValue().getString());
|
assertEquals("90210", c3.getRichStringCellValue().getString());
|
||||||
|
|
||||||
|
|
||||||
// Write and read
|
// Write and read
|
||||||
@ -1186,12 +1197,15 @@ public final class TestBugs extends TestCase {
|
|||||||
HSSFSheet ns = nwb.getSheetAt(0);
|
HSSFSheet ns = nwb.getSheetAt(0);
|
||||||
HSSFCell nc1 = ns.getRow(0).getCell((short)0);
|
HSSFCell nc1 = ns.getRow(0).getCell((short)0);
|
||||||
HSSFCell nc2 = ns.getRow(0).getCell((short)1);
|
HSSFCell nc2 = ns.getRow(0).getCell((short)1);
|
||||||
|
HSSFCell nc3 = ns.getRow(0).getCell((short)2);
|
||||||
|
|
||||||
// Re-check
|
// Re-check
|
||||||
assertEquals(70164.0, nc1.getNumericCellValue(), 0.00001);
|
assertEquals(70164.0, nc1.getNumericCellValue(), 0.00001);
|
||||||
assertEquals("", nc1.getRichStringCellValue().getString());
|
assertEquals("", nc1.getRichStringCellValue().getString());
|
||||||
assertEquals(0.0, nc2.getNumericCellValue(), 0.00001);
|
assertEquals(0.0, nc2.getNumericCellValue(), 0.00001);
|
||||||
assertEquals("70164", nc2.getRichStringCellValue().getString());
|
assertEquals("70164", nc2.getRichStringCellValue().getString());
|
||||||
|
assertEquals(0.0, nc3.getNumericCellValue(), 0.00001);
|
||||||
|
assertEquals("90210", nc3.getRichStringCellValue().getString());
|
||||||
|
|
||||||
// Now check record level stuff too
|
// Now check record level stuff too
|
||||||
ns.getSheet().setLoc(0);
|
ns.getSheet().setLoc(0);
|
||||||
@ -1204,15 +1218,27 @@ public final class TestBugs extends TestCase {
|
|||||||
if(fn == 0) {
|
if(fn == 0) {
|
||||||
assertEquals(70164.0, fr.getFormulaRecord().getValue(), 0.0001);
|
assertEquals(70164.0, fr.getFormulaRecord().getValue(), 0.0001);
|
||||||
assertNull(fr.getStringRecord());
|
assertNull(fr.getStringRecord());
|
||||||
} else {
|
} else if (fn == 1) {
|
||||||
assertEquals(0.0, fr.getFormulaRecord().getValue(), 0.0001);
|
assertEquals(0.0, fr.getFormulaRecord().getValue(), 0.0001);
|
||||||
assertNotNull(fr.getStringRecord());
|
assertNotNull(fr.getStringRecord());
|
||||||
assertEquals("70164", fr.getStringRecord().getString());
|
assertEquals("70164", fr.getStringRecord().getString());
|
||||||
|
} else {
|
||||||
|
assertEquals(0.0, fr.getFormulaRecord().getValue(), 0.0001);
|
||||||
|
assertNotNull(fr.getStringRecord());
|
||||||
|
assertEquals("90210", fr.getStringRecord().getString());
|
||||||
}
|
}
|
||||||
|
|
||||||
fn++;
|
fn++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assertEquals(2, fn);
|
assertEquals(3, fn);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Problem with "Vector Rows"
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public void test43623() throws Exception {
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user