poi处理多选框进行勾选操作下载word以及多word文件压缩
一、场景
将数据导出word后且实现动态勾选复选框操作
eg: word模板
导出后效果
(根据数据动态勾选复选框)
二、解决方案及涉及技术
① 使用poi提供的库进行处理(poi官方文档)
② 涉及依赖
<!-- excel工具 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>${poi.version}</version></dependency>
<!-- pio处理word文件操作复选框--><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.9.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><version>1.4</version></dependency>
三、代码实现
word单个/批量下载工具类
在操作模板时,我们需先将写入word模板的数据构建为Map
① 数据封装处理(TrafficBlock 对象)
public Map buildTrafficDataForm(TrafficBlock trafficBlock){BlockDownLoadDataForm dataForm = new BlockDownLoadDataForm();BeanUtils.copyProperties(trafficBlock, dataForm);dataForm.setDirection(EventInfoDirection.getDirection(trafficBlock.getDirection()).getMessage());// 涉桥/涉隧dataForm.setInvolveNo(String.valueOf(trafficBlock.getInvolveNumber()));// 模板数据处理dataForm.setStartToEndPile("K"+trafficBlock.getStartKilometersPile()+"+"+trafficBlock.getStartHectometerPile()+"至"+trafficBlock.getEndKilometersPile()+"+"+trafficBlock.getEndHectometerPile());dataForm.setAffectedStartToEndPile("K"+trafficBlock.getAffectedStartKilometersPile()+"+"+trafficBlock.getAffectedStartHectometerPile()+"至"+trafficBlock.getAffectedEndKilometersPile()+"+"+trafficBlock.getAffectedEndHectometerPile());// 阻断类别(突发类才会有)String blockCategory = String.valueOf(trafficBlock.getBlockCategory());// checkBox处理if("1".equals(trafficBlock.getBlockNature())){// 计划类dataForm.setPlanCheckBox(String.valueOf(trafficBlock.getBlockType()));}else{ //突发类if("1".equals(blockCategory)){// 地质灾害dataForm.setGeologyCheckBox(String.valueOf(trafficBlock.getBlockType()));}else if("2".equals(blockCategory)){// 重大灾害dataForm.setGreatCheckBox(String.valueOf(trafficBlock.getBlockType()));}else if("3".equals(blockCategory)){// 气象灾害dataForm.setWeatherCheckBox(String.valueOf(trafficBlock.getBlockType()));}else if("4".equals(blockCategory)){// 事故灾害dataForm.setAccidentCheckBox(String.valueOf(trafficBlock.getBlockType()));}else if("5".equals(blockCategory)){// 其他dataForm.setOtherCheckBox(String.valueOf(trafficBlock.getBlockType()));}}return convertTrafficBlockToMap(dataForm);
}
② dataMap构建工具
public static Map<String, String> convertTrafficBlockToMap(BlockDownLoadDataForm downLoadDataForm) {Map<String, String> valueMap = new HashMap<>();Class<?> clazz = downLoadDataForm.getClass();for (Field field : clazz.getDeclaredFields()) {field.setAccessible(true);try {Object fieldValue = field.get(downLoadDataForm);if (fieldValue == null) {valueMap.put(field.getName(), "");} else {valueMap.put(field.getName(), String.valueOf(fieldValue));}} catch (IllegalAccessException e) {e.printStackTrace();}}return valueMap;}
此处需要注意在多个文件下载时,每次向ZipOutputStream 写入字节流时,需要为每个生成的 Word 文件提供一个唯一的名称(写入的文件名必须不一致)否则会导致每次写入的流覆盖之前的,导致浏览器不能正确解析,进而下载失败!!!
// *****(Word单个/批量下载)public void generateTrafficWordForm(HttpServletResponse response, List<Long> ids) throws IOException {List<TrafficBlock> trafficBlocks = trafficBlockMapper.selectList(new LambdaQueryWrapper<TrafficBlock>().in(TrafficBlock::getId, ids));if (ids.size() == 1){// 单个下载Map dataMap = buildTrafficDataForm(trafficBlocks.get(0));response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=***记录表.docx");response.setContentType(String.valueOf(MediaType.APPLICATION_OCTET_STREAM));try (OutputStream out = response.getOutputStream()) {writeTrafficWordForm(dataMap, out);}}else if (ids.size() > 1) {// 多个文件压缩下载response.setContentType("application/zip");response.setCharacterEncoding("UTF-8");response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("交通阻断.zip", "UTF-8"));try (ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream())) {for (TrafficBlock trafficBlock : trafficBlocks) {Map dataMap = buildTrafficDataForm(trafficBlock);ByteArrayOutputStream wordStream = new ByteArrayOutputStream();writeTrafficWordForm(dataMap, wordStream);// 为每个文件生成唯一的名称String uniqueFileName = "*****_" + trafficBlock.getId() + ".docx";zipOut.putNextEntry(new ZipEntry(uniqueFileName));zipOut.write(wordStream.toByteArray());zipOut.closeEntry();}} catch (IOException e) {throw new RuntimeException(e);}}}
poi工具类读取模板处理数据工具:
public void writeTrafficWordForm(Map<String, String> dataMap,OutputStream outputStream) {/*** 复选框* *///需要循环的表单数据dataMap.put("dataTable", String.valueOf(new ArrayList<>()));ConfigureBuilder configureBuilder = Configure.builder().useSpringEL().bind("dataTable", new HackLoopTableRenderPolicy());Configure config = configureBuilder.build();InputStream is = null;try {// 读取Word模板文件,获取输入流is = new ClassPathResource("template/profile/交通阻断记录表.docx").getInputStream();XWPFTemplate template = XWPFTemplate.compile(is, config).render(dataMap);template.write(outputStream);outputStream.flush();PoitlIOUtils.closeQuietlyMulti(template, outputStream);} catch (IOException e) {log.error("失败!!!!!!", e);} finally {if (null != is) {try {is.close();} catch (IOException e) {log.error("关闭流失败!", e);}}}}
相关文章:

poi处理多选框进行勾选操作下载word以及多word文件压缩
一、场景 将数据导出word后且实现动态勾选复选框操作 eg: word模板 导出后效果(根据数据动态勾选复选框) 二、解决方案及涉及技术 ① 使用poi提供的库进行处理(poi官方文档) ② 涉及依赖 <!-- excel工具 --><depen…...
QT 键值对集合QMap
在QT中,可以使用QMap作为键值对的集合。QMap是Qt的一个模板类,它存储了键值对,并且可以通过键来快速查找值。 导入 #include <QMap> 以下是一些使用QMap的方法: 1.创建并初始化一个 QMap<int, QString> UserDepa…...
NetMQ里Push-Pull模式,消息隔一收一问题小记
问题: 本机环境下,在push端向pull端发送消息的过程中,发现同一个进程里的pusher和puller代码,可以准确地完成收发; 然而,将代码放在两个进程里,将pusher发送的消息从1计数,puller端竟…...
见微知著:Tripo 开创 3D 生成新时代
关于 VAST VAST 成⽴于 2023 年 3 ⽉,是⼀家致⼒于通⽤ 3D 大模型研发的 AI 公司,公司⽬标是通过打造⼤众级别的 3D 内容创作⼯具,建⽴ 3D 的 UGC 内容平台,让基于 3D 的空间成为⽤户体验、内容表达、提升新质⽣产⼒的关键要素。 2024 年初,VAST 推出数⼗亿参数级别的 3…...
消息队列与中间件:Java的秘密传输带
消息队列与中间件技术是分布式系统中的重要组件,它们主要解决应用耦合、异步消息处理、流量削峰等问题,并实现高性能、高可用、可伸缩和最终一致性的架构。 2.1 消息队列的基本概念 消息队列是一种应用程序间传递消息的技术,它允许应用程序发…...

Bytebase 3.1.0 - 通过 Google / GitHub SSO 功能开放给专业版
🚀 新功能 支持在 PostgreSQL DML/DDL 工单中选择执行角色。 在项目设置中增加 PostgreSQL 数据库租户模式配置选项。 在数据库页面和 SQL 编辑器为 ORACLE 数据库展示 package 元数据。 支持为环境配置颜色,方便区分。 新增管理员可关闭数据导出…...

EdgeOne安全专项实践:上传文件漏洞攻击详解与防范措施
靶场搭建 当我们考虑到攻击他人服务器属于违法行为时,我们需要思考如何更好地保护我们自己的服务器。为了测试和学习,我们可以搭建一个专门的靶场来模拟文件上传漏洞攻击。以下是我搭建靶场的环境和一些参考资料,供大家学习和参考࿰…...

k8s部署rocketmq踩坑笔记
给团队部署一个rocketmq4.8.0. k8s上部署的broker,注册到nameserver上是自己的pod ip,导致本机连接到的broker的pod ip,这个ip k8s集群外的机器是无法联通的。 nameserver上注册的是这个pod ipv4 尝试将broker的配置brokerIP1修改为注册到na…...
Docker 通过创建Dockerfile 部署Jar包
1、创建Dockerfile 首先确保centos 安装docker,参考docker安装-CSDN博客 自己找个目录来存放Dockerfile mkdir Dockerfile 2、vim Dockerfile # 使用 OpenJDK 17 基础镜像 FROM jre17:v1.0# 设置工作目录 WORKDIR /app# 暴露端口 EXPOSE 8093# 设置容器内日志目录…...

shell脚本练习
题目 1、编写一个shell 脚本,检测 /tmp/size.log 文件。如果存在,显示它的内容;不存在则创建一个文件,将创建时间写入。 2、编写一个shell 脚本,实现批量添加 20个用户,用户名为user1-20,密码为user 后面跟…...

【计算机网络】lab4 Ipv4(IPV4的研究)
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀计算机网络_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2.…...
Python Json格式数据处理
示例:查看和编辑 JSON 文件的 Python 程序 import json from pprint import pprintdef load_json(file_path):"""加载并解析 JSON 文件。:param file_path: JSON 文件路径:return: 解析后的 JSON 对象(字典或列表)"&quo…...

【声音场景分类--论文阅读】
1.基于小波时频图特征在声音场景分类 基于小波时频图特征在声音场景分类任务中的表现 2.增强增强高效音频分类网络 https://arxiv.org/pdf/2204.11479v5 https://github.com/Alibaba-MIIL/AudioClassfication 音频分类网络如图4所示。在此阶段,主要重点是建立一…...

Web前端界面开发
前沿:介绍自适应和响应式布局 自适应布局:-----针对页面1个像素的变换而变化 就是我们上一个练习的效果 我们的页面效果,随着我们的屏幕大小而发生适配的效果(类似等比例) 如:rem适配 和 vw/vh适配 …...

模式识别与机器学习
文章目录 考试题型零、简介1.自学内容(1)机器学习(2)机器学习和统计学中常见的流程(3)导数 vs 梯度(4)KL散度(5)凸优化问题 2.基本概念3.典型的机器学习系统4.前沿研究方向举例 一、逻辑回归1.线性回归2.逻辑回归3.随堂练习 二、贝叶斯学习基础1.贝叶斯公式2.贝叶斯决策3.分类器…...

eNSP之家----ACL实验入门实例详解(Access Control List访问控制列表)(重要重要重要的事说三遍)
ACL实验(Access Control List访问控制列表)是一种基于包过滤的访问控制技术,它可以根据设定的条件对接口上的数据包进行过滤,允许其通过或丢弃。访问控制列表被广泛地应用于路由器和三层交换机。 准备工作 在eNSP里面部署设备&a…...

STM32 I2C硬件配置库函数
单片机学习! 目录 前言 一、I2C_DeInit函数 二、I2C_Init函数 三、I2C_StructInit函数 四、I2C_Cmd函数 五、I2C_GenerateSTART函数 六、I2C_GenerateSTOP函数 七、I2C_AcknowledgeConfig函数 八、I2C_SendData函数 九、I2C_ReceiveData函数 十、I2C_Sen…...

特制一个自己的UI库,只用CSS、图标、emoji图 第二版
图: 代码: index.html <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>M…...
Hologres 介绍
Hologres 是 阿里云 提供的一款 实时数据分析平台,它结合了数据仓库(Data Warehouse)和流式计算(Stream Processing)的优势,专为大规模数据分析和实时数据处理而设计。Hologres 基于 PostgreSQL 构建&#…...

oracle闪回表
文章目录 闪回表案例1:(未清理回收站时的闪回表--成功)案例2(清理回收站时的闪回表--失败)案例3:彻底删除表(不经过回收站--失败)案例4:闪回表之后重新命名新表总结1、删…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...