You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:24:57