使用Workbook读取XLS文件时,CellIterator跳过空白单元格致值错位求助
解决POI读取XLS时CellIterator跳过空白单元格导致错位的问题
嗨,这个问题我太熟了!你遇到的情况是因为POI的CellIterator默认只会遍历有内容的单元格,空白单元格会被直接跳过,这就导致当某行中间存在空白单元格时,后续的单元格会“错位”对应到前面的表头,完全乱套。
解决思路
不要用CellIterator,而是按列索引遍历每一行的所有列,同时使用POI的MissingCellPolicy策略来强制获取空白单元格,确保每一列的位置都有对应的Cell对象,这样就能和表头一一对应了。
修改后的代码示例
public Vector<Vector<Cell>> ReadCSV(String filename) { Vector<Vector<Cell>> cellVectorHolder = new Vector<>(); try { FileInputStream myInput = new FileInputStream(filename); LoginServlet.logger.info("Input:" + myInput); Workbook wb = WorkbookFactory.create(myInput); // 获取第一个工作表(根据你的需求调整索引) Sheet sheet = wb.getSheetAt(0); Iterator<Row> rowIterator = sheet.iterator(); while (rowIterator.hasNext()) { Row row = rowIterator.next(); Vector<Cell> cellVector = new Vector<>(); // 获取当前行的最大列数(包含空白列) int totalColumns = row.getLastCellNum(); // 遍历每一列的索引,从0到总列数-1 for (int colIndex = 0; colIndex < totalColumns; colIndex++) { // 关键:用CREATE_NULL_AS_BLANK策略,空白/不存在的单元格会被转为空白Cell Cell cell = row.getCell(colIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK); cellVector.add(cell); } cellVectorHolder.add(cellVector); } myInput.close(); } catch (Exception e) { LoginServlet.logger.error("读取Excel文件出错", e); e.printStackTrace(); } return cellVectorHolder; }
关键细节解释
row.getLastCellNum():获取当前行的最大列索引+1,也就是该行的总列数,包含那些空白的列。Row.MissingCellPolicy.CREATE_NULL_AS_BLANK:如果指定索引的单元格不存在(空白),就创建一个类型为BLANK的Cell对象,这样每一列位置都有对应的Cell,不会出现跳过的情况。- 后续你可以通过
cell.getCellType()来判断单元格是否为空白,比如:if (cell.getCellType() == CellType.BLANK) { // 处理空白单元格逻辑 }
这样修改后,每一行的Cell数量都会和表头的列数完全对应,再也不会出现值错位的问题啦!
内容的提问来源于stack exchange,提问作者Sundaram
相关产品推荐
相关产品推荐

