iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Spring Boot项目怎么实现Excel导入与导出功能
  • 142
分享到

Spring Boot项目怎么实现Excel导入与导出功能

2023-07-02 08:07:34 142人浏览 泡泡鱼
摘要

本文小编为大家详细介绍“spring Boot项目怎么实现excel导入与导出功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Boot项目怎么实现Excel导入与导出功能”文章能帮助大家解决疑惑,下面跟

本文小编为大家详细介绍“spring Boot项目怎么实现excel导入与导出功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Boot项目怎么实现Excel导入与导出功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    背景

    Excel 导入与导出是项目中经常用到的功能,在 Java 中常用 poi 实现 Excel 的导入与导出。由于 poi 占用内存较大,在高并发下很容易发生 OOM 或者频繁 fullGC,阿里基于 poi 开源了 EasyExcel 项目。

    除了节约内存,EasyExcel 还简化了 api,通过注解映射 Excel 单元格与对象字段之间的关系,简单的几行代码就能搞定复杂的导入导出功能了。

    EasyExcel 问题

    看似一切美好,不过经常做 Excel 导入与导出就会发现,EasyExcel 还是没那么完美的。

    首先,导入与导出 Excel 本质是上将 Excel 文件内容与 Java 对象之间做一个映射,EasyExcel 做的只是在这两者之间转换。如果项目中的 Excel 导入与导出功能比较多,会产生大量的样板式代码,使用体验类似于 JDBC。

    另外,导入往往还伴随着校验,这是 EasyExcel 没有支持的功能。如果需要校验,要么写代码手动判断,要么调用 Java Validation 规范 定义的 API 判断,这又会产生大量样板式代码。

    而且,当前 Spring Boot 已经成了必备的 Java 开发框架,easyexcel 也没有进行整合。

    分析与解决

    导入与导出通常发生在 WEB 环境,对于 Spring mvc 来说,可以将请求信息转换为任意类型的 contoller 方法参数,将 controller 方法返回值转换为客户端支持的内容。

    如果能够使用自定义的 controller 方法参数接收 Excel 文件内容,将 controller 方法返回值转换为 Excel 文件响应,可以直接消除 Excel 导入与导出时的样板式代码。

    另外在将请求内容转换为 controller 方法参数时还可以加入自定义的校验逻辑。

    由于 Excel 导入与导出样板式代码、校验问题与具体的业务逻辑无关,可以单独抽象出来,我这里在 EasyExcel 的基础上封装了一个 easyexcel-spring-boot-starter 的项目,大大降低了 EasyExcel 上手的门槛,对用户来说只需要使用 EasyExcel 定义的注解提供映射关系就可以了,适用于简单场景的导入导出。

    Spring Boot Excel 导入与导出

    依赖引入

    首先需要引入依赖,坐标如下。

    <dependency>    <groupId>com.zzuhkp</groupId>    <artifactId>easyexcel-spring-boot-starter</artifactId>    <version>1.0-SNAPSHOT</version></dependency>

    不过很不幸的是目前还没传至中央仓库,需要的小伙伴可自行上传到私有仓库或直接把代码嵌入自己的项目。

    Excel 导入

    首先看下要导入的 Excel 内容吧。

    Spring Boot项目怎么实现Excel导入与导出功能

    为了接收 Excel 文件内容,我们需要定义一个对应的 Model 类。

    @Datapublic class DemoData {    @ExcelProperty(index = 0)    private Integer integer;    @ExcelProperty(index = 1)    private String string;    @ExcelProperty(index = 2)    private Date date;}
    基本导入功能

    然后使用 List<T> 参数接收即可。

    @PostMapping("/list/obj")public List<DemoData> listObj(@ExcelParam List<DemoData> list) {    return list;}

    注意参数前添加了 @ExcelParam 注解,用来标识 Excel 文件参数。这样,一个导入功能实现了,是不是很简单呢?

    默认情况下接收名称为 file 的表单字段作为 Excel 文件,如果不满足还可以修改。

    @ExcelParam(value = "file", required = true)
    进阶导入功能

    有时候,我们可能比较关心对象对应 Excel 的元数据,例如这个对象是第几行记录产生的,这个对象的字段对应 Excel 第几列,这个时候我们可以使用 ReadRows<T> 参数接收 Excel。

    @PostMapping("/list/rows")public ReadRows<DemoData> readRows(@ExcelParam ReadRows<DemoData> readRows) {    return readRows;}

    ReadRows 使用两个字段记录行映射关系与列映射关系。

    public class ReadRows<T> {    private ExcelReadHeadProperty excelReadHeadProperty;    private List<ReadRow<T>> rows;}

    ExcelReadHeadProperty 是 EasyExcel 自带的类,表示列映射关系的元数据。ReadRow 是框架自定义的类,表示行映射关系的元数据。

    看下 ReadRow 定义吧。

    public class ReadRow<T> {    // 行索引,从 0 开始    private final Integer rowIndex;    // 行记录对应对象    private final T data;}

    使用 ExcelReadHeadProperty 获取字段对应列索引的示例代码如下。

    // 对象字段名称 -> 从 0 开始的列索引Map<String, Integer> fieldColumnIndexMap = readRows.getExcelReadHeadProperty().getHeadMap().values()        .stream().collect(Collectors.toMap(Head::getFieldName, Head::getColumnIndex));

    Excel 导出

    这里对 Excel 的导出进行了简单的支持。将 List<T> 定义为 controller 方法返回值即可。

    @ExcelResponse@GetMapping("/list/download")public List<DemoData> downloadList() {    return Arrays.asList(new DemoData(1, "hello", new Date()), new DemoData(2, "excel", new Date()));}

    需要注意的是使用 @ExcelResponse 注解表示响应内容为 Excel 文件。默认情况,下载的文件名称为 default.xlxs,写入到名称为 Sheet1 的工作表中。如果不满足需求可以修改。

    @ExcelResponse(fileName = "测试文件", sheetName = "工作表1")

    Excel 导入参数校验

    参数校验是 Excel 导入常用的功能,这里进行了强有力的支持,使用体验如原生 spring boot 校验般顺滑。

    开启校验

    与 spring boot 原生使用方式一样,将 @Validated@Valid 注解添加到 @ExcelParam 参数上即可。

    @PostMapping("/list/obj")public List<DemoData> listObj(@ExcelParam @Validated List<DemoData> list) {    return list;}

    校验规则定义

    Bean Validation 定义校验规则

    默认情况下框架使用 jsR-303 Bean Validation 规范定义的校验注解校验,需要手动引入 spring-boot-starter-validation,可通过设置环境变量 easyexcel.validator.default.enable=false 关闭。

    @Datapublic class DemoData {    @NotNull(message = "参数不能为空")    private Integer integer;    private String string;    private Date date;}

    另外还可以自定义注解对对象校验。

    ... 省略其他元注解@Constraint(validatedBy = {DemoDataValid.DemoDataValidator.class})public @interface DemoDataValid {... 省略注解属性    class DemoDataValidator implements ConstraintValidator<DemoDataValid, DemoData> {        @Override        public boolean isValid(DemoData value, ConstraintValidatorContext context) {            context.disableDefaultConstraintViolation();            context.buildConstraintViolationWithTemplate("测试对象校验").addConstraintViolation();            return false;        }    }}
    @DemoDataValidpublic class DemoData {    ... 省略属性}
    ExcelValidator 接口定义校验规则

    Bean Validation 注解只能校验单个字段或对象,如果需要对所有的对象进行校验,可以实现框架定义的 ExcelValidator 接口,然后将实现定义为 Spring Bean。

    这个接口定义如下。

    public interface ExcelValidator<T> {    ExcelValidErrors validate(ReadRows<T> readRows);}

    ExcelValidErrors 用于接收校验的错误信息,分别使用接口 ExcelValidObjectErrorExcelValidFieldError 接口定义行错误信息和单元格错误信息。

    public class ExcelValidErrors {// 行错误信息或单元格错误信息列表    private final List<ExcelValidObjectError> errors;}public interface ExcelValidObjectError {    // 获取行号,从 1 开始    Integer getRow();    // 获取错误消息    String getMessage();}public interface ExcelValidFieldError extends ExcelValidObjectError {    // 获取列,从 1 开始    Integer getColumn();}

    例如,如果需要对所有的 DemoData 校验 integer 字段的值不能重复,可以使用如下的代码。

    @Componentpublic class CustomExcelValidator implements ExcelValidator<DemoData> {    @Override    public ExcelValidErrors validate(ReadRows<DemoData> readRows) {        ExcelValidErrors errors = new ExcelValidErrors();        Map<Integer, List<ReadRow<DemoData>>> group = readRows.getRows().stream()                .collect(Collectors.groupingBy(item -> item.getData().getInteger()));        for (Map.Entry<Integer, List<ReadRow<DemoData>>> entry : group.entrySet()) {            if (entry.getValue().size() > 1) {                for (ReadRow<DemoData> readRow : entry.getValue()) {                    errors.addError(new DefaultExcelObjectError(readRow.getRowIndex() + 1, "参数重复"));                }            }        }        return errors;    }}

    校验结果接收

    与 Spring MVC 设计类似,这里也提供了两种接收校验结果的方式。

    异常捕获接收校验结果

    开启校验后,如果校验结果中包含错误,会将错误信息封装到 ExcelValidException,并抛出异常,可以通过全局异常捕获的方式收集错误信息。

    @RestControllerAdvicepublic class GlobalExceptionControllerAdvice {    @ExceptionHandler(ExcelValidException.class)    public String handleException(ExcelValidException e) {        ExcelValidErrors errors = e.getErrors();        return JSON.toJSONString(errors);    }}
    controller 方法参数接收校验结果

    如果不想通过异常捕获的方式接收校验的错误信息,还可以将错误信息添加到 @ExcelParam 参数的后面,示例代码如下。

    @PostMapping("/list/obj")public List<DemoData> listObj(@ExcelParam @Validated List<DemoData> list, ExcelValidErrors errors) {    if (errors.hasErrors()) {        String messages = errors.getAllErrors().stream().map(ExcelValidObjectError::getMessage).collect(Collectors.joining(" | "));        throw new RuntimeException("发现异常:" + messages);    }    return list;}

    读到这里,这篇“Spring Boot项目怎么实现Excel导入与导出功能”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

    --结束END--

    本文标题: Spring Boot项目怎么实现Excel导入与导出功能

    本文链接: https://www.lsjlt.com/news/340653.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Spring Boot项目怎么实现Excel导入与导出功能
      本文小编为大家详细介绍“Spring Boot项目怎么实现Excel导入与导出功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Boot项目怎么实现Excel导入与导出功能”文章能帮助大家解决疑惑,下面跟...
      99+
      2023-07-02
    • Spring Boot项目如何优雅实现Excel导入与导出功能
      目录背景EasyExcel 问题分析与解决Spring Boot Excel 导入与导出依赖引入Excel 导入基本导入功能进阶导入功能Excel 导出Excel 导入参数校验开启校...
      99+
      2024-04-02
    • EasyExcel实现Excel文件导入导出功能
      一、EasyExcel简介 Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的fu...
      99+
      2023-09-15
      excel java Powered by 金山文档
    • Spring Boot 集成 EasyExcel 3.x 优雅实现Excel导入导出
      Spring Boot 集成 EasyExcel 3.x 本章节将介绍 Spring Boot 集成 EasyExcel(优雅实现Excel导入导出)。 🤖 Spring Boot 2.x 实践案例(代码仓库) 介绍...
      99+
      2023-08-22
      spring boot excel java
    • Spring Boot + EasyExcel实现数据导入导出
      目录背景SpringBoot项目集成依赖集成实体类实现业务逻辑实现MemberService实现简单导出实现自定义导入实现同步获取结果导入实现基于监听导入实现小结背景 老项目主要采用...
      99+
      2022-11-13
      Spring Boot 数据导入导出 EasyExcel数据导入导出
    • C#使用NPOI实现Excel导入导出功能
      本文实例为大家分享了C#使用NPOI实现Excel导入导出的具体代码,供大家参考,具体内容如下 Excel导入 使用OpenFileDiolog控件和button结合,选择文件导入,...
      99+
      2024-04-02
    • java怎么实现导入导出功能
      在Java中,可以使用以下两种方式来实现导入和导出功能:1. 使用文件输入输出流:可以使用FileInputStream和FileO...
      99+
      2023-10-08
      java
    • JAVA怎么实现导出Excel功能
      Java可以通过使用Apache POI库来实现导出Excel功能。下面是一个简单的示例代码:```javaimport org.a...
      99+
      2023-10-08
      java
    • Java实现导出Excel功能
      文章参考《Qt5开发及实例(第4版)》陆文周 主编 一、建立Qt工程 1、选择类别 2、建立项目名称 3、选择Qt基类及修改名称 4、选择编译器(这边两个都选择,生成两个Deb...
      99+
      2024-04-02
    • Vue怎么实现导入Excel功能
      这篇文章主要讲解了“Vue怎么实现导入Excel功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue怎么实现导入Excel功能”吧!1.前端主导实现步骤...
      99+
      2024-04-02
    • java利用easyexcel实现导入与导出功能
      目录前言1先添加依赖2批量插入数据3创建需要导出数据实体类4创建一个类ExcelListener5实现下载excel6控制器添加我们的导入操作代码7导出效果如图8导入直接调用前言 p...
      99+
      2024-04-02
    • C#中如何使用NPOI实现Excel导入导出功能
      本文小编为大家详细介绍“C#中如何使用NPOI实现Excel导入导出功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#中如何使用NPOI实现Excel导入导出功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
      99+
      2023-06-29
    • SpringBoot+EasyPoi实现excel导出功能
      在实际项目开发中,对于Excel的导入导出还是很常见的需求,比如说将数据根据模板批量导入到数据库中,以及将数据库中的数据批量导出陈Excel的形式 现有需求: 根据检索条件查询列表并...
      99+
      2024-04-02
    • React怎么实现导入导出Excel文件
      这篇文章主要介绍“React怎么实现导入导出Excel文件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“React怎么实现导入导出Excel文件”文章能帮助大家解决问题。表示层这里我是使用的是ant...
      99+
      2023-06-05
    • Java怎么实现Excel导入导出操作
      今天小编给大家分享一下Java怎么实现Excel导入导出操作的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 功能测试1....
      99+
      2023-06-29
    • Vue怎么导出Excel功能
      这篇文章主要讲解了“Vue怎么导出Excel功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue怎么导出Excel功能”吧!1.前端主导流程:1.点击页...
      99+
      2024-04-02
    • Java中怎样实现导出Excel功能
      这篇文章将为大家详细讲解有关Java中怎样实现导出Excel功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用第三方库实现导出Excel业界有句话:不重复造轮子。 使用工具类可以减少日常繁琐的编码,减...
      99+
      2023-06-14
    • vue怎么实现excel表格的导入导出
      这篇文章主要介绍“vue怎么实现excel表格的导入导出”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue怎么实现excel表格的导入导出”文章能帮助大家解决问题。一、下载xlsx插件npm&nb...
      99+
      2023-07-06
    • Vue如何实现导出Excel功能
      小编给大家分享一下Vue如何实现导出Excel功能,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1.前端主导流程:点击页面中导出按钮(注册点击事件)事件回调里面,发送请求后台数据对后台数据进行处理,完成想要的效果生成Exc...
      99+
      2023-06-20
    • Java如何实现导出Excel功能
      这篇文章将为大家详细讲解有关Java如何实现导出Excel功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。刚写了个导入Excel表格,现在来写个导出,其实形式都差不多,废话不多说,贴代码&...
      99+
      2023-06-21
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作