java动态解析excel数据(支持多行嵌套表头)

该代码示例展示了如何使用Java处理Excel文件,动态解析具有多行嵌套表头的数据,并根据表头构建entity模板。程序首先读取Excel文件,然后解析表头结构,生成JSON解析模板,并对每一行数据进行处理,将值填充到对应的模板中,最后转换为指定类型的bean列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将excel动态解析成bean,支持多行嵌套式表头,根据表头行数构建entity模板,然后每条数据对模板深拷贝后将参数写入,代码如下:

public static void main(String[] args) {
    File file = new File("xlsxPath");
    List<JSONObject> testEntityList = dr(2, file, new TypeReference<JSONObject>() {});
    System.out.println(JSONObject.toJSONString(testEntityList));
}

public static <T> List<T> dr(int titleRowNum, File excelFile, TypeReference<T> typeReference) {
    ExcelReader excelReader = ExcelUtil.getReader(excelFile);
    int sheetCount = excelReader.getSheetCount();

    List<T> resultList = new ArrayList<>();

    for (int sheetNum = 0; sheetNum < sheetCount; sheetNum++) {
        excelReader.setSheet(sheetNum);
        // 构建表头结构
        List<List<Object>> titleRowsList = excelReader.read(0, titleRowNum - 1);
        List<List<String>> titleColumnList = new ArrayList<>(titleRowsList.get(0).size());
        // 将表头第一行初始化到表头list
        titleRowsList.get(0).forEach(titleRowColumnValue -> {
            List<String> titleColumnValueList = new ArrayList<>();
            titleColumnValueList.add(titleRowColumnValue.toString());
            titleColumnList.add(titleColumnValueList);
        });

        // 拼接表头其他行
        for (int titleRowIndex = 1; titleRowIndex < titleRowsList.size(); titleRowIndex++) {
            List<Object> titleRowList = titleRowsList.get(titleRowIndex);
            for (int rowIndex = 0; rowIndex < titleRowList.size(); rowIndex++) {
                if (!titleRowList.get(rowIndex).toString()
                        .equals(titleColumnList.get(rowIndex).get(titleColumnList.get(rowIndex).size() - 1))) {
                    titleColumnList.get(rowIndex).add(titleRowList.get(rowIndex).toString());
                }
            }
        }

        // 初始化json解析模板
        JSONObject jsonDataTemplate = new JSONObject();
        titleColumnList.forEach(columnList -> {
            if (columnList.size() > 1) {
                for (int columnIndex = 0; columnIndex < columnList.size() - 1; columnIndex++) {
                    jsonDataTemplate.put(columnList.get(columnIndex), new JSONObject());
                }
            }
        });

        // 读取数据
        List<List<Object>> valueRowsList = excelReader.read(titleRowNum);
        valueRowsList.forEach(valueRowList -> {
            JSONObject rowValueJson = JSONObject.parseObject(jsonDataTemplate.toJSONString());
            for (int valueRowIndex = 0; valueRowIndex < valueRowList.size(); valueRowIndex++) {
                List<String> columnTitleList = titleColumnList.get(valueRowIndex);
                if (columnTitleList.size() > 1) {
                    JSONObject tmeJson = rowValueJson;
                    for (int columnTitleIndex = 0; columnTitleIndex < columnTitleList.size(); columnTitleIndex++) {
                        if (columnTitleIndex != columnTitleList.size() - 1) {
                            tmeJson = rowValueJson.getJSONObject(columnTitleList.get(columnTitleIndex));
                        } else {
                            tmeJson.put(columnTitleList.get(columnTitleIndex), valueRowList.get(valueRowIndex));
                        }
                    }
                } else {
                    rowValueJson.put(columnTitleList.get(0), valueRowList.get(valueRowIndex));
                }
            }
            resultList.add(JSON.parseObject(rowValueJson.toJSONString(), typeReference));
        });

    }

    return resultList;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值