【Java专题_04】集成EasyExcel进行Excel导入导出详细教程

简介: 【Java专题_04】集成EasyExcel进行Excel导入导出详细教程

最详细的教程------EasyExcel导入与导出功能整合

1、开发环境参数

name Value
开发工具 Intellij IDEA 2018
框架 SpringBoot(maven项目也可以)
版本 2.2.5.RELEASE

2、导入Maven依赖

<!--EasyExcel,导出或是导入Excel文档的依赖-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>easyexcel</artifactId>
      <version>2.1.6</version>
    </dependency>
    <!--lombok,可以简化get,set,toString的插件-->
    <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
    </dependency>

3、项目结构

4、开始代码部分

第一步:创建实体类

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import lombok.Data;
import java.util.Date;
/**
 * 学生实体类
 * 
 * 注意需要有@ExcelProperty注解
 */
@Data  //代替get,set方法
public class Student {
    @ExcelProperty(value = "学生id",index=0)//index是序号,valeu是对应excel表格的头部标题
    private Integer id;//学生id
    @ExcelProperty(value = "学生姓名",index=1)
    private String name;//学生姓名
    @ExcelProperty(value = "学生年级",index=2)
    private String grade;//学生年级
    @ExcelProperty(value = "创建时间",index=3)
    @DateTimeFormat(value = "yyyy-MM-dd")//优化时间导出格式
    private Date createTime;//创建时间
}

第二步:创建一个通用的BaseMapper,方便我们进行业务处理。

import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class BaseMapper<T> {
    public void saveBath(List<T> t){
        System.out.println("进行模拟数据插入操作");
    }
}

第三步:创建一个导入excel文档的读取监听通用类,注意!注意!注意,不要使用@Autowired 注入BaseMapper,否则会报空指针异常,因为可能与POI冲突,因而你可以new 一个,或者使用构造方法进行注入,这里采用构造方法进行注入。

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.xsy.easyexcel.Mapper.BaseMapper;
import java.util.ArrayList;
import java.util.List;
/**
 * Excel文档导入配置类,使用泛型封装
 */
public class EasyExcelListener<T> extends AnalysisEventListener<T> {
    //mapper层通用类,你也可以自己封装
    private BaseMapper<T> baseMapper;
    //由于存在poi冲突无法进行依赖注入,采取构造方法的方式注入其他类
    public EasyExcelListener(BaseMapper<T> baseMapper){
       this.baseMapper=baseMapper;
    }
    //设置最大读取行数
    private static final int BAStudentCH_COUNStudent = 5;
    //以List形式读取excel文档内容
    private List<T> list=new ArrayList<>();
    /**
     * @param t 传入对应的实体类,就是你需要进行导入数据的类,我这里是student类
     * @param analysisContext 用来解析excel文档的类,引入依赖的包已经帮我们封装了
     */
    //重写导入代理类
    @Override
    public void invoke(T t, AnalysisContext analysisContext) {
        list.add(t);
        if (list.size()>=BAStudentCH_COUNStudent){
            System.out.println("读取行数:"+list.size());
            //执行逻辑操作,比如说插入数据到数据库 saveBath(list)
            baseMapper.saveBath(list);
            list.clear(); //清理list占用内存空间,重新读取下一次
        }
    }
    /**
     * @param analysisContext 用来解析excel文档的类,
     */
    //必须重写这个类,否则最后一批数据不会被处理
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        //跟上面一样,比如说插入数据 saveBath(list)
        System.out.println("最后读取行数:"+list.size());
        baseMapper.saveBath(list);
    }
}

第四步:编写控制层

import com.alibaba.excel.EasyExcel;
import com.xsy.easyexcel.Mapper.BaseMapper;
import com.xsy.easyexcel.entity.Student;
import com.xsy.easyexcel.utils.EasyExcelListener;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Date;
/**
 * 控制层
 */
@RestController
@RequestMapping("/test")
public class StudentController {
    
    /**
     * 以流方式响应回给客户端,返回值类型设置成void
     *
     * @param response 输出excel表格,让用户下载
     */
    @GetMapping("/exportExcel")
    public void exportExcel(HttpServletResponse response){
        try {
            //设置响应头,指定输出格式
            //attachment指定独立文件下载  不指定则回浏览器中直接打开
            response.setHeader("Content-Disposition","attachment;filename="+new String("学生信息表.xlsx".getBytes(),"ISO-8859-1"));
            //输出文件流  调用服务层方法,获取excel对象放入输出流
            ArrayList<Student> list = new ArrayList<>();
            Student student = new Student();
            student.setId(201624122);
            student.setName("xiaosongyeu");
            student.setGrade("大学四年级");
            student.setCreateTime(new Date());
            for (int i = 0; i <13 ; i++) {
                list.add(student);
            }
            //导出excel
            EasyExcel.write(response.getOutputStream(), Student.class).sheet("学生信息表").doWrite(list);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * ajax文件上传,前端传递的文件对象为file
     *
     * @param file 前端上传的excel文件
     * @return
     */
    @PostMapping("/importExcel")
    public String importExcel(MultipartFile file){
        //从解析器中获取excel文件流,传入到服务层进行读取处理
        try {
           EasyExcel.read(file.getInputStream(),Student.class,new EasyExcelListener(new BaseMapper())).sheet("学生信息表").doRead();
        } catch (IOException e) {
            e.printStackTrace();
            return "导入失败";
        }
        return "导入成功";
    }
}

第五步:进行测试

(1)导出excel文档:浏览器直接访问localhost:8080/test/exportExcel

(2)导入Excel文档:使用PostMan工具测试

选择post请求—选择form-data----key填file,value选择文件,让后send,可以查看控制台输出

六、若是遇到什么问题,可以一起交流学习,这个demo代码也一并奉上,直接下载即可运行。

相关文章
|
3月前
|
JavaScript NoSQL Java
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
259 96
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
|
2月前
|
SQL druid Oracle
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
|
4月前
|
消息中间件 Java 数据库
自研Java框架 Sunrays-Framework使用教程「博客之星」
### Sunrays-Framework:助力高效开发的Java微服务框架 **Sunrays-Framework** 是一款基于 Spring Boot 构建的高效微服务开发框架,深度融合了 Spring Cloud 生态中的核心技术组件。它旨在简化数据访问、缓存管理、消息队列、文件存储等常见开发任务,帮助开发者快速构建高质量的企业级应用。 #### 核心功能 - **MyBatis-Plus**:简化数据访问层开发,提供强大的 CRUD 操作和分页功能。 - **Redis**:实现高性能缓存和分布式锁,提升系统响应速度。 - **RabbitMQ**:可靠的消息队列支持,适用于异步
自研Java框架 Sunrays-Framework使用教程「博客之星」
|
4月前
|
存储 缓存 Java
Java中的分布式缓存与Memcached集成实战
通过在Java项目中集成Memcached,可以显著提升系统的性能和响应速度。合理的缓存策略、分布式架构设计和异常处理机制是实现高效缓存的关键。希望本文提供的实战示例和优化建议能够帮助开发者更好地应用Memcached,实现高性能的分布式缓存解决方案。
94 9
|
4月前
|
Java 数据库连接 数据处理
探究Java异常处理【保姆级教程】
Java 异常处理是确保程序稳健运行的关键机制。它通过捕获和处理运行时错误,避免程序崩溃。Java 的异常体系以 `Throwable` 为基础,分为 `Error` 和 `Exception`。前者表示严重错误,后者可细分为受检和非受检异常。常见的异常处理方式包括 `try-catch-finally`、`throws` 和 `throw` 关键字。此外,还可以自定义异常类以满足特定需求。最佳实践包括捕获具体异常、合理使用 `finally` 块和谨慎抛出异常。掌握这些技巧能显著提升程序的健壮性和可靠性。
78 4
|
4月前
|
存储 移动开发 算法
【潜意识Java】Java基础教程:从零开始的学习之旅
本文介绍了 Java 编程语言的基础知识,涵盖从简介、程序结构到面向对象编程的核心概念。首先,Java 是一种高级、跨平台的面向对象语言,支持“一次编写,到处运行”。接着,文章详细讲解了 Java 程序的基本结构,包括包声明、导入语句、类声明和 main 方法。随后,深入探讨了基础语法,如数据类型、变量、控制结构、方法和数组。此外,还介绍了面向对象编程的关键概念,例如类与对象、继承和多态。最后,针对常见的编程错误提供了调试技巧,并总结了学习 Java 的重要性和方法。适合初学者逐步掌握 Java 编程。
86 1
|
4月前
|
Java API Apache
java集成stable diffusion
通过REST API和JNI两种方法,我们可以在Java应用程序中集成Stable Diffusion模型。REST API方法更加简单和易于维护,而JNI方法则提供更高的性能。根据具体应用场景和需求,选择合适的集成方法,可以充分利用Stable Diffusion的强大功能,实现高效的图像生成和处理。
117 15
|
4月前
|
前端开发 Java 开发工具
Git使用教程-将idea本地Java等文件配置到gitte上【保姆级教程】
本内容详细介绍了使用Git进行版本控制的全过程,涵盖从本地仓库创建到远程仓库配置,以及最终推送代码至远程仓库的步骤。
132 0
|
7月前
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
6月前
|
消息中间件 监控 Java
您是否已集成 Spring Boot 与 ActiveMQ?
您是否已集成 Spring Boot 与 ActiveMQ?
224 0