锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. Spring Boot 中使用EasyExcel实现导入导出

Spring Boot 中使用EasyExcel实现导入导出

0
  • 软件开发
  • 发布于 2024-08-16
  • 0 次阅读
黄健
黄健

本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net

1. 前言

在实际开发中,处理 Excel 文件是一个常见的需求。EasyExcel 是一个基于 Java 的开源库,提供了简单易用的 API,可以方便地读取和写入 Excel 文件。本文将介绍如何在 SpringBoot 中使用 EasyExcel 实现 Excel 导入功能;

1.1 首先 在 POM.XML 文件中导入依赖

<!--        easyExcelpoi-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.3</version>
        </dependency>

2. 导出功能

controller 层

/**
     * 导出
     * @author whj
     * @date 2023/12/6 17:48
     * @param
     * @return
     */
    @PostMapping("/exportInspectionPlan")
    @ApiOperation(value = "导出",notes = "导出")
    public void exportInspectionPlan(HttpServletRequest request, HttpServletResponse response,@RequestBody DataFromVo dataFromVo){
        log.info("执行了post请求");
        log.info("参数:"+dataFromVo);
        siteInspectPlanHomeService.exportInspectionPlan(request,response,dataFromVo);
    }

**2.1  创建实体类:**在使用 EasyExcel 进行导出时,我们需要创建一个与 Excel 数据结构相匹配的实体类。实体类的字段应与 Excel 文件的列对应。使用 @ExcelProperty 注解来标识字段与 Excel 列的映射关系,以及一些其他注解来设置字段的属性。

/**
 * @Author whj
 * @Description: 导出信息对象
 * @Date 2023/12/6 9:26
 */
@Data
@HeadRowHeight(value = 30) // 头部行高
@ContentRowHeight(value = 25) // 内容行高
@ColumnWidth(value = 20) // 列宽
@HeadFontStyle(fontName = "宋体", fontHeightInPoints = 11)
public class ExportPlanInformationVo  implements Serializable {
 
    @ApiModelProperty("名称")
    @ExcelProperty(value = "名称")
    private String planName;
 
    @ApiModelProperty("类型")
    @Dict(code = "inspectionType", fieldName = "inspectionTypeName")
    @ExcelProperty(value = "类型")
    private String inspectionType;
 
    @ApiModelProperty("主题名称")
    @ExcelProperty(value = "主题")
    private String themeName;
 
    @ApiModelProperty("计划起止时间")
    @ExcelProperty(value = "计划起止时间")
    private String startEndTime;
 
    /**
     * @descriptions 年度
     */
    @ApiModelProperty("年度")
    @ExcelProperty(value = "年度")
    private String inspectionYear;
 
    /**
     * @descriptions 单位数量
     */
    @ApiModelProperty("单位数量")
    @ExcelProperty(value = "单位数量")
    private String orgNoCount;
 
    /**
     * @descriptions 用户数
     */
    @ApiModelProperty("户数")
    @ExcelProperty(value = "户数")
    private String taskNum;
 
    /**
     * @descriptions 已完成户数
     */
    @ApiModelProperty("已完成户数")
    @ExcelProperty(value = "已完成户数")
    private String completedNumber;
 
    /**
     * @descriptions 完成率
     */
    @ApiModelProperty("完成率")
    @ExcelProperty(value = "完成率")
    private String inspectionCompletionRate ;
 
    /**
     * @descriptions 超期状态
     */
    @ApiModelProperty("超期状态")
    @ExcelProperty(value = "超期状态")
    private String isItOverdue;
 
    /**
     * @descriptions 计划状态
     */
    @ApiModelProperty("状态")
    @ExcelProperty(value = "状态")
    @Dict(code = "planStatus", fieldName = "planStatusName")
    private String planStatus;
 
    /**
     * @descriptions 创建时间
     */
    @ApiModelProperty("创建时间")
    @ExcelProperty(value = "创建时间")
    private String createTime;
 
 
    @ApiModelProperty("结束日期")
    @ExcelIgnore
    private String endTime;

注意:1. 如果不想某个字段在 excel 中出现  可以加  @ExcelIgnore注解

(默认所有字段都会和 excel 去匹配,加了这个注解会忽略该字段)

2.@ExcelIgnoreUnannotated​

默认不管加不加ExcelProperty的注解的所有字段都会参与读写,加了ExcelIgnoreUnannotated注解以后,不加ExcelProperty注解的字段就不会参与

3.@DateTimeFormat​

日期转换,用String去接收 excel 日期格式的数据会调用这个注解;

2.2.Service 层

========================== 重点来了!!!!===============================

@Override
    public void exportInspectionPlan(HttpServletRequest request, HttpServletResponse response, DataFromVo dataFromVo) {
         //以上需要根据自己的业务去做数据处理   这里就不做展示
 
        try{
            //给文件命名
            String fileName = "现场巡视计划报表";
            // 设置响应头
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("UTF-8");
            // 设置防止中文名乱码
            fileName = URLEncoder.encode(fileName, "utf-8");
            // 文件下载方式(附件下载还是在当前浏览器打开)
            response.setHeader("Content-disposition", "attachment;filename=" +
                    fileName + ".xlsx");
 
            //向excel表格写入数据
            EasyExcel.write(response.getOutputStream(),ExportPlanInformationVo.class)
                    .sheet("现场巡视计划报表")
                    .doWrite(planVos);
        }catch (Exception e){
            log.error("出现错误 {}",e);
        }
 
    }

至此  一个简单的导出就结束了

3. 导入功能

EasyExcel 的导入功能通常是将 Excel 文件中的数据导入到程序中,例如 Java 应用程序。导入过程如下:

  1. 首先,您需要准备一个包含要导入数据的 Excel 文件。
  2. 在 Java 应用程序中,使用 EasyExcel 提供的 API 创建一个 ExcelReader 对象,该对象表示要读取的 Excel 文件。
  3. 配置 ExcelReader 对象,包括指定要读取的文件路径、工作表名称等。
  4. 使用 EasyExcel 提供的方法从 Excel 文件中读取数据。您可以逐行读取数据,也可以使用批量读取的方法来提高性能。
  5. 将读取的数据处理并存储在程序中,例如将其存储在数据库、内存中的数据结构或其他数据存储中。
  6. 完成数据读取后,关闭 ExcelReader 对象,以确保所有数据都被正确读取并处理。

通过这种方式,您可以使用 EasyExcel 将 Excel 文件中的数据导入到 Java 应用程序中,以便进行进一步的处理或使用。导入功能在数据处理、数据迁移等场景中非常有用。

3.1  controller 层

/**
     * 导入
     *
     * @param file
     * @return void
     * @Author xxx
     * @Date 2023/12/1 10:28
     */
    @PostMapping("/importPatrolUser")
    @ApiOperation(httpMethod = "POST", value = "导入")
    public ImportInfoVo importPatrolUser(@RequestBody MultipartFile file) {
       return patrolConfigService.importPatrolUser(file);
    }

3.2  Service 层

@Override
    public ImportInfoVo importPatrolUser(MultipartFile file) {
        ImportInfoVo importInfoVo = new ImportInfoVo();
        importInfoVo.setFailNum("0");
        importInfoVo.setWinNum("0");
        InputStream inputStream = null;
        try {
            inputStream = file.getInputStream();
        } catch (IOException e) {
            log.info("文件检查出错");
        }
        List<ImportPatrolUserError> importPatrolUserError = new ArrayList<>();
        List<ImportPatrolUserDto> importPatrolUserDtos = EasyExcel.read(inputStream, ImportPatrolUserDto.class, new EmployeeReadListener())
                    .sheet(0)
                    .head(ImportPatrolUserDto.class)
                    .headRowNumber(3)
                    .doReadSync();
        if (CollectionUtils.isEmpty(importPatrolUserDtos)){
            throw HzwqServiceException.build(ResultEnum.EXCEPTIONZY, "未获取到模板导入数据");
        }
 
//------根据自己业务进行处理,这里不做展示
 
        importInfoVo.setWinNum(cconsInfoVos.size()+"");
        importInfoVo.setCconsInfoList(cconsInfoVos);
        importInfoVo.setImportPatrolUserErrorList(importPatrolUserError);
        importInfoVo.setFailNum(importPatrolUserError.size()+"");
        importInfoVo.setSumNum(importPatrolUserDtos.size()+"");
        return importInfoVo;
 
    }

4. 下载模板功能

/**
     * 下载模板
     *
     * @param request
     * @param response
     * @return void
     * @Author xxx
     * @Date 2023/12/5 15:45
     */
    @GetMapping(value="/download")
    public void download(HttpServletRequest request, HttpServletResponse response) {
    fileUtil.downloadExcel(request,response);
    }

这里封装了一个工具类  可做参考

/**
 * @Description: 文件工具
 * @Author  xxx
 * @Date 2023/12/5 15:46
 */
@Component
public  class  FileUtil {
 
    @Autowired
    ResourceLoader resourceLoader;
 
    //下载模板
    @SneakyThrows
    public  void downloadExcel(HttpServletRequest request, HttpServletResponse response){
        String fileName = "用户模板.xlsx";
        response.reset();
        response.setContentType("application/force-download");
        // 支持中文名称文件,需要对header进行单独设置,不然下载的文件名会出现乱码或者无法显示的情况
        String filename = URLEncoder.encode(fileName,"UTF-8");
        response.setHeader("Content-Disposition", "attachment;fileName=" + filename);
        org.springframework.core.io.Resource resource = resourceLoader.getResource("classpath:用户模板.xlsx");
        InputStream is = resource.getInputStream();
        ServletOutputStream outputStream;
        byte[] array;
        try {
            outputStream = response.getOutputStream();
            array = IOUtils.toByteArray(is);
            outputStream.write(array);
            outputStream.flush();
            outputStream.close();
        } catch (IOException e) {
            return;
        }
    }
}

至此所有内容结束  

==============================%&whj&%===================================

标签: #Spring Boot 173 #软件开发 1171 #JAVA 991
相关文章

万字:支付“核心系统”详解 2024-11-02 15:33

专栏作者:隐墨星辰 \| 主编:陈天宇宙 这篇文章也尝试化繁为简,探寻支付系统的本质,讲清楚在线支付系统最核心的一些概念和设计理念。 虽然支付行业已经过了风头最劲的时光,但跨境支付仍然在蓬勃发展,每年依然有很多新人进入这个行业,这篇文章尝试为这些刚入行的新人提供一点帮助。 文章只介绍一些支付行业十几

资深支付架构师视角:实战从问题定义到代码落地的完整套路 2024-11-02 15:33

前言 今天从一个实际案例入手,介绍站在架构师的角度,如何识别并定义问题,提炼需求,技术方案选型,再到详细设计,最后利用AI的能力协助写出核心的代码,验证与调优。 解决问题存在一定的模式,也可以称之为框架,总结出自己的思考和解题框架,以后再碰到同类型的问题就可以如庖丁解牛一样容易。 很多年前,我写代码

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

设计模式第16讲——迭代器模式(Iterator) 2024-10-08 11:24

一、什么是迭代器模式 迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。 二、角色组成 抽象迭代器(Iterator):定义了遍历聚合对象所需的方法

vue2路由和vue3路由区别及原理 2024-10-08 11:24

一、Vue2 与 Vue3 路由的区别 1. 创建路由实例方式的不同 Vue 2 中,通过 Vue.use() 注册路由插件,并通过 new VueRouter() 来创建路由实例。 import Vue from 'vue';import VueRouter from 'vue-router';i

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.