Fix for #56702 - If a cell is of type numeric but has an empty <v/> tag, return as 0

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1610482 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2014-07-14 18:53:39 +00:00
parent b9ff74b050
commit 696b9d6406
3 changed files with 28 additions and 1 deletions

View File

@ -206,8 +206,10 @@ public final class XSSFCell implements Cell {
case CELL_TYPE_FORMULA: case CELL_TYPE_FORMULA:
case CELL_TYPE_NUMERIC: case CELL_TYPE_NUMERIC:
if(_cell.isSetV()) { if(_cell.isSetV()) {
String v = _cell.getV();
if (v.isEmpty()) return 0.0;
try { try {
return Double.parseDouble(_cell.getV()); return Double.parseDouble(v);
} catch(NumberFormatException e) { } catch(NumberFormatException e) {
throw typeMismatch(CELL_TYPE_NUMERIC, CELL_TYPE_STRING, false); throw typeMismatch(CELL_TYPE_NUMERIC, CELL_TYPE_STRING, false);
} }

View File

@ -1628,6 +1628,31 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
saveAndReloadReport(wb, xlsOutput); saveAndReloadReport(wb, xlsOutput);
} }
/**
* XSSFCell.typeMismatch on certain blank cells when formatting
* with DataFormatter
*/
@Test
public void bug56702() throws Exception {
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("56702.xlsx");
Sheet sheet = wb.getSheetAt(0);
// Get wrong cell by row 8 & column 7
Cell cell = sheet.getRow(8).getCell(7);
assertEquals(Cell.CELL_TYPE_NUMERIC, cell.getCellType());
// Check the value - will be zero as it is <c><v/></c>
assertEquals(0.0, cell.getNumericCellValue(), 0.001);
// Try to format
DataFormatter formatter = new DataFormatter();
formatter.formatCellValue(cell);
// Check the formatting
assertEquals("0", formatter.formatCellValue(cell));
}
private void saveAndReloadReport(Workbook wb, File outFile) throws IOException { private void saveAndReloadReport(Workbook wb, File outFile) throws IOException {
// run some method on the font to verify if it is "disconnected" already // run some method on the font to verify if it is "disconnected" already
//for(short i = 0;i < 256;i++) //for(short i = 0;i < 256;i++)

Binary file not shown.