EasyExcel快速实现前后端导入导出以及相关注意事项

EasyExcel快速实现前后端导入导出以及相关注意事项

环境:

​ 前端: Ant Design of Vue(UI) + Vue + axios接口调用

​ 后端:EasyExcel实现Excel表格的读写操作。

目录:

导入Excel文件

导出Excel文件

导入Excel文件

流程:

下载模板->编写Excel数据文件->触发导入数据->发送axios请求->后端接收数据->数据持久化(数据处理)

模板下载

在导入文件之前需要用户根据自己设定的Excel模板进行填写数据.(模板字段对应后端实体类字段)

在这里插入图片描述

模板创建可参考上一篇文章EasyExcel简单读写Excel操作 https://blog.csdn.net/whitehats/article/details/111614450

编写导入数据Excel文件

在这里插入图片描述

触发导入数据

上传按钮使用的是AntdVue中的上传按钮,设置beforeUpload函数进行上传文件操作(具体可以根据自己需求更改UI设计)

<a-upload
      :beforeUpload="beforeUpload"
      :showUploadList="false"
      :multiple="true">
    <a-button type="primary"> 导入线索 </a-button>
</a-upload>

在这里插入图片描述

发送axios请求

这里需要注意的是数据是以FormData的形式进行传输的,注意!!!需要设置在请求头中添加"Content-Type":“multipart/form-data”。**

beforeUpload(file){
        let _this = this
        console.log(file)
        let formData = new FormData();
                formData.append("file", file); 
                let config = {
                    headers: {
                      "Content-Type": "multipart/form-data",
                    }
                };
                let url = "/importData" //这里填写调用的后端Excel数据处理接口
                this.$axios.post(url, formData, config).then(response => {
                    let  data = response.status;
                    console.log(data)
                    if (response.status == 200) {
                           alert('导入成功');
                           return;
                    }else{
                           alert("导入失败");
                           return;
                    }
                    
                }).catch(function(error){
                           alert("导入失败");
                });
          },
后端接收前端传过来的Excel文件数据(后端接收数据,数据持久化)

注意:在后端导入方法传入的参数为MultipartFile数据类型,获取到file文件转换为文件流并通过invoke方法按照所对应的实体类(ClueDTO) 逐行的数据进行获取。(EasyExcel进行读操作)

public Results<Object> importData(@RequestParam("file") MultipartFile file) throws IOException {
        if (file == null) new Results<>(404,"导入数据失败",null);
        ArrayList<Object> list = new ArrayList<>();
        AnalysisEventListener listener = new AnalysisEventListener() {
            @Override
            public void invoke(Object data, AnalysisContext context) {
                //获取到每一行数据,逐行进行处理
                list.add(data);
                ClueDTO clueDTO = (ClueDTO)data;
                Clue clue = new Clue();
                BeanUtils.copyProperties(clueDTO,clue);
                //这里将获取到的数据封装回实体类对象中,并在数据库持久化
                clueService.addClue(clue);
                System.out.println(Arrays.toString(new ArrayList[]{list}));
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext context) {
                log.info("导入数据完毕");
            }
        };
        try {
            EasyExcel.read(file.getInputStream(), ClueDTO.class, listener).sheet(0).doRead();
        } catch (IOException e) {
            log.error("导入出错:{}", e.getMessage());
        }
        return new Results<>(200,"导入数据成功",list);
    }

以上导入Excel文件基本完成。

导出Excel文件

流程:

触发导出->前端封装数据->发送axios导出请求->后端进一步封装数据->响应给前端

触发导出
<a-button type="primary" @click="exportData">
      导出线索
</a-button>
前端封装数据,发送axios导出请求

点击按钮触发导出函数。这里需要注意的是在调用axios时,注意!!!需要设置返回类型responseType:“blob” ,以文件的形式返回。在响应方法中,将后端返回的数据封装为blob,同样注意!!!需要设置type: “multipary/form-data”,并通过超链接的形式自动触发下载响应.

//导出数据
      exportData(){
        this.$axios({
        method: "post",
        url: "/exportData",
        data:this.clueList,		//导出的数据
        responseType: "blob"
        })
        .then(res => {
            const link = document.createElement("a");
            let blob = new Blob([res.data], { type: "multipary/form-data" });
            link.style.display = "none";
            link.href = URL.createObjectURL(blob);
            link.setAttribute("download", decodeURI(Date.now()+'导出模板.xlsx'));
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
            console.log(res);
          })
        },
后端进一步封装数据,返回给前端响应

后端设置文件名,字段名等,将数据进一步封装.并以文件流的方法返回到前端

public void exportData(@RequestBody List<ClueDTO> clueDTOlist, HttpServletResponse response) {
        List<ClueDTO> list = new ArrayList<>();
        try {
            response.setContentType("application/vnd.ms-excel; charset=utf-8");
            response.setCharacterEncoding("utf-8");
            String fileName = "模板";
            response.setHeader("Content-Disposition", "attachment;filename=" + "导出记录"+ ".xlsx");
            log.info(URLEncoder.encode(fileName, "utf-8") + ".xlsx");
            EasyExcel.write(response.getOutputStream(), ClueDTO.class).sheet("模板").doWrite(clueDTOlist);
        } catch (Exception e) {
            log.error("下载报表异常:{}", e.getMessage());
            throw new RuntimeException("下载报表异常");
        }
    }

总结

​ 文件导入导出多种多样, 以上仅是针对Excel文件的导入导出的其中一种方法.后续有需要的话,可将具体Demo上传至github,欢迎在评论区讨论.

xushumin:规则是用来打破的,然后重组,再打破

补充

 评论中有人询问到Result<Oject>这个类,这是自己封装的一个接口返回规范类,是自定义的。类信息如下:
@ApiModel("通用接口返回对象")
@Data
public class Results<T> {

    @ApiModelProperty(required = true,notes = "结果码",example = "200")
    private int state;
    @ApiModelProperty(required = true,notes = "时间戳",example = "1567425139000")
    private long time;
    @ApiModelProperty(required = true,notes = "返回信息",example = "SUCCESS")
    private String message;
    @ApiModelProperty(required = true,notes = "返回数据",example = "{\"name\":\"blues\"}")
    private T content;

    public Results(int code, String msg, T obj){
        setState(code);
        setMessage(msg);
        setContent(obj);
        setTime(System.currentTimeMillis());
    }
}

  • 14
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
EasyExcel 是一款针对 Excel 操作的开源 Java 类库,可以方便地实现 Excel 数据导入导出。下面是示例代码: 导出数据: 1. 首先需要定义对应的实体类,对应 Excel 中的每一列,例如: ```java @Data public class User { @ExcelProperty("用户ID") private Long id; @ExcelProperty("用户名") private String username; @ExcelProperty("性别") private String gender; // ... } ``` 2. 在需要导出数据的方法中使用 EasyExcel 的 API 进行导出操作: ```java public void exportUser(HttpServletResponse response) { List<User> userList = userService.listUsers(); try { EasyExcel.write(response.getOutputStream(), User.class).sheet("用户列表").doWrite(userList); } catch (IOException e) { e.printStackTrace(); } } ``` 导入数据: 1. 定义导入时需要的实体类,同样需要用 `@ExcelProperty` 注解来定义每个属性对应的列: ```java @Data public class UserImport { @ExcelProperty("用户ID") private Long id; @ExcelProperty("用户名") private String username; @ExcelProperty("性别") private String gender; // ... } ``` 2. 在需要导入数据的方法中使用 EasyExcel 的 `read()` 方法进行数据读取: ```java public void importUser(MultipartFile file) { try { List<UserImport> userList = EasyExcel.read(file.getInputStream(), UserImport.class, new ReadListener()).sheet().headRowNumber(1).doReadSync(); // 处理导入数据 } catch (IOException e) { e.printStackTrace(); } } ``` 以上就是使用 EasyExcel 进行数据导入导出的基本操作,需要注意的是,如果导出大量数据,建议采用分页导出的方式,避免内存溢出的问题。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值