SpringBoot项目EasyExcel使用

SpringBoot项目EasyExcel使用


前言

EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。
他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。

一、EasyExcel导出数据到磁盘

1.依赖添加

EasyExcel需要依赖

 <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.1.0</version>
</dependency>

2.写文件到本地

将数据写入excel并存入本地

 public void dowloadDataExcel() {
    
    
        try {
    
    
            String fileName = "导出测试";
            //表头
            List<List<String>> heads = Lists.newArrayList();
            heads.add(Lists.newArrayList("姓名"));
            heads.add(Lists.newArrayList("英文名称"));
            heads.add(Lists.newArrayList("密码"));
            heads.add(Lists.newArrayList("角色"));
            heads.add(Lists.newArrayList("手机号"));
			// 数据
            List<List<String>> contents = Lists.newArrayList();
            for (int i = 0; i <= 10; i++) {
    
    
                List<String> content = Lists.newArrayList();
                for (int j = 0; j < 5; j++) {
    
    
                    content.add("第" + i + "行第" + j + "例内容");
                }
                contents.add(content);
            }

            EasyExcel.write("D:\\data\\test.xlsx")
            	.head(heads)
                .registerWriteHandler(new SimpleColumnWidthStyleStrategy(16)) // 列宽
                .sheet("数据").doWrite(contents);
        } catch (Exception e) {
    
    
            log.error("导出数据异常:{}", e.getMessage());
        }
    }

结果输出如下
在这里插入图片描述

二、EasyExcel通过接口导出自定义模板

1.组装模板并通过接口下载

将表头写入excel并通过浏览器下载 (注意:经过nginx代理,文件流可能被篡改,导致文件损坏打不开)

   @GetMapping("/export/excel")
    @Timed
    @ResponseStatus(HttpStatus.OK)
    public void dowloadExcel(HttpServletResponse response) {
    
    
        try {
    
    
            // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            String fileName = URLEncoder.encode("用户模板", "UTF-8").replaceAll("\\+", "%20");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");

            List<List<String>> heads = Lists.newArrayList();
            heads.add(Lists.newArrayList("姓名"));
            heads.add(Lists.newArrayList("英文名称*"));
            heads.add(Lists.newArrayList("密码*"));
            heads.add(Lists.newArrayList("角色"));
            heads.add(Lists.newArrayList("手机号"));

            EasyExcel.write(response.getOutputStream())
                .head(heads)
                .registerWriteHandler(new SimpleColumnWidthStyleStrategy(16))
                .sheet("用户数据")
                .doWrite(null);
        } catch (Exception e) {
    
    
            e.printStackTrace();
            log.error("导出模板异常:{}", e.getMessage());
        }
    }

结果输出如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tfatQEDm-1676599385893)(htps://img-blog.csdnimg.cn/b405186638204d2b962abcb650410b88.png)]

三、EasyExcel添加excel默认下拉数据

1.excel列设置下拉数据

我们将角色一栏设置默认的下拉数据
1、自定义处理类

public class CustomSheetWriteHandler implements SheetWriteHandler {
    
    



    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
    
    

    }

    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
    
    
        //定义一个map key是需要添加下拉框的列的index value是下拉框数据
        Map<Integer, String[]> mapDropDown = new HashMap<>(3);
        //设置单位身份 值写死
        String[] role = {
    
    "系统管理员","平台管理员","数据工程师","配置管理员"};
        //下拉选在Excel中对应的第4列
        mapDropDown.put(3,role);

        //获取工作簿
        Sheet sheet = writeSheetHolder.getSheet();
        ///开始设置下拉框
        DataValidationHelper helper = sheet.getDataValidationHelper();
        //设置下拉框
        for (Map.Entry<Integer, String[]> entry : mapDropDown.entrySet()) {
    
    
            /*起始行、终止行、起始列、终止列  起始行为1即表示表头不设置**/
            CellRangeAddressList addressList = new CellRangeAddressList(1, 65535, entry.getKey(), entry.getKey());
            /*设置下拉框数据**/
            DataValidationConstraint constraint = helper.createExplicitListConstraint(entry.getValue());
            DataValidation dataValidation = helper.createValidation(constraint, addressList);
            sheet.addValidationData(dataValidation);
        }
    }
}

在生成excel的时候使用

   public void dowloadExcel(HttpServletResponse response) {
    
    
        try {
    
    
            // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            String fileName = URLEncoder.encode("用户模板", "UTF-8").replaceAll("\\+", "%20");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");

            List<List<String>> heads = Lists.newArrayList();
            heads.add(Lists.newArrayList("姓名"));
            heads.add(Lists.newArrayList("英文名称*"));
            heads.add(Lists.newArrayList("密码*"));
            heads.add(Lists.newArrayList("角色"));
            heads.add(Lists.newArrayList("手机号"));

            EasyExcel.write(response.getOutputStream())
                .head(heads)
                .sheet("用户数据")
                .registerWriteHandler(new SimpleColumnWidthStyleStrategy(16))
                .registerWriteHandler(new CustomSheetWriteHandler())
                .doWrite(null);

        } catch (Exception e) {
    
    
            e.printStackTrace();
            log.error("导出模板异常:{}", e.getMessage());
        }
    }

结果输出如下
在这里插入图片描述

四、EasyExcel读取excel数据

1.解析excel读取数据

将excel数据读取出来,此处是通过每行每列的读取,然后转化未自己想要处理的对象,EasyExcel也提供了直接将数据映射到实体的方法,大家可以自行学习

  public List<User> excelHandle(MultipartFile multipartFile) {
    
    
        List<User> list = new ArrayList<>();
        byte[] bytes;
        try {
    
    
            bytes = multipartFile.getBytes();
        } catch (IOException e) {
    
    
            log.error("excel解析异常:{}", e.getMessage());
            throw new BadRequestAlertException(ErrorCodes.INNER_ERROR, "excel解析异常");
        }
        try {
    
    
            InputStream inputStream = new ByteArrayInputStream(bytes);
            List<Map<Integer, String>> maps = ExcelUtils.readExcel(inputStream);
            for (int i = 0; i < maps.size(); i++) {
    
    
                Map<Integer, String> bookMaps = maps.get(i);
                User user = pauseUserDto(bookMaps);
                list.add(user);
            }
        } catch (Exception e) {
    
    
            log.error("上传表格数据异常:{}", e.getMessage());
            throw new BadRequestAlertException(ErrorCodes.INNER_ERROR, "上传表格数据异常,检查后重试");
        }
        return list;
    }

总结

以上就是SpringBoot集成EasyExcel,最简单的两个使用方法就是导入导出,excel还可以实现很多其他功能,例如读取excel数据,和Object绑定操作等,后面会依次介绍。

猜你喜欢

转载自blog.csdn.net/Oaklkm/article/details/129078606
今日推荐