<!-- Don't forget to update status.xml too! -->
<release version="3.1-final" date="2008-06-??">
- <action dev="POI-DEVELOPERS" type="add">45025 - improved FormulaParser parse error messages</action>
- <action dev="POI-DEVELOPERS" type="add">45046 - allowed EXTERNALBOOK(0x01AE) to be optional in the LinkTable</action>
- <action dev="POI-DEVELOPERS" type="add">45066 - fixed sheet encoding size mismatch problems</action>
+ <action dev="POI-DEVELOPERS" type="add">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</action>
+ <action dev="POI-DEVELOPERS" type="fix">45025 - improved FormulaParser parse error messages</action>
+ <action dev="POI-DEVELOPERS" type="fix">45046 - allowed EXTERNALBOOK(0x01AE) to be optional in the LinkTable</action>
+ <action dev="POI-DEVELOPERS" type="fix">45066 - fixed sheet encoding size mismatch problems</action>
<action dev="POI-DEVELOPERS" type="add">45003 - Support embeded HDGF visio documents</action>
<action dev="POI-DEVELOPERS" type="fix">45001 - Partial fix for HWPF Range.insertBefore() and Range.delete() with unicode characters</action>
<action dev="POI-DEVELOPERS" type="fix">44977 - Support for AM/PM in excel date formats</action>
<!-- Don't forget to update changes.xml too! -->
<changes>
<release version="3.1-final" date="2008-06-??">
- <action dev="POI-DEVELOPERS" type="add">45025 - improved FormulaParser parse error messages</action>
- <action dev="POI-DEVELOPERS" type="add">45046 - allowed EXTERNALBOOK(0x01AE) to be optional in the LinkTable</action>
- <action dev="POI-DEVELOPERS" type="add">45066 - fixed sheet encoding size mismatch problems</action>
+ <action dev="POI-DEVELOPERS" type="add">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</action>
+ <action dev="POI-DEVELOPERS" type="fix">45025 - improved FormulaParser parse error messages</action>
+ <action dev="POI-DEVELOPERS" type="fix">45046 - allowed EXTERNALBOOK(0x01AE) to be optional in the LinkTable</action>
+ <action dev="POI-DEVELOPERS" type="fix">45066 - fixed sheet encoding size mismatch problems</action>
<action dev="POI-DEVELOPERS" type="add">45003 - Support embeded HDGF visio documents</action>
<action dev="POI-DEVELOPERS" type="fix">45001 - Partial fix for HWPF Range.insertBefore() and Range.delete() with unicode characters</action>
<action dev="POI-DEVELOPERS" type="fix">44977 - Support for AM/PM in excel date formats</action>
/**
* 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.
*
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());
}
/**
* @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;
}
* 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)
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.*;
* 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 */
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
import junit.framework.TestCase;
import org.apache.poi.hssf.HSSFTestDataSamples;
+import org.apache.poi.hssf.usermodel.HSSFRow.MissingCellPolicy;
/**
* Test HSSFRow is okay.
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));
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());
}
}