From: Nick Burch Date: Fri, 23 May 2008 12:58:56 +0000 (+0000) Subject: Extend the support for specifying a policy to HSSF on missing / blank cells when... X-Git-Tag: REL_3_2_FINAL~311 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=a97602aa11fa5669ef98ee34f92b23f4f1ffe4fd;p=poi.git Extend the support for specifying a policy to HSSF on missing / blank cells when fetching, to be able to specify the policy at the HSSFWorkbook level git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@659525 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/documentation/content/xdocs/changes.xml b/src/documentation/content/xdocs/changes.xml index b36ccbffa9..320be03d33 100644 --- a/src/documentation/content/xdocs/changes.xml +++ b/src/documentation/content/xdocs/changes.xml @@ -37,9 +37,10 @@ - 45025 - improved FormulaParser parse error messages - 45046 - allowed EXTERNALBOOK(0x01AE) to be optional in the LinkTable - 45066 - fixed sheet encoding size mismatch problems + Extend the support for specifying a policy to HSSF on missing / blank cells when fetching, to be able to specify the policy at the HSSFWorkbook level + 45025 - improved FormulaParser parse error messages + 45046 - allowed EXTERNALBOOK(0x01AE) to be optional in the LinkTable + 45066 - fixed sheet encoding size mismatch problems 45003 - Support embeded HDGF visio documents 45001 - Partial fix for HWPF Range.insertBefore() and Range.delete() with unicode characters 44977 - Support for AM/PM in excel date formats diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 1b37e157cd..5bd48a94a4 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,9 +34,10 @@ - 45025 - improved FormulaParser parse error messages - 45046 - allowed EXTERNALBOOK(0x01AE) to be optional in the LinkTable - 45066 - fixed sheet encoding size mismatch problems + Extend the support for specifying a policy to HSSF on missing / blank cells when fetching, to be able to specify the policy at the HSSFWorkbook level + 45025 - improved FormulaParser parse error messages + 45046 - allowed EXTERNALBOOK(0x01AE) to be optional in the LinkTable + 45066 - fixed sheet encoding size mismatch problems 45003 - Support embeded HDGF visio documents 45001 - Partial fix for HWPF Range.insertBefore() and Range.delete() with unicode characters 44977 - Support for AM/PM in excel date formats diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java b/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java index f833b7f447..0a2d6ecbbe 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java @@ -276,8 +276,23 @@ public final class HSSFRow implements Comparable { /** * Get the hssfcell representing a given column (logical cell) - * 0-based. If you ask for a cell that is not defined.... + * 0-based. If you ask for a cell that is not defined, then * you get a null. + * This is the basic call, with no policies applied + * + * @param cellnum 0 based column number + * @return HSSFCell representing that column or null if undefined. + */ + private HSSFCell retrieveCell(int cellnum) { + if(cellnum<0||cellnum>=cells.length) return null; + return cells[cellnum]; + } + + /** + * Get the hssfcell representing a given column (logical cell) + * 0-based. If you ask for a cell that is not defined then + * you get a null, unless you have set a different + * {@link MissingCellPolicy} on the base workbook. * Short method signature provided to retain binary * compatibility. * @@ -288,17 +303,18 @@ public final class HSSFRow implements Comparable { int ushortCellNum = cellnum & 0x0000FFFF; // avoid sign extension return getCell(ushortCellNum); } + /** * Get the hssfcell representing a given column (logical cell) - * 0-based. If you ask for a cell that is not defined.... - * you get a null. + * 0-based. If you ask for a cell that is not defined then + * you get a null, unless you have set a different + * {@link MissingCellPolicy} on the base workbook. * * @param cellnum 0 based column number * @return HSSFCell representing that column or null if undefined. */ public HSSFCell getCell(int cellnum) { - if(cellnum<0||cellnum>=cells.length) return null; - return cells[cellnum]; + return getCell(cellnum, book.getMissingCellPolicy()); } /** @@ -311,7 +327,7 @@ public final class HSSFRow implements Comparable { * @return representing that column or null if undefined + policy allows. */ public HSSFCell getCell(int cellnum, MissingCellPolicy policy) { - HSSFCell cell = getCell(cellnum); + HSSFCell cell = retrieveCell(cellnum); if(policy == RETURN_NULL_AND_BLANK) { return cell; } @@ -335,7 +351,6 @@ public final class HSSFRow implements Comparable { * get the number of the first cell contained in this row. * @return short representing the first logical cell in the row, or -1 if the row does not contain any cells. */ - public short getFirstCellNum() { if (getPhysicalNumberOfCells() == 0) diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java index 98db9e037b..129212c0d5 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java @@ -29,6 +29,7 @@ import org.apache.poi.hssf.record.*; import org.apache.poi.hssf.record.formula.Area3DPtg; import org.apache.poi.hssf.record.formula.MemFuncPtg; import org.apache.poi.hssf.record.formula.UnionPtg; +import org.apache.poi.hssf.usermodel.HSSFRow.MissingCellPolicy; import org.apache.poi.hssf.util.CellReference; import org.apache.poi.hssf.util.SheetReferences; import org.apache.poi.poifs.filesystem.*; @@ -102,6 +103,13 @@ public class HSSFWorkbook extends POIDocument * someplace else. */ private HSSFDataFormat formatter; + + /** + * The policy to apply in the event of missing or + * blank cells when fetching from a row. + * See {@link MissingCellPolicy} + */ + private MissingCellPolicy missingCellPolicy = HSSFRow.RETURN_NULL_AND_BLANK; /** Extended windows meta file */ @@ -345,8 +353,28 @@ public class HSSFWorkbook extends POIDocument log.log(POILogger.DEBUG, "convertLabelRecords exit"); } - - /** + /** + * Retrieves the current policy on what to do when + * getting missing or blank cells from a row. + * The default is to return blank and null cells. + * {@link MissingCellPolicy} + */ + public MissingCellPolicy getMissingCellPolicy() { + return missingCellPolicy; + } + + /** + * Sets the policy on what to do when + * getting missing or blank cells from a row. + * This will then apply to all calls to + * {@link HSSFRow.getCell()}. See + * {@link MissingCellPolicy} + */ + public void setMissingCellPolicy(MissingCellPolicy missingCellPolicy) { + this.missingCellPolicy = missingCellPolicy; + } + + /** * sets the order of appearance for a given sheet. * * @param sheetname the name of the sheet to reorder diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFRow.java b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFRow.java index d307a0e251..7d3088d568 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFRow.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFRow.java @@ -20,6 +20,7 @@ package org.apache.poi.hssf.usermodel; import junit.framework.TestCase; import org.apache.poi.hssf.HSSFTestDataSamples; +import org.apache.poi.hssf.usermodel.HSSFRow.MissingCellPolicy; /** * Test HSSFRow is okay. @@ -224,7 +225,7 @@ public final class TestHSSFRow extends TestCase { row.createCell((short)4, HSSFCell.CELL_TYPE_BLANK); row.createCell((short)5).setCellValue(4); - // First up, no policy + // First up, no policy given, uses default assertEquals(HSSFCell.CELL_TYPE_STRING, row.getCell(0).getCellType()); assertEquals(HSSFCell.CELL_TYPE_NUMERIC, row.getCell(1).getCellType()); assertEquals(null, row.getCell(2)); @@ -263,5 +264,17 @@ public final class TestHSSFRow extends TestCase { assertEquals((short)3, row.getCell(3, HSSFRow.CREATE_NULL_AS_BLANK).getCellNum()); assertEquals((short)4, row.getCell(4, HSSFRow.CREATE_NULL_AS_BLANK).getCellNum()); assertEquals((short)5, row.getCell(5, HSSFRow.CREATE_NULL_AS_BLANK).getCellNum()); + + + // Now change the cell policy on the workbook, check + // that that is now used if no policy given + book.setMissingCellPolicy(HSSFRow.RETURN_BLANK_AS_NULL); + + assertEquals(HSSFCell.CELL_TYPE_STRING, row.getCell(0).getCellType()); + assertEquals(HSSFCell.CELL_TYPE_NUMERIC, row.getCell(1).getCellType()); + assertEquals(null, row.getCell(2)); + assertEquals(null, row.getCell(3)); + assertEquals(null, row.getCell(4)); + assertEquals(HSSFCell.CELL_TYPE_NUMERIC, row.getCell(5).getCellType()); } }