SpringBoot集成EasyExcel实现Excel文件导入导出详解

一 导入EasyExcel依赖

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

二 创建实体类

@AllArgsConstructor
@NoArgsConstructor
@Data
public class Student {
    private Integer id;
    private String name;
    private Integer age;
    private String sex;
    private String uno;
}

三 工具类

//Bean拷贝工具类封装(对象复制,复制共有的字段)
public class BeanCopyUtils {
​
    private BeanCopyUtils() {
    }
​
    //单个对象的拷贝
    public static <V> V copyBean(Object source,Class<V> clazz) {
        //利用反射来创建接收对象
​
        //创建目标对象
        V result = null;
        try {
            result = clazz.newInstance();
            //实现属性copy
            BeanUtils.copyProperties(source, result);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //返回结果
        return result;
    }
    public static <O,V> List<V> copyBeanList(List<O> list, Class<V> clazz){
        return list.stream()
                .map(o -> copyBean(o, clazz))//对象的转换,将每个对象都进行拷贝
                .collect(Collectors.toList());
    }
}
public class WebUtils
{
    /**
     * 将字符串渲染到客户端
     * 
     * @param response 渲染对象
     * @param string 待渲染的字符串
     * @return null
     */
    public static void renderString(HttpServletResponse response, String string) {
        try
        {
            response.setStatus(200);
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            response.getWriter().print(string);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
​
​
public static void setDownLoadHeader(String filename, HttpServletResponse response)throws UnsupportedEncodingException {
        response.setContentType("application/vnd.openxmlformats-     officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        String fname= URLEncoder.encode(filename,"UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition","attachment; filename="+fname);
    }
}

四 导出EasyExcel

1) 配置Excel导出实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExcelExportVo {
​
    @ExcelProperty("学号")//导出为Excel文件时该字段的列名
    private String uno;//必须与实体类字段名称保持一致
    
    @ExcelProperty("姓名")
    private String name;
    
    @ExcelProperty("年龄")
    private Integer age;
    
    @ExcelProperty("性别")
    private String sex;
}

2)控制层方法

@GetMapping("/exportExcel")
public void exportExcel(HttpServletResponse response){
        try {
            //设置下载文件的请求头
            WebUtils.setDownLoadHeader("学生信息导出.xlsx",response);
            //获取需要导出的数据
            List<Student> studentList = studentService.list();//查找全部信息的方法,按照自己的项目编写
            List<ExcelExportVo> excelStudentVos = BeanCopyUtils.copyBeanList(studentList, ExcelExportVo.class);//对象拷贝
            //把数据写入到Excel中
            EasyExcel.write(response.getOutputStream(), ExcelExportVo.class).autoCloseStream(Boolean.FALSE).sheet("学生信息导出")
                    .doWrite(excelStudentVos);
​
        } catch (Exception e) {
            //如果出现异常也要响应json
            ResponseResult result = ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR);//json形式的错误提示信息,按照自己的项目编写
            WebUtils.renderString(response, JSON.toJSONString(result));
        }
​
}

五 导入EasyExcel

1) 配置Excel导入实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
//该实体类有几个字段,导入的Excel文件也只能有几列,且列名与注解值必须保持一致
public class ExcelImportVo {
​
    @ExcelProperty("学号")//导入的Excel文件的列名必须与该注解的名称保持一致
    private String uno;//必须与实体类字段名称保持一致
    
    @ExcelProperty("姓名")
    private String name;
    
    @ExcelProperty("年龄")
    private Integer age;
    
    @ExcelProperty("性别")
    private String sex;
}

2) 配置监听器,在监听器里将数据解析出来执行业务逻辑

@Slf4j
public class ExcelImportListenerStudent extends AnalysisEventListener<ExcelImportVo> {
​
    @Resource
    private StudentMapper studentMapper;//根据自己的业务需要设置,但是必须由构造函数传入,否则对象为空
​
    //构造函数,设置属性值,有几个属性就传入几个,根据自己的业务需要设置
    public ExcelImportListenerStudent(StudentMapper studentMapper) {
        this.studentMapper = studentMapper;
    }
​
    //具体的业务操作,按照自己的形目需求,这边以新增举例
    @Override
    public void invoke(ExcelImportVo excelImportVo, AnalysisContext analysisContext) {
        log.info("解析到一条数据:{}", JSON.toJSONString(excelImportVo));
​
​
        Student student = BeanCopyUtils.copyBean(excelImportVo, Student.class);
        System.out.println("导入学生信息:"+student);
        studentMapper.insert(student);
    }
​
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        log.info("所有数据解析完成!");
    }
}

3)控制层方法

@PostMapping("/excel/import")
public ResponseResult importData(MultipartFile file){//返回类型按自己的项目需求来定义
        try {
            System.out.println("导入数据");
            EasyExcel.read(file.getInputStream(), ExcelImportVo.class,new ExcelImportListenerStudent(studentMapper)).sheet().doRead();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return ResponseResult.okResult();
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值