全网最细讲解如何实现导出Excel压缩包文件

在这里插入图片描述

写在前面的话

接下来我会使用传统的RESTful风格的方式结合MVC的开发模式给大家介绍一下如何去实现标题的效果。

基本思路讲解

  1. 先从数据库中查询出一组人员信息记录,保存在List list中。
  2. 遍历这个列表,对于每一个人员信息,将其填充到一个Excel模板文件中,生成一个新的Excel文件。这个模板文件在项目的"classpath:excel/demo.xlsx"路径下。填充过程是通过getSheets方法完成的。
  3. 通过传入的InputStream对象(对应Excel模板文件的输入流)创建一个XSSFWorkbook对象,代表整个Excel工作簿。遍历工作簿中的所有工作表(Sheet),对于每一个工作表,遍历其中的所有行(Row),再对每一行中的所有单元格(Cell),进行模板替换。模板替换的过程是:检查当前单元格的类型,如果是字符串类型,检查其中是否包含某个模板标记,如果包含,则替换为对应的人员信息。例如,如果单元格中的文本是"${psnName}",则将其替换为当前人员的名字(t.getSponsorName())。以上过程完成后,返回填充完成的工作簿对象。然后将这个对象写入到一个ByteArrayOutputStream对象中,一起存入列表excelFiles中。
  4. 将所有生成的Excel文件打包成一个zip文件,然后通过HttpServletResponse对象将zip文件写回给客户端

Controller层的代码

/*** <p>*  前端控制器* </p>** @author 舒一笑* @since 2023-09-24*/
@RestController
@RequestMapping("/demo02/personnelInfo")
public class PersonnelInfoController {@Autowiredprivate IPersonnelInfoService service;@PostMapping("/downloadZip")@ApiOperation(value = "个人模板压缩包导出")public void downloadZip(HttpServletResponse response){try {service.downloadZip(response);} catch (Exception e) {e.printStackTrace();}}
}

Service层代码

接口层

/*** <p>*  服务类* </p>** @author 舒一笑* @since 2023-09-24*/
public interface IPersonnelInfoService extends IService<PersonnelInfo> {void downloadZip(HttpServletResponse response);
}

实现类层

/*** <p>*  服务实现类* </p>** @author 舒一笑* @since 2023-09-24*/
@Service
public class PersonnelInfoServiceImpl extends ServiceImpl<PersonnelInfoMapper, PersonnelInfo> implements IPersonnelInfoService {@Overridepublic void downloadZip(HttpServletResponse response) {// 数据查询List<PersonnelInfo> list = this.list();// 文件生成List<Map.Entry<String, ByteArrayOutputStream>> excelFiles = new ArrayList<>();list.forEach(t ->{// 读取excel文件try {ClassPathResource classPathResource = new ClassPathResource("excel/demo.xlsx");InputStream inputStream = classPathResource.getInputStream();Workbook workbook = getSheets(t, inputStream);ByteArrayOutputStream excelByteArrayOutputStream = new ByteArrayOutputStream();workbook.write(excelByteArrayOutputStream);// 将每个人的名字作为文件名保存
//                SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");String format = formatter.format(t.getCreateTime());String fileName = t.getSponsorName() + "-"+format;excelFiles.add(new AbstractMap.SimpleEntry<>(fileName, excelByteArrayOutputStream));inputStream.close();excelByteArrayOutputStream.close();} catch (FileNotFoundException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}});// 压缩导出try {response.setContentType("application/zip");String fileName = URLEncoder.encode("压缩包导出","UTF-8");response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".zip");ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());for (int i = 0; i < excelFiles.size(); i++) {Map.Entry<String, ByteArrayOutputStream> excelFileEntry = excelFiles.get(i);ZipEntry entry = new ZipEntry(excelFileEntry.getKey() + ".xlsx");zos.putNextEntry(entry);zos.write(excelFileEntry.getValue().toByteArray());zos.closeEntry();excelFileEntry.getValue().close();}zos.finish();zos.close();} catch (IOException e) {throw new RuntimeException(e);}}/*** 模板替换* @param t* @param inputStream* @return* @throws IOException*/private static Workbook getSheets(PersonnelInfo t, InputStream inputStream) throws IOException {Workbook workbook = new XSSFWorkbook(inputStream);// 遍历所有的sheetIterator<Sheet> sheetIterator = workbook.sheetIterator();while (sheetIterator.hasNext()) {Sheet sheet = sheetIterator.next();// 遍历sheet中所有的行Iterator<Row> rowIterator = sheet.rowIterator();while (rowIterator.hasNext()) {Row row = rowIterator.next();// 遍历行中所有的单元格Iterator<Cell> cellIterator = row.cellIterator();while (cellIterator.hasNext()) {Cell cell = cellIterator.next();// 如果单元格类型是字符串,则查找并替换if (cell.getCellType() == CellType.STRING && cell.getStringCellValue().contains("${psnName}")) {String newCellValue = cell.getStringCellValue().replace("${psnName}", t.getSponsorName()!= null ? t.getSponsorName() : "");cell.setCellValue(newCellValue);} else if (cell.getCellType() == CellType.STRING && cell.getStringCellValue().contains("${psnNum}")) {String newCellValue = cell.getStringCellValue().replace("${psnNum}", t.getSponsorName()!= null ? t.getSponsorName() : "");cell.setCellValue(newCellValue);} else if (cell.getCellType() == CellType.STRING && cell.getStringCellValue().contains("${personTypeName}")) {String newCellValue = cell.getStringCellValue().replace("${personTypeName}", t.getSponsorName() != null ? t.getSponsorName() : "");cell.setCellValue(newCellValue);} else if (cell.getCellType() == CellType.STRING && cell.getStringCellValue().contains("${posName}")) {String newCellValue = cell.getStringCellValue().replace("${posName}", t.getSponsorName() != null ? t.getSponsorName() : "");cell.setCellValue(newCellValue);} else if (cell.getCellType() == CellType.STRING && cell.getStringCellValue().contains("${suitUnitName}")) {String newCellValue = cell.getStringCellValue().replace("${suitUnitName}", t.getSponsorName()!= null ? t.getSponsorName() : "");cell.setCellValue(newCellValue);} else if (cell.getCellType() == CellType.STRING && cell.getStringCellValue().contains("${orgName}")) {String newCellValue = cell.getStringCellValue().replace("${orgName}", t.getSponsorName()!= null ? t.getSponsorName() : "");cell.setCellValue(newCellValue);} else if (cell.getCellType() == CellType.STRING && cell.getStringCellValue().contains("${periodName}")) {String newCellValue = cell.getStringCellValue().replace("${periodName}", t.getSponsorName()!= null ? t.getSponsorName() : "");cell.setCellValue(newCellValue);} else if (cell.getCellType() == CellType.STRING && cell.getStringCellValue().contains("${interviewTime}")) {// 定义日期时间格式DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
//                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");String newCellValue = cell.getStringCellValue().replace("${interviewTime}", formatter.format(t.getCreateTime())!= null ? formatter.format(t.getCreateTime()) : "");cell.setCellValue(newCellValue);} else if (cell.getCellType() == CellType.STRING && cell.getStringCellValue().contains("${performanceReview}")) {String newCellValue = cell.getStringCellValue().replace("${performanceReview}", t.getSponsorName()!= null ? t.getSponsorName() : "");cell.setCellValue(newCellValue);} else if (cell.getCellType() == CellType.STRING && cell.getStringCellValue().contains("${improvePropose}")) {String newCellValue = cell.getStringCellValue().replace("${improvePropose}", t.getSponsorName()!= null ? t.getSponsorName() : "");cell.setCellValue(newCellValue);}else if (cell.getCellType() == CellType.STRING && cell.getStringCellValue().contains("${improvePlan}")) {String newCellValue = cell.getStringCellValue().replace("${improvePlan}", t.getSponsorName()!= null ? t.getSponsorName() : "");cell.setCellValue(newCellValue);}}}}return workbook;}}

模板展示

部分业务信息我直接模糊掉了,希望小伙伴理解。
在这里插入图片描述

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

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

相关文章

BIOMOD2模型、MaxEnt模型物种分布模拟,生物多样性生境模拟,论文写作

①基于R语言BIOMOD2模型的物种分布模拟实践技术应用 针对我国目前已有自然保护区普遍存在保护目标不明确、保护成效低下和保护空缺依然存在等问题&#xff0c;科学的鉴定生物多样性热点保护区域与保护空缺显得刻不容缓。 BIOMOD2提供运行多达10余种物种分布模拟模型&#xff0c…

工具篇 | Gradle入门与使用指南

介绍 1.1 什么是Gradle&#xff1f; Gradle是一个开源构建自动化工具&#xff0c;专为大型项目设计。它基于DSL&#xff08;领域特定语言&#xff09;编写&#xff0c;该语言是用Groovy编写的&#xff0c;使得构建脚本更加简洁和强大。Gradle不仅可以构建Java应用程序&#x…

基于海康Ehome/ISUP接入到LiveNVR实现海康摄像头、录像机视频统一汇聚,做到物联网无插件直播回放和控制

LiveNVR支持海康NVR摄像头通EHOME接入ISUP接入LiveNVR分发视频流或是转GB28181 1、海康 ISUP 接入配置2、海康设备接入2.1、海康EHOME接入配置示例2.2、海康ISUP接入配置示例 3、通道配置3.1、直播流接入类型 海康ISUP3.2、海康 ISUP 设备ID3.3、启用保存3.4、接入成功 4、相关…

PREEvision Client 10.8.0

PREEvision Client 10.6.0 2692407267qq.com&#xff0c;更多内容请见http://user.qzone.qq.com/2692407267/

WebGL HUD(平视显示器)

目录 HUD&#xff08;平视显示器&#xff09; 如何实现HUD 示例程序&#xff08;HUD.html&#xff09; 示例程序&#xff08;HUD.js&#xff09; 代码详解 在网页文字上方显示三维物体 代码详解 HUD&#xff08;平视显示器&#xff09; 平视显示器&#xff08;head…

服务器迁移:无缝过渡指南

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

华为数通方向HCIP-DataCom H12-821题库(单选题:361-380)

第361题 如图所示是一台路由器的BGP输出信息。那么以下关于这段信息的描述,错误的是哪一项? <Huawei>display bgp error Error Type: Peer Error Peer Address:10.1.1.2 VRFName:Public Error Info: Router-ID conflictA、该路由器邻居地址是10.1.1.2 B、Error Type显…

AVR 单片机 调试环境 JTAG MKII

注意 驱动 的厂家: 如果驱动备改变为其他厂家的驱动 就与 AVR Studio7不兼容 保证驱动选择正确是 能够使用硬件调试的关键 如果驱动不对&#xff0c;使用 USB驱动修改工具 修改 比如 UsbDriverTool.exe

App Store上线规范及流程

上线一个应用到 App Store 需要遵循苹果的规范和流程&#xff0c;以确保应用的质量和安全性。以下是上线应用到 App Store 的一般规范和流程&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 开发和…

【新版】系统架构设计师 - 案例分析 - 数据库设计

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 案例分析 - 数据库设计数据库基础数据库设计概述E-R模型概念结构设计逻辑结构设计规范化&#xff08;范式&#xff09;反规范化技术数据库事务并发控制索引视图物化视图存储过程触发器数据库性能优…

linux用户和权限命令学习记录

文章目录 版权声明root用户&#xff08;超级管理员&#xff09;su和exit命令sudo命令为普通用户配置sudo认证 用户、用户组管理用户组管理getent命令 查看权限控制认知权限信息 修改权限控制chmod修改文件、文件夹的权限权限的数字序号chown修改所属用户、用户组 版权声明 本博…

虚幻4学习笔记(15)读档 和存档 的实现

虚幻4学习笔记 读档存档 B站UP谌嘉诚课程&#xff1a;https://www.bilibili.com/video/BV164411Y732 读档 添加UI蓝图 SaveGame_UMG 添加Scroll Box 修改Scrollbar Thickness滚动条厚度 15 15 勾选 is variable 添加text 读档界面 添加背景模糊 添加UI蓝图 SaveGame_Slot …

工业通讯Modbus简介(一)

写在前面&#xff1a; 昨日雨&#xff0c;在床上睡觉许久&#xff0c;放空身体精神。至傍晚&#xff0c;雨仍淅淅沥沥&#xff0c;拆半年前行李&#xff0c;取煮水锅&#xff0c;欲食火锅。与老王一起&#xff0c;美哉。 今日团建&#xff0c;我队共10个老铁&#xff0c;拔河获…

Qt地铁智慧换乘系统浅学( 三 )最少路径和最少换乘实现

本算法全都基于广度优先 概念最短路径实现所用容器算法思路 最少换乘实现所需容器算法思路 成果展示代码实现判断是最短路径还是最少换乘最短路径代码实现最少换乘代码实现根据所得List画出线路 ui界面的维护&#xff08;前提条件&#xff09;界面初始化combox控件建立槽函数 概…

ROS 2官方文档(基于humble版本)学习笔记(三)

ROS 2官方文档&#xff08;基于humble版本&#xff09;学习笔记&#xff08;三&#xff09; 理解参数&#xff08;parameter&#xff09;ros2 param listros2 param getros2 param setros2 param dumpros2 param load在节点启动时加载参数文件 理解动作&#xff08;action&…

【C语言精髓 之 指针】指针*、取地址、解引用*、引用

/*** file * author jUicE_g2R(qq:3406291309)————彬(bin-必应)* 一个某双流一大学通信与信息专业大二在读 * copyright 2023.9* COPYRIGHT 原创技术笔记&#xff1a;转载需获得博主本人同意&#xff0c;且需标明转载源* language …

ElementUI之登陆+注册->饿了吗完成用户登录界面搭建,axios之get请求,axios之post请求,跨域,注册界面

饿了吗完成用户注册登录界面搭建axios之get请求axios之post请求跨域 1.饿了吗完成用户注册登录界面搭建 将端口号8080改为8081 导入依赖&#xff0c;在项目根目录使用命令npm install element-ui -S&#xff0c;添加Element-UI模块 -g&#xff1a;将依赖下载node_glodal全局依…

2023 “华为杯” 中国研究生数学建模竞赛(B题)深度剖析|数学建模完整代码+建模过程全解全析

华为杯数学建模B题 当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2021年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看研赛的B题呀~&#xff01; 问…

数据结构 | 队列

队列&#xff08;First In First Out&#xff09; 顺序队列 #include <iostream>class MyQueue {private:// store elementsvector<int> data; // a pointer to indicate the start positionint p_start; public:MyQueue() {p_start 0;}/** In…

如何从外网远程控制企业内网电脑?

在企业中&#xff0c;保护公司机密和数据安全是至关重要的。为了确保员工在使用公司电脑时遵守相关规定&#xff0c;许多公司会采取外网监控员工电脑的方法。本文将介绍一些真实有效的方法和具体的操作步骤&#xff0c;以帮助您更好地监控员工电脑。 一、什么是外网监控&#x…