java导出excel_记录一下自己用springboot整合阿里巴巴开源的EasyExcel实现导入导出功能 - Code2020...

项目地址:https://github.com/changxueyi/springbootcrud

1.准备

项目的整体架构和图中的类似

cdb7ae54b697a52309bb03dc0e3d41c0.png

 2. 导入依赖

2fed528b6360af39ea024ee0b7f7c57f.png

当然,基本的mysql-connector-java、mybaits、springboot的也需要导入,最重要的就是上面的

3、导出excel

dept实体类
导出 Excel 时,若需要表头,那么相应的实体类需要继承 BaseRowModel,并加入 @ExcelProperty(value = “id”, index = 0) 注解。其中 value 代表在导出 Excel 时,该字段对应的表头名称;index 代表该字段对应的表头位置(从0开始)。如下图:

aba05d7561c4289a544c7c4e34c02c9a.png

1. 重要的代码

 实体类对象

363f530f54c13e9aa4f6848b230e613c.png

 2. 控制层   DeptController

98a3c290d63c7f59074448401aeca872.png

 业务层

a62911ded179ecdd5c652bad89487acf.png

 3. 实现层

package com.cxy.service.Impl;

import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.cxy.common.poi.ExcelListener;
import ;
import ;
import com.cxy.service.DeptService;
import org.apache.commons.lang3.RandomUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Random;

/**
 * @ClassName DeptServiceImpl
 * @Description TODO
 * @Author changxueyi
 * @Date 2020/11/12 17:43
 */
@Service
public class DeptServiceImpl implements DeptService {
    @Autowired
    private DeptMapper deptMapper;

    @Override
    public void excelExport(HttpServletResponse response) throws IOException {
        List<Dept> list = ();
        String fileName = "用户名单";
        ("application/");
        ("utf-8");
        ("Content-disposition", "attachment;filename=" + new String( ("gb2312"), "ISO8859-1" ) + ".xls");
        ServletOutputStream out = ();
        ExcelWriter writer = new ExcelWriter(out, );
        Sheet sheet = new Sheet(1,0,);
        //设置自适应宽度
        ();
        ("用户名单");
        (list,sheet);
        ();
        ();
        ().close();
        ();
    }

    @Override
    public void excelImport(MultipartFile file) throws IOException {
        if(!().equals("用户名单.xls") && !().equals("用户名单.xlsx") ){
            return;
        }
        InputStream inputStream = new BufferedInputStream(());
        //实例化实现了AnalysisEventListener接口的类
        ExcelListener excelListener = new ExcelListener(deptMapper);
        ExcelReader reader = new ExcelReader(inputStream,null,excelListener);
        //读取信息
        (new Sheet(1,1,));
    }
}

 层

96fa018484764812e0fca70e6bb494e0.png

 实现层

<?xml version="" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "" >
<mapper namespace="">
    <select resultType="">
        select * from dept
    </select>

    <insert parameterType="">
        insert into dept values (#{deptNo},#{deptName},#{localtion})
    </insert>
</mapper>

  工具类

package com.cxy.common.poi;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import ;
import ;
import org.springframework.stereotype.Controller;

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

/**
 * @ClassName ExcelListener
 * @Description TODO
 * @Author changxueyi
 * @Date 2020/11/12 17:57
 */
@Controller
public class ExcelListener extends AnalysisEventListener<Dept> {
    private List<Dept> datas = new ArrayList<>();
    private static final int BATCH_COUNT = 3000;
    private DeptMapper deptMapper;

    public ExcelListener(DeptMapper deptMapper){
        this.deptMapper = deptMapper;
    }

    @Override
    public void invoke(Dept dept, AnalysisContext analysisContext) {
        //数据存储到datas,供批量处理,或后续自己业务逻辑处理。
        (dept);
        //达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if(() >= BATCH_COUNT){
            saveData();
            // 存储完成清理datas
            datas.clear();
        }
    }

    private void saveData() {
        for(Dept dept : datas){
            (dept);
        }
    }

    public List<Dept> getDatas() {
        return datas;
    }

    public void setDatas(List<Dept> datas) {
        this.datas = datas;
    }

    /**
     * 所有数据解析完成了 都会来调用
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        saveData();//确保所有数据都能入库
    }

   /* @Override
    public void invoke(Dept dept, AnalysisContext analysisContext) {

    }*/
}

7. 导入的时候,文件名一定要固定

用户名单.xls

8.通过postMan使用的时候,需要注意以下几点

c5d9d73f151c8ea372c97306103ce46e.png

 头部信息

2a52cbab71f03eb20537571e3524923f.png

9.导出功能

再用postman测试导出功能:#

fa929cc2d3fd61f5d818b937dd2b3bf6.png

没有参数,直接send,然后可以看到:


将其下载下来查看(本来这里的文件名应该是代码中命名的“用户名单.xls”,但我尝试了很久总是没有变。。。)

与数据库表数据一致,说明导出成功!

特别说明:

d895003177e0febbcfb6032261a7fb99.png

这里的excel名字的命名必须是这个,而且里面的主键可以不写,因为可能会遇到主键冲突的问题

2dde951f5f9dfe8bdefae790cb0208ad.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这里是SpringBoot+Mybatis-plus整合easyExcel批量导入Excel到数据库+导出Excel的方法。 1. 添加依赖 在 pom.xml 文件中添加以下依赖: ```xml <!-- easyExcel --> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.6</version> </dependency> <!-- mybatis-plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency> ``` 2. 创建实体类 创建一个实体类,用于映射 Excel 表格中的数据。 ```java @Data public class User { @ExcelProperty("姓名") private String name; @ExcelProperty("年龄") private Integer age; @ExcelProperty("性别") private String gender; } ``` 3. 创建Excel读取器 创建一个 Excel 读取器,用于读取 Excel 表格中的数据,并将数据存储到数据库中。 ```java @Component public class ExcelReader { @Autowired private UserService userService; /** * 读取 Excel 表格中的数据,并将数据存储到数据库中 */ public void readExcel(String fileName) { EasyExcel.read(fileName, User.class, new UserExcelListener()).sheet().doRead(); } /** * 用户Excel监听器 */ private class UserExcelListener extends AnalysisEventListener<User> { /** * 每读取一行数据,就会调用该方法 */ @Override public void invoke(User user, AnalysisContext context) { userService.save(user); } /** * 读取完整个 Excel 表格后,会调用该方法 */ @Override public void doAfterAllAnalysed(AnalysisContext context) { // do nothing } } } ``` 4. 创建Excel导出器 创建一个 Excel 导出器,用于从数据库中获取数据,并将数据导出Excel 表格中。 ```java @Component public class ExcelWriter { @Autowired private UserService userService; /** * 将用户数据导出Excel 表格中 */ public void writeExcel(String fileName) { List<User> userList = userService.list(); EasyExcel.write(fileName, User.class).sheet().doWrite(userList); } } ``` 5. 创建Controller 创建一个 Controller,用于接收前端请求,并调用相应的方法处理请求。 ```java @RestController @RequestMapping("/user") public class UserController { @Autowired private ExcelReader excelReader; @Autowired private ExcelWriter excelWriter; /** * 批量导入用户数据 */ @PostMapping("/import") public void importExcel(@RequestParam("file") MultipartFile file) throws IOException { excelReader.readExcel(file.getInputStream()); } /** * 导出用户数据到Excel */ @GetMapping("/export") public void exportExcel(HttpServletResponse response) throws IOException { String fileName = "用户信息.xlsx"; response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); response.setContentType("application/vnd.ms-excel"); excelWriter.writeExcel(response.getOutputStream()); } } ``` 6. 配置文件 在 application.yml 文件中添加数据库连接信息。 ```yaml spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root password: root mybatis-plus: mapper-locations: classpath:/mapper/*.xml type-aliases-package: com.example.demo.domain ``` 7. 测试 启动应用程序,并在浏览器中访问以下地址: - http://localhost:8080/user/export :导出 Excel 表格 - http://localhost:8080/user/import :导入 Excel 表格 以上就是 SpringBoot+Mybatis-plus整合easyExcel批量导入Excel到数据库+导出Excel 的方法了,希望能帮到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值