Apache POI 实现 Excel 表格下载
这里以苍穹外卖中数据导出功能为例,记录下 Apache POI 导出 Excel 表格的过程。

首先在 pom.xml 中导入相关依赖
<!-- poi 用于操作 excel 表格-->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId></dependency>
controller层
注意方法中的参数 response, service层定义输出流对象要用。
@RestController
@RequestMapping("/admin/report")
@Slf4j
public class ReportController {@GetMapping("/export")@ApiOperation("/导出运营报表")public void exportExcel(HttpServletResponse response){// 注意这里的参数 response, service层定义输出流对象要用。reportService.exportExcel(response);}
}
Service层
定义输出流对象时要用 response 去定义,不是直接 new FileOutputStream()
在得到模板文件时候,注意新建的文件夹在resource下,不要写错,刚开始定义的文件夹名字叫 template, 没加字母 ‘s’,一直获取不到模板文件,正确的应该叫 templates
@Service
public class ReportServiceImpl implements ReportService {@Overridepublic void exportExcel(HttpServletResponse response) {// 得到最近三十天的起止日期LocalDate beginTime = LocalDate.now().minusDays(30);LocalDate endTime = LocalDate.now().minusDays(1);BusinessDataVO businessDataVo = workspaceService.getBusinessData(LocalDateTime.of(beginTime, LocalTime.MIN), LocalDateTime.of(endTime, LocalTime.MAX));// 得到模板文件InputStream in = this.getClass().getClassLoader().getResourceAsStream("templates/运营数据报表模板.xlsx");try {XSSFWorkbook excel = new XSSFWorkbook(in);// 写入时间XSSFSheet sheet = excel.getSheetAt(0);sheet.getRow(1).getCell(1).setCellValue("时间:" + beginTime + "~" + endTime);// 写入概览数据sheet.getRow(3).getCell(2).setCellValue(businessDataVo.getTurnover());sheet.getRow(3).getCell(4).setCellValue(businessDataVo.getOrderCompletionRate());sheet.getRow(3).getCell(6).setCellValue(businessDataVo.getNewUsers());sheet.getRow(4).getCell(2).setCellValue(businessDataVo.getValidOrderCount());sheet.getRow(4).getCell(4).setCellValue(businessDataVo.getUnitPrice());// 填充明细数据for (int i = 0; i < 30; i++) {LocalDate date = beginTime.plusDays(i);BusinessDataVO businessData = workspaceService.getBusinessData(LocalDateTime.of(date, LocalTime.MIN), LocalDateTime.of(date, LocalTime.MAX));XSSFRow row = sheet.getRow(7 + i);row.getCell(1).setCellValue(date.toString());row.getCell(2).setCellValue(businessData.getTurnover());row.getCell(3).setCellValue(businessData.getValidOrderCount());row.getCell(4).setCellValue(businessData.getOrderCompletionRate());row.getCell(5).setCellValue(businessData.getUnitPrice());row.getCell(6).setCellValue(businessData.getNewUsers());}// 输出流下载文件ServletOutputStream out = response.getOutputStream();excel.write(out);// 关闭资源out.flush();out.close();excel.close();} catch (IOException e) {e.printStackTrace();} finally {try {in.close();} catch (IOException e) {e.printStackTrace();}}}}
实现效果

相关文章:
Apache POI 实现 Excel 表格下载
这里以苍穹外卖中数据导出功能为例,记录下 Apache POI 导出 Excel 表格的过程。 首先在 pom.xml 中导入相关依赖 <!-- poi 用于操作 excel 表格--> <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId&…...
大华嵌入式面试题大全及参考答案(2万字长文)
目录 在C语言中,static 关键字有哪些主要用途? static 修饰的全局变量与普通全局变量有什么区别? 为什么要在嵌入式系统中使用 static 修饰函数? 虚函数与纯虚函数了解么? strcpy 给你加结束符吗,还是要自己加? select 的作用是什么,它和 epoll 的区别? map 与…...
C语言——查漏补缺
前言 本篇博客主要记录一些C语言的遗漏点,完成查漏补缺的工作,如果读者感兴趣,可以看看下面的内容。都是一些小点,下面进入正文部分。 1. 字符汇聚 编写代码,演示多个字符从两端移动,向中间汇聚 #inclu…...
Python | Leetcode Python题解之第328题奇偶链表
题目: 题解: class Solution:def oddEvenList(self, head: ListNode) -> ListNode:if not head:return headevenHead head.nextodd, even head, evenHeadwhile even and even.next:odd.next even.nextodd odd.nexteven.next odd.nexteven even…...
吉瑞外卖笔记
1.项目整体搭建 这里用到的是springboot3mybatisplus 1.1数据库搭建 整体表搭建,这里我是直接用的老师给的数据库 1.2maven项目搭建 依赖 这两个jar包第一次用,记录一下 fastjson json处理,可将对象转化为json形式 可将对象中的属性…...
Perl套接字编程指南:构建网络通信应用
摘要 Perl是一种功能强大的脚本语言,广泛应用于系统管理、网络编程等多种场景。Perl的套接字编程能力允许开发者创建客户端和服务器端的网络应用。本文将详细介绍Perl中套接字的使用,包括基础概念、API的使用,以及构建简单客户端和服务器的示…...
达梦数据库(十) -------- mybatis-plus 整合达梦时,自动生成的 sql 语句报错
一丶【问题描述】: mybatis-plus 整合达梦时,应用系统项目的 sql 语句中包含数据库关键字,导致 mybatis-plus 自动生成的 sql 语句会报错,如下图所示: 二丶【问题解决】: 问题原因:mybatis-pl…...
停止项目大小调整,开始搜索层自动缩放!
作者:来自 Elastic Matteo Piergiovanni,John Verwolf 我们新的 serverless 产品的一个关键方面是允许用户部署和使用 Elastic,而无需管理底层项目节点。为了实现这一点,我们开发了搜索层自动扩展,这是一种根据我们将在…...
VScode的环境编译器选择
按快捷键 Ctrl Shift P 选择即可...
在Linux中通过docker安装和配置supervisor进程守护
先在Linux中安装docker,然后在docker中安装appnode,并进行docker网络端口映射。接着登录appnode面板安装supervisor。 supervisor用于守护进程,在进程意外终止后将其重启。 supervisor没有监听内部程序和自动重启的功能。 docker安装 第一…...
CanMV-K230自学笔记系列(不定期更新)
笔记内容主要为CanMV-K230的学习过程,目前陆续有新的k230开发板 CanMV-K230 V1.0 V1.1(已上市) CanMV-K230-01Studio(刚上市) DshanPI-CanMV K230(刚上市) BPI-CanMV-K230D-Zero(待…...
[GXYCTF2019]禁止套娃-使用无参数读文件
点开靶场 发现源码、以及抓包啥都看不出来 用dirsearch扫描发现是git源码泄露,用githack获取源码 查看源码发现最终目标要执行eval($_GET[exp]) 要执行eval就要通过这些正则,第一个正则匹配不分大小写的php伪协议之类的 重点是第二个正则 preg_repl…...
SpringBoot+MyBatis模板
SpringBootMyBatis模板见附件...
Springboot 定时任务 @EnableScheduling @Scheduled
EnableScheduling 是Spring框架中的一个注解,它用于开启基于注解的任务调度支持。当你在你的Spring应用程序中使用这个注解时,它允许你通过Scheduled注解来配置和执行定时任务。 以下是如何使用 EnableScheduling 的基本步骤: 1. **添加Ena…...
STM32F407ZET6使用LCD(9341)
1.原理图 屏幕是中景园2.8寸液晶屏,9341驱动不带触摸屏版本 2.STM32CUBEMX配置 3.编写驱动程序...
动手学深度学习7.3 网络中的网络(NiN)-笔记练习(PyTorch)
以下内容为结合李沐老师的课程和教材补充的学习笔记,以及对课后练习的一些思考,自留回顾,也供同学之人交流参考。 本节课程地址:26 网络中的网络 NiN【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址:7.3. 网络…...
SQL语言-select的使用方法
select语法的使用(SQLyog) 设定查询结果返回的行数 #设定查询结果返回的行数,需要使用limit,指定返回的行数 #格式:select 列名 from 表名 limit n; #n代表限定的行数 SELECT stu_name FROM student LIMIT 3;#格式&a…...
深入理解Python中的排序算法:快速排序与归并排序实现
深入理解Python中的排序算法:快速排序与归并排序实现 排序是计算机科学中一个基本而重要的操作,几乎在所有的编程任务中都会遇到。Python提供了内置的排序函数,但了解排序算法的实现原理对于提升编程能力和解决问题的能力至关重要。本文将深入探讨两种经典的排序算法:快速…...
Linux基础命令 ② 未完成
linux系统目录结构 解释 bin: 包含基本的可执行二进制文件,供所有用户使用。 boot: 存储操作系统启动所需的关键文件,如内核和初始化 RAM 磁盘(initramfs)。 dev: 包含设备节点,表示物理设备或虚拟设备。 etc: 存储…...
怎么加密文件?分享文件加密四个方法,2024新版操作教程,教你搞定!
数据的安全性与隐私保护显得尤为重要。 无论是个人敏感信息、企业商业机密还是创意作品,文件加密都是保障其不被未授权访问的重要手段。 本文将为您详细介绍四种文件加密方法,并附上2024年新版操作教程,助您轻松搞定文件加密,守护…...
暗黑3自动化工具终极指南:如何用智能技能宏提升游戏效率
暗黑3自动化工具终极指南:如何用智能技能宏提升游戏效率 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper D3KeyHelper是一款专为暗黑破坏神…...
深刻理解智能指针特性
文章目录RAII思想unique_ptr 独占型shared_ptr 共享型weak_ptr 弱引用型总结RAII思想 RAII:资源获取即初始化—>把资源的生命周期绑定到栈上对象的生命周期,栈上对象离开作用域就自动销毁了 对象构造,拿到资源对象析构,释放资…...
ble sig mesh消息格式分析
蓝牙 Mesh (Bluetooth SIG Mesh) 的数据格式采用分层结构,每一层都有其特定的数据单元和职责 一.承载层 (Bearer Layer) 承载层定义了消息如何在物理媒介上传输。蓝牙 Mesh 主要支持两种承载方式: 广播承载 (Advertising Bearer): 使用 BLE 广播包来传输…...
金融C++内存池配置的3种致命误配模式(第2种90%团队仍在用,已触发监管问询)
第一章:金融C内存池配置的监管合规性与性能本质在高频交易系统、实时风控引擎及清算结算平台等关键金融基础设施中,C内存池(Memory Pool)不仅是性能优化的核心机制,更是监管审计关注的重点对象。其配置方式直接影响内存…...
塞尔达传说存档定制指南:打造个性化游戏体验
塞尔达传说存档定制指南:打造个性化游戏体验 【免费下载链接】BOTW-Save-Editor-GUI A Work in Progress Save Editor for BOTW 项目地址: https://gitcode.com/gh_mirrors/bo/BOTW-Save-Editor-GUI 在海拉鲁大陆的冒险中,你是否曾因资源匮乏而错…...
ESP32-S3项目实战:从Github下载‘小智’代码到成功烧录的完整避坑记录
ESP32-S3项目实战:从Github下载‘小智’代码到成功烧录的完整避坑记录 在物联网开发领域,ESP32-S3凭借其出色的性能和丰富的外设接口,成为众多开发者的首选。本文将带你完整走一遍从Github获取"小智"开源项目到最终烧录运行的整个流…...
告别枯燥数据:用Rerun给你的NDT-SLAM算法做个酷炫的实时调试界面
告别枯燥数据:用Rerun给你的NDT-SLAM算法做个酷炫的实时调试界面 在激光SLAM算法的开发过程中,调试环节往往是最令人头疼的部分。想象一下,当你正在优化NDT(正态分布变换)算法的参数时,眼前只有终端不断刷新…...
2026行李箱推荐别乱买!唯尊、海澜之家、森马、外交官、珉璐保罗五款横评
对于技术从业者而言,行李箱不仅是装载衣物的容器,更是保护精密电子设备、应对高频差旅与跨城迁移的可靠装备。无论是前往异地调试系统、参加技术峰会,还是举家搬迁,一个设计合理、性能可靠的行李箱能显著提升出行效率与体验。本文…...
高效掌控Mem Reduct:智能多语言界面切换完全指南
高效掌控Mem Reduct:智能多语言界面切换完全指南 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct 你是否曾…...
避开SNP芯片分型的3个大坑:GenomeStudio聚类分析常见问题解决方案
避开SNP芯片分型的3个大坑:GenomeStudio聚类分析常见问题解决方案 在遗传学研究中,SNP芯片技术因其高通量、低成本的优势,依然是群体遗传学和复杂疾病研究的重要工具。然而,从原始信号到可靠的分型结果,这条路上布满了…...
