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

相关推荐
Algorithm15768 分钟前
JVM是什么,与Java的关系是什么,以及JVM怎么实现的跨平台性
java·开发语言·jvm
遇见你真好。1 小时前
SpringBoot整合quartz定时任务
java·springboot·quartz
一颗甜苞谷1 小时前
开源一款基于 JAVA 的仓库管理系统,支持三方物流和厂内物流,包含 PDA 和 WEB 端的源码
java·开发语言·开源
攻心的子乐1 小时前
idea使用svn
java·ide·intellij-idea
程序员大佬超1 小时前
IDEA解决 properties 文件乱码问题
java·ide·intellij-idea
秋恬意1 小时前
LinkedList 源码分析
java·开发语言·面试
隔窗听雨眠1 小时前
深入理解Redis的四种模式
java·redis·mybatis
lexusv8ls600h2 小时前
微服务设计模式 - 重试模式(Retry Pattern)
java·spring boot·微服务
Viktor_Ye2 小时前
高效数据集成:易仓退款订单与金蝶销售退货单的自动化对接
java·运维·自动化
feilieren2 小时前
leetcode - 684. 冗余连接
java·开发语言·算法