问题描述: 在使用Poi导入Excel文件时,比如第一行 在读取完行数据之后去遍历列数据时遇到挂车的车牌号为空时,没有读取到这个单元格的数据,因为这个单元格时空的,所以给跳过了直接将后一列的数据的下标往前移了一个,导致字段名和内容对不上,在业务中有些字段有正则判断,所以空白单元格必须也要读出来并且赋空值,这样字段和内容才能一一匹配,正则也可以顺利通过。
这里就放主要代码了
先看修改之前的代码,
Workbook workbook = null;
List<List<Object>> lists = new ArrayList<>();
workbook = new HSSFWorkbook(inputStream);
//获取第一张Sheet页
Sheet sheet = workbook.getSheetAt(0);
//获取行的一个迭代器方法
Iterator<Row> rowIterator = sheet.rowIterator();
while (rowIterator.hasNext()) {
ArrayList<Object> rowData = new ArrayList<>();
Row row = rowIterator.next();
//获取每行中的每一列
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext()) {
Cell cell = cellIterator.next();
if (cell == null || cell.getCellType().equals(CellType.BLANK)) {
cell.setCellValue("");
}
Object user = getCellData(cell, workbook);
rowData.add(user);
}
lists.add(rowData);
}
workbook.close();
return lists;
}
private static Object getCellData(Cell cell, Workbook workbook) {
Object result = null;
CellType cellType = cell.getCellType();
switch (cellType) {
case STRING:
result = cell.getStringCellValue();
break;
case BOOLEAN:
result = cell.getBooleanCellValue();
break;
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
result = cell.getDateCellValue();
} else {
result = cell.getNumericCellValue();
}
break;
case FORMULA:
FormulaEvaluator formulaEvaluator = null;
if (workbook instanceof HSSFWorkbook) {
formulaEvaluator = new HSSFFormulaEvaluator((HSSFWorkbook) workbook);
}
if (formulaEvaluator != null) {
CellValue evaluate = formulaEvaluator.evaluate(cell);
result = getCellData(evaluate, workbook);
}
break;
default:
break;
}
return result;
}
private static Object getCellData(CellValue cellValue, Workbook workbook) {
Object result = null;
CellType cellType = cellValue.getCellType();
switch (cellType) {
case STRING:
result = cellValue.getStringValue();
break;
case BOOLEAN:
result = cellValue.getBooleanValue();
break;
case NUMERIC:
result = cellValue.getNumberValue();
break;
default:
break;
}
return result;
}
修改之后的代码,
Workbook workbook = null;
List<List<Object>> lists = new ArrayList<>();
workbook = new HSSFWorkbook(inputStream);
//获取第一张Sheet页
Sheet sheet = workbook.getSheetAt(0);
// //获取行的一个迭代器方法
Iterator<Row> rowIterator = sheet.rowIterator();
while (rowIterator.hasNext()) {
ArrayList<Object> rowData = new ArrayList<>();
Row row = rowIterator.next();
//获取每行中的每一列
Iterator<Cell> cellIterator = row.cellIterator();
//计数.控制跳出循环.循环读取列
int i = -1;
//获取每行的列数
short lastCellNum = row.getLastCellNum();
while (cellIterator.hasNext()) {
i++;
//能正常读取空单元格
Cell cell = row.getCell(i, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
if (i == lastCellNum) {
break;
}
if (cell == null || cell.getCellType().equals(CellType.BLANK)) {
cell.setCellValue("");
}
Object user = getCellData(cell, workbook);
rowData.add(user);
}
lists.add(rowData);
}
workbook.close();
return lists;
}
以上就是解决代码。
在解决这个问题的时候,想着在POI官网上找找 后面就看到这样的一个解决办法
// Decide which rows to process
int rowStart = Math.min(15, sheet.getFirstRowNum());
int rowEnd = Math.max(1400, sheet.getLastRowNum());
for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
Row r = sheet.getRow(rowNum);
if (r == null) {
// This whole row is empty
// Handle it as needed
continue;
}
int lastColumn = Math.max(r.getLastCellNum(), MY_MINIMUM_COLUMN_COUNT);
for (int cn = 0; cn < lastColumn; cn++) {
Cell c = r.getCell(cn, Row.RETURN_BLANK_AS_NULL);
if (c == null) {
// The spreadsheet is empty in this cell
} else {
// Do something useful with the cell's contents
}
}
}
之所以不用是因为不想改动之前写的代码,所以就没照写,但是看到这段代码:
Cell c = r.getCell(cn, Row.RETURN_BLANK_AS_NULL);
突然就有了灵感,可以把这段代码移植到我的代码里面,奈何RETURN_BLANK_AS_NULL一直报红,有大佬知道吗?
所以就有了我这个代码
Cell cell = row.getCell(i, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
很好的解决了这个问题。
到这里问题基本已经解决!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/105106.html