使用EasyExcel做excel文件解析

如题所示

项目中需要做表格导入功能,决定采用EasyExcel来进行操作,文件解析相对简单,不像导出那么复杂
demo使用到的依赖
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.2.10</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <version>RELEASE</version>
    <scope>compile</scope>
</dependency>
具体代码展示如下:
package com.excel.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import com.biz.primus.common.exception.BizSilentException;
import lombok.extern.slf4j.Slf4j;

import java.util.*;

/**
 * @author: 骑猪撞地球QAQ
 * @date: 2022/3/28 15:34
 * @content: 动态表头数据解析监听器
 */
@Slf4j
public class NoModelDataListener extends AnalysisEventListener<Map<Integer, String>> {


    List<Map<String, Object>> addList = new ArrayList<>();

    /**
     * 存储Key
     */
    Map<Integer, String> key = new HashMap<>();
    /**
     * keuList
     */
    List<String> keyList = new ArrayList<>();

    /**
     * 重写invokeHeadMap方法,获去表头,如果有需要获取第一行表头就重写这个方法,不需要则不需要重写
     *
     * @param headMap Excel每行解析的数据为Map<Integer, String>类型,Integer是Excel的列索引,String为Excel的单元格值
     * @param context context能获取一些东西,比如context.readRowHolder().getRowIndex()为Excel的行索引,表头的行索引为0,0之后的都解析成数据
     */
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        log.info("解析到一条头数据:{}, currentRowHolder: {}", headMap.toString(), context.readRowHolder().getRowIndex());
        Set<Integer> integerSet = headMap.keySet();
        for (Integer integer : integerSet) {
            keyList.add(headMap.get(integer));
        }
        key.putAll(headMap);
    }


    /**
     * 读取数据 筛选过滤数据 赛选出那些数据是添加 那些数据是修改
     *
     * @param data    传入数据
     * @param context 读取数据
     */
    @Override
    public void invoke(Map<Integer, String> data, AnalysisContext context) {
        log.info("解析到一条数据:{}", JSON.toJSONString(data));
        HashMap<String, Object> objectObjectHashMap = new HashMap<>();
        Set<Integer> integerSet = data.keySet();
        String name = "";
        for (Integer integer : integerSet) {
            String s = data.get(integer);
            if (integer == 0) {
                name = data.get(integer);
            } else {
                // 第一格为战区、部门名称数据,不做校验
                boolean number = this.isNumber(data.get(integer));
                if (!number) {
                    throw new BizSilentException(name + "数据格式错误,请调整后重试!");
                }
            }
            objectObjectHashMap.put(key.get(integer), s);
        }
        addList.add(objectObjectHashMap);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }

    /**
     * 是否是数字或小数位不超过两位
     *
     * @param str 需要校验字符串
     * @return true:是;false:不是
     */
    private boolean isNumber(String str) {
        String reg = "\\d+(\\.\\d+)?";
        if (str.matches(reg)) {
            String ss[];
            if (str.contains(".")) {
                ss = str.split("\\.");
                String s = ss[1];
                return s.length() <= 2;
            }
        }
        return str.matches(reg);
    }
}
	/**
     * 此处我们是由前端上传到文件服务器,再把url回传后端进行处理,也可直接传文件,后端使用MultipartFile的接收,InputStream inputStream = multipartFile.getInputStream()获取流
     */
    public List<Map<Integer, String>> importData(String url){
        //初始化监听器
        NoModelDataListener noModelDataListener = new NoModelDataListener();
        // InputStream   
        InputStream inputStream;
        try {
            URL url = new URL(url1);
            URLConnection connection = url.openConnection();
            inputStream = connection.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("读取文件失败!");
        }
        //解析数据 前三行为表头,从第四行开始读取 excelType()为指定文件类型,不需要也可以,sheet()为指定sheet,0为第一个sheet,headRowNumber()为开始读取的行数
        return  EasyExcelFactory.read(inputStream, noModelDataListener).excelType(ExcelTypeEnum.XLSX).sheet(0).headRowNumber(3).doReadSync();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑猪撞地球QAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值