EasyExcel文件导入与导出

1.文件导入

  • 导入校验
java 复制代码
public class BoyListener extends AnalysisEventListener {

    List<String> names = new ArrayList<>();
    /**
     * 每解析一行,回调该方法
     *
     */
    @Override
    public void invoke(Object data, AnalysisContext analysisContext) {

        //校验名称
        String name = ((Boy) data).getName();
        if (StringUtils.isBlank(name)){
            throw new ServiceException(1,"名称不能为空");
        }
        if (names.contains(name)){
            throw new ServiceException(1,"名称已存在");
        }else {
            names.add(name);
        }
    }

    /**
     * 解析异常回调该方法
     * @param exception
     * @param context
     * @throws Exception
     */
    @Override
    public void onException(Exception exception, AnalysisContext context) throws Exception {
        if (exception instanceof ExcelDataConvertException){
            //从0开始
            ExcelDataConvertException ex= (ExcelDataConvertException) exception;
            //获取行号
            int rowIndex = ex.getRowIndex() + 1;
            //获取列号
            int colIndex = ex.getColumnIndex() + 1;
            throw new ServiceException(1,"第"+rowIndex+"行,第"+colIndex+"列数据格式错误");
        } else if (exception instanceof RuntimeException) {
            throw exception;
        }else {
            super.onException(exception, context);
        }
    }

    /**
     * 解析完回调该方法
     * @param analysisContext
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        names.clear();
    }
}
  • 导入代码
java 复制代码
    @PostMapping("/in")
    public void importIn(MultipartFile file) {
        try {
            InputStream fileInputStream = file.getInputStream();
            List<Boy> sheet1 = EasyExcel.read(fileInputStream)
                    .registerReadListener(new BoyListener())
                    //导入的实体类型
                    .head(Boy.class)
                    .sheet("Sheet1")
                    //跳过第一行,头行
                    .headRowNumber(1)
                    .doReadSync();
            if (!CollectionUtils.isEmpty(sheet1)){
                for (Boy boy : sheet1) {
                    System.out.println(JSON.toJSONString(boy));
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

2.导出

  • 包括导出到本地、响应、文件服务器以及多个sheet导出。
java 复制代码
    @PostMapping("/out")
    public void exportOut(HttpServletResponse response) {

        try {
            ServletOutputStream outputStream = response.getOutputStream();
            this.setExcelResponse(response,"测试导出");
            //创建一个list用于存放30个Boy对象-适用于单个sheet
//            List<Boy> boyList = new java.util.ArrayList<>();
//            for (int i = 0; i < 30; i++) {
//                Boy boy = new Boy();
//                boy.setId(i);
//                boy.setName("张三" + i);
//                boy.setSalary((double) (i + 1));
//                boy.setBirthday(LocalDateTime.now());
//                boyList.add(boy);
//            }


            //写出到服务器
//            HashMap<String, Object> paramMap = new HashMap<>();
            //文件上传只需将参数中的键指定(默认file),值设为文件对象即可,对于使用者来说,文件上传与普通表单提交并无区别
//            paramMap.put("Filedata", FileUtil.file(filePath));
//            String result = HttpUtil.post("http://" + url, paramMap);


            //写出至本地
//            EasyExcel.write("src/main/resources/export.xlsx", Boy.class)
//                            .sheet("Sheet1")
//                                    .doWrite(boyList);

            //写出至浏览器
//            EasyExcel.write(outputStream, Boy.class)
//                    .excelType(ExcelTypeEnum.XLSX)
//                    .sheet("Sheet1")
//                    .doWrite(boyList);

            //多个sheet导出
            ExcelWriter writer = EasyExcel.write(outputStream, Boy.class).excelType(ExcelTypeEnum.XLSX).build();
            try {
                this.setExcelResponse(response, "多个sheet导出");
                //分页查询数据
                for(int j=1;j<=5;j++){
                    List<Boy> boyList = new ArrayList<>();
                    for (int i = 0; i < 30; i++) {
                        Boy boy = new Boy();
                        boy.setId(i);
                        boy.setName("张三" + i);
                        boy.setSalary((double) (i + 1));
                        boy.setBirthday(LocalDateTime.now());
                        boyList.add(boy);
                    }
                    //创建新的sheet页
                    WriteSheet sheet = EasyExcel.writerSheet("Sheet" + j).build();
                    writer.write(boyList,sheet );
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
                //释放资源
            }finally {
                writer.finish();
                outputStream.flush();
                outputStream.close();
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private void setExcelResponse(HttpServletResponse response, String rawFileName) throws UnsupportedEncodingException {

        //设置内容类型
        response.setContentType("application/vnd.ms-excel");
        //设置编码格式
        response.setCharacterEncoding("utf-8");
        //设置导出文件名称
        String fileName = URLEncoder.encode(rawFileName.concat(".xlsx"), "UTF-8");
        //设置响应头
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName);
    }

参考文献:https://blog.csdn.net/m0_51963973/article/details/131054664?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword\~default-0-131054664-blog-142551367.235^v43^pc_blog_bottom_relevance_base2\&spm=1001.2101.3001.4242.1\&utm_relevant_index=3

相关推荐
计算机毕设指导69 分钟前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea
Gu Gu Study11 分钟前
枚举与lambda表达式,枚举实现单例模式为什么是安全的,lambda表达式与函数式接口的小九九~
java·开发语言
Chris _data13 分钟前
二叉树oj题解析
java·数据结构
牙牙70519 分钟前
Centos7安装Jenkins脚本一键部署
java·servlet·jenkins
paopaokaka_luck27 分钟前
[371]基于springboot的高校实习管理系统
java·spring boot·后端
以后不吃煲仔饭39 分钟前
Java基础夯实——2.7 线程上下文切换
java·开发语言
进阶的架构师40 分钟前
2024年Java面试题及答案整理(1000+面试题附答案解析)
java·开发语言
The_Ticker1 小时前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
大数据编程之光1 小时前
Flink Standalone集群模式安装部署全攻略
java·大数据·开发语言·面试·flink
爪哇学长1 小时前
双指针算法详解:原理、应用场景及代码示例
java·数据结构·算法