Excel文件Java使用Poi怎么读取复杂格式

请问:一下这种格式的Excel文件Java使用Poi怎么读取。好难呀!
图一:

img

读取的时候可以忽略第三行/第八行一次论推,也忽略掉小计那一行。吧班级号列合并的单元格以及分组合并的单元格可以每行都显示如下。
这是从图一excel中读取数据然后输出结果为一下格式,不用固定对象接收。
图二:

img

推荐使用JXLS技术 轻轻松松处理这种表格

创建复杂的Excel报表,并提供许多灵活性和可扩展性选项。你直接操作Excel表格 随意改动改变布局 都可以通过JXLS技术实现 导入 导出。

可以用Spire.XLS for Java类库来实现你这个需求。库下载地址:Spire.XLS for Java | 下载
先说下思路,我观察你要获取的这些行里面,有一个统一的值,就是单位那一列的值-,所以要做的就是把套字所在的这些行的数据给它提取出来,但是由于这些行有合并单元格,所以要先取消单元格合并,然后再提取套字所在行的数据。
实现步骤:
首先,新建一个包含这个表头的模板文档:

img

然后调用Spire.XLS for Java从源文档提取数据并插入到模板文档。我写了个例子供你参考:

import com.spire.xls.*;

import java.util.EnumSet;

public class Main {
    public static void main(String[] args) {
        //加载Excel文档
        Workbook workbook = new Workbook();
        workbook.loadFromFile( "test.xlsx");
        //获取第一张工作表
        Worksheet sheet = workbook.getWorksheets().get(0);

        //获取文档中已使用的单元格区域
        CellRange usedRange = sheet.getAllocatedRange();

        //遍历使用区域内的所有单元格
        for(int i = 0; i < usedRange.getCellsCount(); i++)
        {
            CellRange cell = usedRange.getCellList().get(i);
            //查找合并单元格
            if(cell.hasMerged())
            {
                //获取单元格的值
                String value = cell.getValue();
                //获取单元格所在的合并区域
                CellRange mergeArea = cell.getMergeArea();
                //取消单元格合并
                cell.unMerge();
                //将单元格的值填充到合并区域内的所有单元格
                mergeArea.setValue(value);
            }
        }

        //加载含有表头的模板Excel文档
        Workbook newBook = new Workbook();
        newBook.loadFromFile("template.xlsx");
        //获取模板文档的第一个工作表
        Worksheet newSheet = newBook.getWorksheets().get(0);

        //查找源文档中特定文本“套”所在的单元格
        CellRange[] range = sheet.findAllString("套", true, true);

        int columnCount =  sheet.getColumns().length;
        //遍历所有找到的单元格,将其所在的整行数据和格式复制到模板文档的第一个工作表
        for(CellRange cell : range){
            CellRange sourceRange = sheet.getRange().get(cell.getRow(), 1, cell.getRow(), columnCount);
            CellRange destRange = newSheet.getRange().get(newSheet.getLastRow() + 1, 1, newSheet.getLastRow() + 1, columnCount);
            sheet.copy(sourceRange, destRange, EnumSet.of(CopyRangeOptions.All));
        }

        //将模板文档保存到另一个文件
        newBook.saveToFile("result.xlsx", ExcelVersion.Version2013);
        workbook.dispose();
        newBook.dispose();
    }
}

这个是我获取的结果:

img

花了我不少时间,如果对你有帮助,望采纳!