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

相关推荐
神仙别闹8 分钟前
基于Java+VUE+MariaDB实现(Web)仿小米商城
java·前端·vue.js
风象南10 分钟前
SpringBoot的4种抽奖活动实现策略
java·spring boot·后端
蓝桉~MLGT18 分钟前
java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java·开发语言·python
甜甜的资料库1 小时前
基于微信小程序的作业管理系统源码数据库文档
java·数据库·微信小程序·小程序
有梦想的骇客6 小时前
书籍“之“字形打印矩阵(8)0609
java·算法·矩阵
yours_Gabriel7 小时前
【java面试】微服务篇
java·微服务·中间件·面试·kafka·rabbitmq
hashiqimiya8 小时前
android studio中修改java逻辑对应配置的xml文件
xml·java·android studio
liuzhenghua669 小时前
Python任务调度模型
java·运维·python
結城9 小时前
mybatisX的使用,简化springboot的开发,不用再写entity、mapper以及service了!
java·spring boot·后端
小前端大牛马9 小时前
java教程笔记(十一)-泛型
java·笔记·python