Springboot项目整合EasyExcel实现Excel导入与导出功能

文章目录

  • *Springboot项目整合EasyExcel实现Excel导入与导出功能*
  • 一、EasyExcel实现Excel导出功能
    • 1.引入依赖
    • 2.映射实体类(EasyExcelEntity.java)
    • 3.EasyExcel工具类(EasyExcelUtil.java)
    • 4.控制器(EasyExcelController.java)
    • 5.开始测试
  • 二、EasyExcel实现Excel导入功能
    • 1.新增监听器(EasyExcelListener.java)
    • 2.控制器(EasyExcelController.java)
    • 3.前端Vue相关代码(测试2需要)
    • 4.开始测试
  • 总结

Springboot项目整合EasyExcel实现Excel导入与导出功能

推荐配合官网API使用!!!

https://alibaba-easyexcel.github.io/index.html

Springboot项目整合EasyExcel实现Excel导入与导出功能_第1张图片

一、EasyExcel实现Excel导出功能

1.引入依赖

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

2.映射实体类(EasyExcelEntity.java)

package com.kd.opt.entity;

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.*;

import java.io.Serializable;
import java.util.Date;

/**
 * Xxx实体类(代码规范),EasyExcel实现Excel导入导出功能
 *
 * @author 小辰哥哥
 */

// 会为类的所有属性自动生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法
@Data

// 如果觉得@Data太过残暴(因为@Data集合了@ToString、@EqualsAndHashCode、@Getter/@Setter、@RequiredArgsConstructor的所有特性)不够精细,
// 可以使用@Getter/@Setter注解,此注解在属性上,可以为相应的属性自动生成Getter/Setter方法
@Setter
@Getter

// 类使用@ToString注解,Lombok会生成一个toString()方法,默认情况下,会输出类名、所有属性(会按照属性定义顺序),用逗号来分割
@ToString

// 自动生成全参构造器
@AllArgsConstructor

// 自动生成无参构造器
@NoArgsConstructor

// 设置表头行高
@HeadRowHeight(30)

// 设置普通行行高
@ContentRowHeight(50)
public class EasyExcelEntity implements Serializable {

    // 定义表头名称和位置,0代表第一列(标准编号);设置列宽
    @ExcelProperty(value = {"一级标题", "标准编号"}, index = 0)
    @ColumnWidth(30)
    private Integer standardId;

    // 定义表头名称和位置,1代表第二列(标准名称);设置列宽
    @ExcelProperty(value = {"一级标题", "标准名称"}, index = 1)
    @ColumnWidth(30)
    private String standardName;

    // 定义表头名称和位置,2代表第三列(标准类型);设置列宽
    @ExcelProperty(value = {"一级标题", "标准类型"}, index = 2)
    @ColumnWidth(30)
    private String standardType;

    // 定义表头名称和位置,3代表第四列(标准时间);设置列宽;设置日期时间格式
    @ExcelProperty(value = {"一级标题", "标准时间"}, index = 3)
    @ColumnWidth(50)
    @DateTimeFormat(value = "yyyy-MM-dd HH:mm:ss")
    private Date standardDate;

    // 生成Excel时忽略该字段,不生成该列(标准描述)
    @ExcelIgnore
    private String standardDesc;
}

3.EasyExcel工具类(EasyExcelUtil.java)

package com.kd.opt.util;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;

/**
 * EasyExcel实现Excel导出功能(工具类)
 *
 * @author 小辰哥哥
 */
@Component
public class EasyExcelUtil {

    /**
     * 导出Excel文件到指定路径下
     *
     * @param targetPath 目标路径
     * @param excelName  Excel文件名称
     * @param sheetName  Sheet页名称
     * @param type       Excel需要转换的类型(对应实体类.class)
     * @param data       Excel需要导出的数据
     * @author 小辰哥哥
     */
    public static void exportExcelPath(String targetPath, String excelName, String sheetName, Class type, List<Object> data) {

        // 将指定的字符串连接到该字符串的末尾(设置文件的绝对路径)
        String fileName = targetPath.concat(excelName).concat(ExcelTypeEnum.XLSX.getValue());

        // 开始导出
        EasyExcel.write(fileName, type).sheet(sheetName).doWrite(data);
    }

    /**
     * 导出Excel文件到Web服务器下
     *
     * @param response  响应消息
     * @param excelName Excel文件名称
     * @param sheetName Sheet页名称
     * @param type      Excel需要转换的类型(对应实体类.class)
     * @param data      Excel需要导出的数据
     * @author 小辰哥哥
     */
    public static void exportExcelWeb(HttpServletResponse response, String excelName, String sheetName, Class type, List<Object> data) {

        // 设置contentType类型
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("UTF-8");

        try {
            // 这里URLEncoder.encode可以防止中文乱码
            excelName = URLEncoder.encode(excelName, "UTF-8");

            // 设置请求头
            response.setHeader("Content-disposition", "attachment;filename=" + excelName + ExcelTypeEnum.XLSX.getValue());

            // 开始导出
            EasyExcel.write(response.getOutputStream(), type).sheet(sheetName).doWrite(data);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4.控制器(EasyExcelController.java)

package com.kd.opt.controller;

import com.kd.opt.entity.EasyExcelEntity;
import com.kd.opt.util.EasyExcelUtil;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * EasyExcel实现Excel导入与导出功能
 *
 * @author 小辰哥哥
 */
@RestController
@CrossOrigin
@RequestMapping("/EasyExcelController")
public class EasyExcelController {

    /**
     * 导出Excel文件到指定路径下
     *
     * @author 小辰哥哥
     */
    @GetMapping(value = "/exportExcelPath")
    public void exportExcelPath() {

        // 目标路径
        String targetPath = "D:\\Java\\Opticket\\EasyExcel\\";

        // Excel文件名称
        String excelName = "Excel文件" + System.currentTimeMillis();

        // Sheet页名称
        String sheetName = "Excel文件Sheet页";

        // 导入数据
        List<Object> list = new ArrayList<>();
        list.add(new EasyExcelEntity(1, "标准数据1", "完美", new Date(), "标准描述1"));
        list.add(new EasyExcelEntity(2, "标准数据2", "糟糕", new Date(), "标准描述2"));
        list.add(new EasyExcelEntity(3, "标准数据3", "凑合", new Date(), "标准描述3"));
        list.add(new EasyExcelEntity(4, "标准数据4", "一般", new Date(), "标准描述4"));
        list.add(new EasyExcelEntity(5, "标准数据5", "超帅", new Date(), "标准描述5"));

        // 开始导出
        EasyExcelUtil.exportExcelPath(targetPath, excelName, sheetName, EasyExcelEntity.class, list);
    }

    /**
     * 导出Excel文件到Web服务器下
     *
     * @author 小辰哥哥
     */
    @GetMapping(value = "/exportExcelWeb")
    public void exportExcelWeb(HttpServletResponse response) {

        // Excel文件名称
        String excelName = "Excel文件" + System.currentTimeMillis();

        // Sheet页名称
        String sheetName = "Excel文件Sheet页";

        // 导入数据
        List<Object> list = new ArrayList<>();
        list.add(new EasyExcelEntity(6, "标准数据6", "完美", new Date(), "标准描述6"));
        list.add(new EasyExcelEntity(7, "标准数据7", "糟糕", new Date(), "标准描述7"));
        list.add(new EasyExcelEntity(8, "标准数据8", "凑合", new Date(), "标准描述8"));
        list.add(new EasyExcelEntity(9, "标准数据9", "一般", new Date(), "标准描述9"));
        list.add(new EasyExcelEntity(10, "标准数据10", "超帅", new Date(), "标准描述10"));

        // 开始导出
        EasyExcelUtil.exportExcelWeb(response, excelName, sheetName, EasyExcelEntity.class, list);
    }
}

5.开始测试

测试1:导出Excel文件到指定路径下

http://localhost:9090/OperateTicket/EasyExcelController/exportExcelPath

在这里插入图片描述
Springboot项目整合EasyExcel实现Excel导入与导出功能_第2张图片
Springboot项目整合EasyExcel实现Excel导入与导出功能_第3张图片
测试2:导出Excel文件到Web服务器下

http://localhost:9090/OperateTicket/EasyExcelController/exportExcelWeb

在这里插入图片描述
Springboot项目整合EasyExcel实现Excel导入与导出功能_第4张图片
Springboot项目整合EasyExcel实现Excel导入与导出功能_第5张图片
Springboot项目整合EasyExcel实现Excel导入与导出功能_第6张图片

二、EasyExcel实现Excel导入功能

1.新增监听器(EasyExcelListener.java)

package com.kd.opt.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import com.kd.opt.entity.EasyExcelEntity;
import com.kd.opt.service.StandardService;
import com.kd.opt.util.OptDataUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;

/**
 * EasyExcel实现Excel导入功能(需要配置监听器,传入相关实体类)
 *
 * @author 小辰哥哥
 */
public class EasyExcelListener extends AnalysisEventListener<EasyExcelEntity> {

    // 日志打印
    private static final Logger LOGGER = LoggerFactory.getLogger(EasyExcelListener.class);

    // 每隔2条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
    private static final int BATCH_COUNT = 2;
    List list = new ArrayList<EasyExcelEntity>();

    // 有个很重要的点EasyExcelListener不能被spring管理,要每次读取Excel都要new,然后里面用到spring构造方法可以传进去!!!
    private StandardService standardService;

    // 有参构造
    public EasyExcelListener(StandardService standardService) {
        this.standardService = standardService;
    }

    /**
     * 每一条数据解析都会来调用
     *
     * @param easyExcelEntity
     * @param analysisContext
     * @author 小辰哥哥
     */
    @Override
    public void invoke(EasyExcelEntity easyExcelEntity, AnalysisContext analysisContext) {
        LOGGER.debug("解析到一条数据:" + JSON.toJSONString(easyExcelEntity));

        // 放入List集合中
        list.add(easyExcelEntity);

        if (list.size() >= BATCH_COUNT) {

            LOGGER.debug("进行存库操作(省略)");

            // 并清理List集合
            list.clear();
        }
    }

    /**
     * 所有数据解析完成了,都会来调用(最后一次调用)
     *
     * @param analysisContext
     * @author 小辰哥哥
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

        LOGGER.debug("Excel文件所有数据解析完成!!!");

        // 模拟与数据库交互
        OptDataUtil optDataUtil = standardService.selectAll();

        LOGGER.debug("模拟与数据库交互:" + optDataUtil.getData());
    }
}

2.控制器(EasyExcelController.java)

package com.kd.opt.controller;

import com.alibaba.excel.EasyExcel;
import com.kd.opt.entity.EasyExcelEntity;
import com.kd.opt.listener.EasyExcelListener;
import com.kd.opt.service.StandardService;
import com.kd.opt.util.EasyExcelUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * EasyExcel实现Excel导入与导出功能
 *
 * @author 小辰哥哥
 */
@RestController
@CrossOrigin
@RequestMapping("/EasyExcelController")
public class EasyExcelController {

    // 依赖注入,模拟与数据库进行交互
    @Autowired
    private StandardService standardService;

    /**
     * 导入指定路径下的Excel文件
     *
     * @author 小辰哥哥
     */
    @GetMapping(value = "/readExcel")
    public void readExcel() {

        // Excel文件名称
        String excelName = "D:\\Java\\Opticket\\EasyExcel\\Excel导入文件.xlsx";

        // 开始导入
        EasyExcel.read(excelName, EasyExcelEntity.class, new EasyExcelListener(standardService)).sheet().doRead();
    }

    /**
     * 导入上传的Excel文件
     *
     * @author 小辰哥哥
     */
    @PostMapping(value = "/readUploadExcel")
    public void readUploadExcel(@RequestParam("file") MultipartFile fileName) {
        try {
            // 开始导入
            EasyExcel.read(fileName.getInputStream(), EasyExcelEntity.class, new EasyExcelListener(standardService)).sheet().doRead();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.前端Vue相关代码(测试2需要)

前端Vue代码(Element UI框架复用):

<el-upload
      class="upload-demo"
      :action="uploadUrl"
      :on-preview="handlePreview"
      :on-remove="handleRemove"
      :before-remove="beforeRemove"
      multiple
      :limit="3"
      :on-exceed="handleExceed">
      <el-button size="small" type="primary">点击上传</el-button>
</el-upload>
data() {
  return {
     // 请求后端服务器的接口地址
     uploadUrl: this.$axios.defaults.baseURL + "/EasyExcelController/readUploadExcel"
}
methods: {
   // 框架中的案例(可以忽略)
   handleRemove(file, fileList) {
      console.log(file, fileList);
   },
   handlePreview(file) {
      console.log(file);
   },
   handleExceed(files, fileList) {
      this.$message.warning(`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
   },
   beforeRemove(file, fileList) {
     return this.$confirm(`确定移除 ${ file.name }?`);
   }
}

4.开始测试

测试1:导入指定路径下的Excel文件

http://localhost:9090/OperateTicket/EasyExcelController/readExcel

Springboot项目整合EasyExcel实现Excel导入与导出功能_第7张图片
Springboot项目整合EasyExcel实现Excel导入与导出功能_第8张图片

Springboot项目整合EasyExcel实现Excel导入与导出功能_第9张图片
测试2:导入上传的Excel文件
Springboot项目整合EasyExcel实现Excel导入与导出功能_第10张图片
Springboot项目整合EasyExcel实现Excel导入与导出功能_第11张图片
Springboot项目整合EasyExcel实现Excel导入与导出功能_第12张图片
Springboot项目整合EasyExcel实现Excel导入与导出功能_第13张图片


总结

每天一个提升小技巧!!!

你可能感兴趣的:(Springboot,spring,boot,EasyExcel)