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

相关推荐
新手小袁_J3 分钟前
JDK11下载安装和配置超详细过程
java·spring cloud·jdk·maven·mybatis·jdk11
呆呆小雅3 分钟前
C#关键字volatile
java·redis·c#
Monly214 分钟前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
Ttang236 分钟前
Tomcat原理(6)——tomcat完整实现
java·tomcat
钱多多_qdd17 分钟前
spring cache源码解析(四)——从@EnableCaching开始来阅读源码
java·spring boot·spring
waicsdn_haha19 分钟前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
Q_192849990629 分钟前
基于Spring Boot的摄影器材租赁回收系统
java·spring boot·后端
Code_流苏32 分钟前
VSCode搭建Java开发环境 2024保姆级安装教程(Java环境搭建+VSCode安装+运行测试+背景图设置)
java·ide·vscode·搭建·java开发环境
禁默1 小时前
深入浅出:AWT的基本组件及其应用
java·开发语言·界面编程
Cachel wood1 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架