SpringBoot如何使用EasyExcel实现表格导出(简洁快速入门版本)

news2024/12/23 18:28:39

前言

前面给大家介绍了动态表头的导入,这篇文章给大家介绍如何实现导出

前面给大家介绍了动态表头的导入,我们了解了如何通过EasyExcel灵活地读取结构不固定的Excel文件。这次,我们将目光转向数据导出——即如何将数据以Excel文件的形式输出给用户。这在很多应用场景中都非常有用,比如报表生成、数据备份和迁移等。下面我将详细讲解如何在Spring Boot应用中使用EasyExcel来实现数据的导出功能。

首先先上EasyExcel的官网:EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 官网

1. 添加依赖

        首先,我们需要确保项目中已经包含了EasyExcel的依赖。如果你还没有添加,请打开pom.xml文件,并加入以下Maven依赖:

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

请根据你的项目需求选择合适的版本号,通常建议使用最新稳定版。

 2.实现

controller层

        在Controller层中,我们定义了一个处理导出请求的API端点。该方法接收一个HTTP POST请求,并根据传入的参数(DataFromVo)调用服务层的方法来执行具体的导出逻辑。

/**
 * 导出检查计划数据
 * @author zqx
 * @date 2023/12/6 17:48
 */
@RestController
@RequestMapping("/inspection")
public class InspectionPlanController {

    @Autowired
    private SiteInspectPlanHomeService siteInspectPlanHomeService;

    /**
     * 导出检查计划信息为Excel文件。
     *
     * @param request  HTTP请求对象,用于获取请求信息。
     * @param response HTTP响应对象,用于设置响应头和写出文件流。
     * @param dataFromVo 包含查询条件的数据传输对象。
     */
    @PostMapping("/exportInspectionPlan")
    @ApiOperation(value = "导出检查计划信息", notes = "将检查计划信息导出为Excel文件")
    public void exportInspectionPlan(HttpServletRequest request, HttpServletResponse response, @RequestBody DataFromVo dataFromVo) {
        log.info("执行了POST请求");
        log.info("参数:{}", dataFromVo);
        siteInspectPlanHomeService.exportInspectionPlan(request, response, dataFromVo);
    }
}

创建实体类

        为了使EasyExcel能够正确地映射Java对象到Excel表格中的列,我们需要创建一个与Excel结构相匹配的实体类。这里我们使用ExportPlanInformationVo作为示例。

/**
 * 导出信息对象
 * @Author zqx
 * @Date 2023/12/6 9:26
 */
@Data
@HeadRowHeight(30) // 设置头部行高
@ContentRowHeight(25) // 设置内容行高
@ColumnWidth(20) // 设置列宽
@HeadFontStyle(fontName = "宋体", fontHeightInPoints = 11)
public class ExportPlanInformationVo implements Serializable {

    @ApiModelProperty("名称")
    @ExcelProperty("名称")
    private String planName;

    @ApiModelProperty("类型")
    @Dict(code = "inspectionType", fieldName = "inspectionTypeName")
    @ExcelProperty("类型")
    private String inspectionType;

    @ApiModelProperty("主题名称")
    @ExcelProperty("主题")
    private String themeName;

    @ApiModelProperty("计划起止时间")
    @ExcelProperty("计划起止时间")
    private String startEndTime;

    @ApiModelProperty("年度")
    @ExcelProperty("年度")
    private String inspectionYear;

    @ApiModelProperty("单位数量")
    @ExcelProperty("单位数量")
    private String orgNoCount;

    @ApiModelProperty("户数")
    @ExcelProperty("户数")
    private String taskNum;

    @ApiModelProperty("已完成户数")
    @ExcelProperty("已完成户数")
    private String completedNumber;

    @ApiModelProperty("完成率")
    @ExcelProperty("完成率")
    private String inspectionCompletionRate;

    @ApiModelProperty("超期状态")
    @ExcelProperty("超期状态")
    private String isItOverdue;

    @ApiModelProperty("状态")
    @Dict(code = "planStatus", fieldName = "planStatusName")
    @ExcelProperty("状态")
    private String planStatus;

    @ApiModelProperty("创建时间")
    @ExcelProperty("创建时间")
    private String createTime;

    @ApiModelProperty("结束日期")
    @ExcelIgnore // 忽略此字段不输出到Excel中
    private String endTime;
}

Service 层

        在Service层中,我们将具体实现导出逻辑。这个例子展示了如何准备要导出的数据,并通过EasyExcel库将其写入HTTP响应流中,以便用户可以下载生成的Excel文件。

@Service
public class SiteInspectPlanHomeService {

    /**
     * 导出检查计划信息为Excel文件。
     *
     * @param request  HTTP请求对象,用于获取请求信息。
     * @param response HTTP响应对象,用于设置响应头和写出文件流。
     * @param dataFromVo 包含查询条件的数据传输对象。
     */
    @Override
    public void exportInspectionPlan(HttpServletRequest request, HttpServletResponse response, DataFromVo dataFromVo) {
        try {
            // 根据业务需求处理dataFromVo并获取要导出的数据列表
            List<ExportPlanInformationVo> planVos = prepareDataForExport(dataFromVo);

            // 给文件命名
            String fileName = "现场巡视计划报表";

            // 设置响应内容类型为Excel格式,并编码防止中文乱码问题
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("UTF-8");

            // 设置文件名并处理URL编码
            fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");

            // 文件下载方式(附件下载还是在当前浏览器打开)
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");

            // 使用EasyExcel进行数据写入操作
            EasyExcel.write(response.getOutputStream(), ExportPlanInformationVo.class)
                    .sheet("现场巡视计划报表") // 指定工作表名称
                    .doWrite(planVos); // 写入数据到Excel文件

        } catch (Exception e) {
            log.error("导出过程中出现错误 {}", e);
            throw new RuntimeException("导出失败,请稍后再试!");
        }
    }

    /**
     * 准备要导出的数据。
     *
     * @param dataFromVo 查询条件
     * @return 要导出的数据列表
     */
    private List<ExportPlanInformationVo> prepareDataForExport(DataFromVo dataFromVo) {
        // 这里需要根据你的业务逻辑去查询数据库或其它数据源,并转换成ExportPlanInformationVo列表
        // 示例代码:
        List<ExportPlanInformationVo> planVos = new ArrayList<>();
        // 填充数据...
        return planVos;
    }
}

        最后 

        上述代码段详细描述了如何在Spring Boot应用程序中集成EasyExcel以实现检查计划信息的导出功能。每个部分都包含了必要的注释和说明,确保开发者能够理解每一行代码的作用以及整个流程的工作原理。此外,还特别注意了对异常情况的处理,保证即使发生错误也能够给出适当的反馈信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2253705.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快速上手 RabbitMQ:使用 Docker 轻松搭建消息队列系统

在现代的分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信、解耦系统组件、提高系统可扩展性和可靠性的重要工具。RabbitMQ 是一个广泛使用的开源消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;&#xf…

ELK的Filebeat

目录 传送门前言一、概念1. 主要功能2. 架构3. 使用场景4. 模块5. 监控与管理 二、下载地址三、Linux下7.6.2版本安装filebeat.yml配置文件参考&#xff08;不要直接拷贝用&#xff09;多行匹配配置过滤配置最终配置&#xff08;一、多行匹配、直接读取日志文件、EFK方案&#…

UE5 像素流进行内网https证书创建

确定证书需求 内网 HTTPS 通信通常需要以下内容&#xff1a; 自签名证书&#xff08;适用于内网环境&#xff0c;不需要通过公开的证书颁发机构 CA&#xff09; 或者通过内部的企业 CA 签发的证书&#xff08;更安全&#xff09;。 生成自签名证书 使用工具&#xff08;如 Ope…

44页PDF | 信息化战略规划标准框架方法论与实施方法(限免下载)

一、前言 这份报告详细介绍了企业信息化战略规划的标准框架、方法论以及实施方法&#xff0c;强调了信息化规划应以业务战略和IT战略为驱动力&#xff0c;通过构筑企业架构&#xff08;EA&#xff09;来连接长期战略和信息化建设。报告提出了信息化规划原则&#xff0c;探讨了…

RNACOS:用Rust实现的Nacos服务

RNACOS是一个使用Rust语言开发的Nacos服务实现&#xff0c;它继承了Nacos的所有核心功能&#xff0c;并在此基础上进行了优化和改进。作为一个轻量级、快速、稳定且高性能的服务&#xff0c;RNACOS不仅包含了注册中心、配置中心和Web管理控制台的功能&#xff0c;还支持单机和集…

任务管理法宝:甘特图详解

在项目管理中&#xff0c;如何清晰、直观地展示项目的进度和任务分配&#xff1f; 甘特图作为一种经典的项目管理工具&#xff0c;提供了有效的解决方案。无论是团队合作还是个人项目管理&#xff0c;甘特图都能帮助你轻松追踪各项任务的进展。今天&#xff0c;我们将详细介绍…

RabbitMQ 客户端 连接、发送、接收处理消息

RabbitMQ 客户端 连接、发送、接收处理消息 一. RabbitMQ 的机制跟 Tcp、Udp、Http 这种还不太一样 RabbitMQ 服务&#xff0c;不是像其他服务器一样&#xff0c;负责逻辑处理&#xff0c;然后转发给客户端 而是所有客户端想要向 RabbitMQ服务发送消息&#xff0c; 第一步&a…

PyQt 中的无限循环后台任务

在 PyQt 中实现一个后台无限循环任务&#xff0c;需要确保不会阻塞主线程&#xff0c;否则会导致 GUI 无响应。常用的方法是利用 线程&#xff08;QThread&#xff09; 或 任务&#xff08;QRunnable 和 QThreadPool&#xff09; 来运行后台任务。以下是一些实现方式和关键点&a…

云计算vsphere 服务器上添加主机配置

这里是esxi 主机 先把主机打开 然后 先开启dns 再开启 vcenter 把每台设备桌面再vmware workstation 上显示 同上也是一样 &#xff0c;因为在esxi 主机的界面可能有些东西不好操作 我们选择主机和集群 左边显示172.16.100.200

Python酷库之旅-第三方库Pandas(255)

目录 一、用法精讲 1206、pandas.tseries.offsets.SemiMonthEnd.is_on_offset方法 1206-1、语法 1206-2、参数 1206-3、功能 1206-4、返回值 1206-5、说明 1206-6、用法 1206-6-1、数据准备 1206-6-2、代码示例 1206-6-3、结果输出 1207、pandas.tseries.offsets.S…

Envoy-istio

最近研究envoy-istio&#xff0c;发现这个博客&#xff0c;觉得很不错&#xff0c;这里记录一下 envoy-istio介绍 envoy-istio - 随笔分类 - yaowx - 博客园 envoy部分七&#xff1a;envoy的http流量管理基础 envoy部分六&#xff1a;envoy的集群管理 envoy部分五&#xff…

甘特图的绘制步骤:教你如何绘制甘特图

甘特图是项目管理中一种极为重要的可视化工具&#xff0c;它以直观的方式展示项目进度&#xff0c;包括任务的开始时间、结束时间、持续时长以及任务之间的先后顺序。在当今的项目管理领域&#xff0c;Excel 和专业的项目管理软件是制作甘特图的两大常用途径&#xff0c;它们各…

C++模拟堆

模板题目 图片来源Acwing 堆的基础知识 代码实现 #include<iostream> #include<algorithm>using namespace std;const int N 1e5 10; int a[N]; int n, m;void down(int u) {int t u;if (2 * u < n && a[2 * u] < a[u]){t 2 * u;}if (2 * u …

牛客linux

1、 统计文件的行数 # 方法 1 wc -l ./nowcoder.txt | awk {print $1} # 方法 2 &#xff0c;awk 可以打印所有行的行号, 或者只打印最后一行 awk {print NR} ./nowcoder.txt |tail -n 1 awk END{print NR} ./nowcoder.txt # 方法 3 grep -c 、-n等等 grep -c "" ./…

【unity小技巧】在 Unity 中,Application获取各种文件路径或访问不同类型的存储路径

文章目录 前言1. **Application.persistentDataPath**2. **Application.dataPath**3. **Application.streamingAssetsPath**4. **Application.temporaryCachePath**5. **Application.consoleLogPath**6. **Application.userDataPath**7. **Application.streamingAssetsPath 与 …

汇编语言学习-二

好吧&#xff0c;已经隔了两天&#xff0c;下完班看了两天&#xff0c;在电脑上装了虚拟机版的MS_DOS,主要是怕折腾坏我的电脑系统&#xff1b; 这个第二天应该是称为第二章更为合适&#xff0c;目前第二章已经看完&#xff0c;基本的命令也是敲了敲&#xff1b; 下面就进行一…

游戏引擎学习第33天

仓库: https://gitee.com/mrxiao_com/2d_game 位置表示的回顾 在之前的工作中&#xff0c;已经实现了将单位从像素空间转移到真实的空间&#xff0c;这样可以确保所有的动作和物体都按米为单位来进行。这个转变让游戏中的物体不再是基于像素的&#xff0c;而是按照真实世界的…

泷羽sec-burp(3)decodor comparer logger模块使用 学习笔记

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

vue-cli创建项目报错:command failed: npm install --loglevel error

网上解决方法有很多&#xff0c;对于我都没用。 最后用这个方法起了作用&#xff1a; 尝试将npm源设置为HTTP&#xff0c;慎用&#xff0c;可能不安全 npm config set registry http://registry.npm.taobao.org/ 改为http就顺利创建项目了。

《船舶物资与市场》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《船舶物资与市场》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《船舶物资与市场》级别&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a;中国船舶集团有限公司 主办单…