我的excel文件有4行2列 连续值具有3row 1st column作为空白值,如下所示
phone plan
------------------
85366667777 PLATINUM
85367890000 GOLD
85362524232 SILVER
null SILVER
85362522436 DIAMOND
public List<List<String>> readExcelFile(String fileName) {
try {
FileInputStream fileInputStream = new FileInputStream(fileName);
POIFSFileSystem fsFileSystem = new POIFSFileSystem(fileInputStream);
HSSFWorkbook workBook = new HSSFWorkbook(fsFileSystem);
HSSFSheet hssfSheet = workBook.getSheetAt(0);
Iterator<Row> rowIterator = hssfSheet.rowIterator();
boolean headerRow = true;
while (rowIterator.hasNext()) {
if (headerRow == false) {
String Rows = util.loadfile("config/ConfigValue.properties","NoOfRowsToSkip");
int i = Integer.parseInt(Rows);
HSSFRow hssfRow = (HSSFRow) rowIterator.next();
if(hssfRow.getRowNum()==0||hssfRow.getRowNum()<=i){
continue; //just skip the rows if row number is 0 TO i
}
Iterator<Cell> iterator = hssfRow.cellIterator();
List cellTempList = new ArrayList();
while (iterator.hasNext()) {
HSSFCell hssfCell = (HSSFCell) iterator.next();
if(hssfCell.getCellType() == hssfCell.CELL_TYPE_NUMERIC)
{DecimalFormat df = new DecimalFormat("#");
String cellValue=df.format(hssfCell.getNumericCellValue());
cellTempList.add(cellValue.toString());
}
else if(hssfCell.getCellType() == hssfCell.CELL_TYPE_STRING)
{
cellTempList.add(hssfCell.toString());
}
}
cellDataList.add(cellTempList);
} else {
headerRow = false;
}
}
} catch (Exception e) {
e.printStackTrace();
logger.error("Other Exception : " + e.getStackTrace());
}
System.out.println(cellDataList);
return cellDataList;
}
}
输出:[[85366667777, PLATINUM], [85367890000, GOLD], [85362524232, SILVER], [SILVER], [85362522436, DIAMOND]]
为什么当相应的单元格中没有值时,它不会打印[null,Silver]
或[0,SILVER]
?
答案 0 :(得分:1)
if(hssfCell.getCellType() == hssfCell.CELL_TYPE_NUMERIC){
DecimalFormat df = new DecimalFormat("#");
String cellValue=df.format(hssfCell.getNumericCellValue());
cellTempList.add(cellValue.toString());
} else if(hssfCell.getCellType() == hssfCell.CELL_TYPE_STRING){
cellTempList.add(hssfCell.toString());
} else {
cellTempList.add(null); // or cellTempList.add("0");
}
您的空单元格既不是字符串也不是数字,因此不会向您的数组添加任何内容。尝试检查CELL_TYPE_BLANK。
答案 1 :(得分:1)
您正在使用Iterator
来迭代单元格。但如果一个单元格从未有过值,则可能不存在。在这种情况下,只有一个单元可以迭代。
如果要维护迭代器,则需要测试要迭代的单元格的列索引。如果没有0列单元格,那么您可以先处理自己的null
或0
来处理这种情况。
但是删除迭代器并使用getCell
method that takes a MissingCellPolicy
直接访问列0和1的单元格听起来更容易。
Cell zero = hssfRow.getCell(0, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
Cell one = hssfRow.getCell(1, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
如果不存在,则会创建一个空白Cell
。然后,您可以测试单元格是否具有CELL_TYPE_BLANK
单元格类型并相应地执行操作。
答案 2 :(得分:1)
您应该使用缺少单元格策略。在某些情况下,在迭代时,您需要完全控制缺失或空白单元格的处理方式,并且您需要确保访问每个单元格而不仅仅是文件中定义的单元格。在你提到的情况下,你应该获取一行的第一个和最后一个列信息,然后调用getCell(int,MissingCellPolicy)来获取单元格。使用MissingCellPolicy来控制处理空白或空单元格的方式。
举例说明行
这里的A2是空的,在你的情况下是空白的。在这里,您需要将单元格值指定为Cell cell = row.getCell(int arg0, MissingCellPolicy arg1): Cell-Row
有三种类型的MissingCellPolicy为
CREATE_NULL_AS_BLANK
,CREATE_BLANK_AS_NULL
和RETURN_NULL_AND_BLANK
按以下方式使用
for (int i = 0; i<3 ;i++){
for(int j=0 ; j<2; j++){
Row row = sheet1.getRow(i);
Cell cell = row.getCell(j, Row.CREATE_NULL_AS_BLANK);
// Cell cell = row.getCell(j, Row.RETURN_NULL_AND_BLANK);
// if(row.getCell(j)==null){
// System.out.print("Null ");
// }else
System.out.print(cell.toString()+" - ");
}
System.out.println();
}
此处每当遇到任何具有空值的单元格时,Row.CREATE_NULL_AS_BLANK
都会返回带有BLANK的单元格值。而不是抛出NullPointerException
。在这种情况下,输出将是
A1 - B1 -
- B2 -
A3 - B3 -
如果使用Row.RETURN_NULL_AND_BLANK
,则在未定义任何单元格的情况下,它将返回Null。所以你需要创建一个空检查(如代码中所述)。在这种情况下,输出将是
A1 - B1 -
Null B2 -
A3 - B3 -