EasyExcel复杂表头数据导入

目录

表头示例

导入代码

java 复制代码
    @Override
    public void importExcel(InputStream inputStream) {
        ItemExcelListener itemExcelListener = new ItemExcelListener();
        EasyExcel.read(inputStream, ImportItem.class, itemExcelListener).headRowNumber(2).sheet().doRead();
    }
java 复制代码
@Slf4j
public class ItemExcelListener extends AnalysisEventListener<ImportItem> {
    /**
     * 定义100条数据存储一次,然后清理list,方便内存回收
     */
    private static final int BATCH_COUNT = 300;
    /**
     * 记录导入的总记录数
     */
    private Long listSize = 0L;
    /**
     * 缓存的数据
     */
    private List<ImportItem> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);

    //标记处理第一行表头
    private boolean firstRowProcessed = true;

    private HashMap<Integer, HashMap<String,String>> dynamicInfoList;

    /**
     * 解析每一行表头数据时调用
     */
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        // 读取表头数据并构造HashMap
        if (firstRowProcessed){
            HashMap<Integer, HashMap<String, String>> infoList = new HashMap<>();
            for (Map.Entry<Integer, String> entry : headMap.entrySet()){
                Integer key = entry.getKey();
                String value = entry.getValue();
                if (!Objects.equals(value, "固定数据")){
                    infoList.put(key,null);
                }
            }
            dynamicInfoList = infoList;
            firstRowProcessed = false;
        }else {
            for (Map.Entry<Integer, String> entry : headMap.entrySet()){
                HashMap<String, String> info = new HashMap<>();
                Integer key = entry.getKey();
                String value = entry.getValue();
                if (dynamicInfoList.containsKey(key)){
                    info.put(value,null);
                    dynamicInfoList.replace(key,info);
                }
            }
        }
    }

    /**
     * 每解析一条数据都会调用一次
     */
    @Override
    public void invoke(ImportItem importItem, AnalysisContext analysisContext) {
        // 获取实体类中不匹配的数据
        ReadRowHolder readRowHolder = analysisContext.readRowHolder();
        Map<Integer, Cell> cellMap = readRowHolder.getCellMap();
        JSONObject dynamicInformation = new JSONObject();
        for (Map.Entry<Integer, Cell> entry : cellMap.entrySet()){
            Integer key = entry.getKey();
            Cell entryValue = entry.getValue();
            if (dynamicInfoList.containsKey(key)){
                String string = JSON.toJSONString(entryValue);
                JSONObject jsonObject = JSON.parseObject(string);
                String value = jsonObject.getString("stringValue");
                HashMap<String, String> info = dynamicInfoList.get(key);
                for (String attribute : info.keySet()) {
                    dynamicInformation.put(attribute,value);
                }
            }
        }
        cachedDataList.add(importItem);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (cachedDataList.size() >= BATCH_COUNT) {
            saveData();
            // 存储完成清理 list
            cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
        }
    }

    /**
     * 所有数据解析完成后调用
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        if (!cachedDataList.isEmpty()){
            saveData();
            // 存储完成清理 list
            cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
        }
    }

    public void saveData(){
        //将数据存入数据库
    }


}

数据导出

参考文章:EasyExcel动态复杂表头导出方法

相关推荐
济宁雪人2 分钟前
Java安全基础——JNI安全基础
java·开发语言
q***965814 分钟前
Java进阶-在Ubuntu上部署SpringBoot应用
java·spring boot·ubuntu
h***066524 分钟前
【JSqlParser】Java使用JSqlParser解析SQL语句总结
java·开发语言·sql
代码or搬砖34 分钟前
Java Lambda 表达式全面详解
java·开发语言·python
okseekw36 分钟前
Java初学者的static探险记:原来“静态”是这么个省心玩意儿!
java
这周也會开心43 分钟前
JDK1.8新增语法
java·开发语言
心随雨下1 小时前
TypeScript泛型开发常见错误解析
java·开发语言·typescript
DonaldCen6661 小时前
Java 王者修炼手册【Mysql篇 - SQL执行存储流程】:拆解 InnoDB 存储结构与 SQL 执行流程,吃透 Buffer Pool 和 Change
java
旺仔Sec1 小时前
2025年广东省职业院校技能大赛高职组“区块链技术应用”竞赛试题(二)
java·区块链
Boop_wu1 小时前
[Java EE] 多线程编程进阶
java·数据库·java-ee