Java套红:指定位置合并文档-NiceXWPFDocument
需求:做个公文系统,需要将正文文档在某个节点点击套红按钮,实现文档套红
试了很多方法,大多数网上能查到但是实际代码不能找到关键方法,可能是跟包的版本有关系,下面记录能用的这个。
一:添加依赖
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version></dependency><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.9.1</version><exclusions><exclusion><artifactId>slf4j-log4j12</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions></dependency><dependency><groupId>e-iceblue</groupId><artifactId>spire.doc</artifactId><version>12.6.2</version></dependency>
二、文档
模板:{{date}}是可以获取到的变量
文档:
三、代码
public static void word2RedDocument(String content, Map<String, Object> data, String destDocx) throws Exception {//模板文件地址String model = "D:\\套红模板.docx";//模板文件 参数填写XWPFTemplate template = XWPFTemplate.compile(model).render(data);//获取模板文件 公文NiceXWPFDocument main = template.getXWPFDocument();//正文文档NiceXWPFDocument sub = new NiceXWPFDocument(new FileInputStream(content));List<XWPFParagraph> paragraphs = main.getParagraphs();NiceXWPFDocument newDoc = new NiceXWPFDocument();for (XWPFParagraph p:paragraphs) {if( null != p && p.getText().contains("正文")){//这里是要去掉正文两个字,自己debug看了索引,为了保险起见应该遍历run判断p.removeRun(0);XWPFRun run = p.createRun();// 合并两个文档到指定位置newDoc = main.merge(Arrays.asList(sub),run);break;}}// 设置页码--开始--没有需求可以删掉XWPFFooter footer = newDoc.createFooter(HeaderFooterType.DEFAULT);//创建一个新的XWPFFooter对象XWPFParagraph paragraph = footer.createParagraph();//创建新的XWPFParagraph对象paragraph.setAlignment(ParagraphAlignment.CENTER);//设置样式居中//设置段落对象XWPFRun runPre = paragraph.createRun();//新的段落对象runPre.setText("- ");XWPFRun run = paragraph.createRun();//新的段落对象CTFldChar fldChar = run.getCTR().addNewFldChar();//新的CTFldChar对象fldChar.setFldCharType(STFldCharType.Enum.forString("begin"));CTText ctText = run.getCTR().addNewInstrText();ctText.setStringValue("PAGE \\* MERGEFORMAT");ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve"));fldChar = run.getCTR().addNewFldChar();fldChar.setFldCharType(STFldCharType.Enum.forString("end"));//设置段落对象XWPFRun runSuf = paragraph.createRun();//新的段落对象runSuf.setText(" -");// 将页脚添加到所有的页面XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(newDoc);headerFooterPolicy.createFooter(STHdrFtr.DEFAULT, new XWPFParagraph[]{paragraph});
// 设置页码--结束--没有需求可以删掉//可以是生成新文档,也可以生成到原来的正文content = "D:\\新文档.docx";// 生成新文档FileOutputStream out = new FileOutputStream(content);newDoc.write(out);newDoc.close();out.close();//doc转pdfdoc2Pdf(content);
// ByteArrayOutputStream os = new ByteArrayOutputStream();
// newDoc.write(os);
// InputStream is = new ByteArrayInputStream(os.toByteArray());
// os.close();}
调用方法测试
public static void main(String[] args) throws Exception {String sourceFile = "D:\\模板.docx";String targetFile = "D:\\测试.docx";Map<String, Object> data = new HashMap<>(2);List<String> list = Arrays.asList("技术", "测试", "评选结果", "测试", "评选结果", "测试", "评选结果");StringBuilder builder = new StringBuilder();for (int i =0;i<list.size();i++) {builder.append(list.get(i));if (i != list.size() -1){builder.append(" ");}}data.put("num", "931");data.put("year", "2024");data.put("name", "销售中心销售中心销售中心销售中心销售中心销售中心销售中心销售中心销售中心销售中心销售中心销售中心销售中心销售中心销售中心销售中心销售中心");data.put("keyword",builder );
// data.put("keyword", Arrays.asList("技术","测试","评选结果","测试","评选结果","测试","评选结果"));
// data.put("keyword", Arrays.asList("技术","测试"));data.put("user", "李斯");
// data.put("company", "股份有限公司技术股份有限公司");data.put("date", getChineseDate());word2RedDocument(targetFile,data,"新文档.docx");}
转换时间的方法
public static String getChineseDate() {Calendar cal = Calendar.getInstance();SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日", Locale.CHINA);String date = sdf.format(cal.getTime());// 将数字转换为汉字String[] chineseNumbers = {"〇", "一", "二", "三", "四", "五", "六", "七", "八", "九"};StringBuilder chineseDate = new StringBuilder();for (int i = 0; i < date.length(); i++) {if(i==4 || i==7 || i==10){chineseDate.append(date.charAt(i));} else {int number = Character.getNumericValue(date.charAt(i));if(i==5 || i==8 ){if(number==0){continue;}}chineseDate.append(chineseNumbers[number]);}}return chineseDate.toString();}
执行方法:
结果文档如下:
XWPFDocument类相关:
相关文章:

Java套红:指定位置合并文档-NiceXWPFDocument
需求:做个公文系统,需要将正文文档在某个节点点击套红按钮,实现文档套红 试了很多方法,大多数网上能查到但是实际代码不能找到关键方法,可能是跟包的版本有关系,下面记录能用的这个。 一:添加依…...

【操作系统】进程管理——进程的同步与互斥(个人笔记)
学习日期:2024.7.8 内容摘要:进程同步/互斥的概念和意义,基于软/硬件的实现方法 进程同步与互斥的概念和意义 为什么要有进程同步机制? 回顾:在《进程管理》第一章中,我们学习了进程具有异步性的特征&am…...

Qt:13.多元素控件(QLinstWidget-用于显示项目列表的窗口部件、QTableWidget- 用于显示二维数据表)
目录 一、QLinstWidget-用于显示项目列表的窗口部件: 1.1QLinstWidget介绍: 1.2属性介绍: 1.3常用方法介绍: 1.4信号介绍: 1.5实例演示: 二、QTableWidget- 用于显示二维数据表: 2.1QTabl…...

恢复出厂设置手机变成砖
上周,许多Google Pixel 6(6、6a、6 Pro)手机用户在恢复出厂设置后都面临着设备冻结的问题。 用户说他们在下载过程中遇到了丢失 tune2fs 文件的错误 。 这会导致屏幕显示以下消息:“Android 系统无法启动。您的数据可能会被损坏…...
解决IntelliJ IDEA中克隆GitHub项目不显示目录结构的问题
前言 当您从GitHub等代码托管平台克隆项目到IntelliJ IDEA,却遇到项目目录结构未能正确加载的情况时,不必太过困扰,本文将为您提供一系列解决方案,帮助您快速找回丢失的目录视图。 1. 调整Project View设置 操作步骤࿱…...

Git错误分析
错误案例1: 原因:TortoiseGit多次安装导致,会记录首次安装路径,若安装路径改变,需要配置最后安装的路径。...
pom.xml中重要标签介绍
在 Maven 项目中,pom.xml 文件是项目对象模型(POM)的配置文件,它定义了项目的依赖关系、插件、构建配置等。以下是 pom.xml 文件中一些重要的标签及其作用: <modelVersion>: 定义 POM 模型的版本。当…...
大模型日报 2024-07-11
大模型日报 2024-07-11 大模型资讯 CVPR世界第二仅次Nature!谷歌2024学术指标出炉,NeurIPS、ICLR跻身前十 谷歌2024学术指标公布,CVPR位居第二,超越Science仅次于Nature。CVPR、NeurIPS、ICLR三大顶会跻身TOP 10。 CVPR成全球第二…...

Redis基础教程(十六):Redis Stream
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝Ὁ…...

机器学习筑基篇,容器调用显卡计算资源,Ubuntu 24.04 快速安装 NVIDIA Container Toolkit!...
[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] Ubuntu 24.04 安装 NVIDIA Container Toolkit 什么是 NVIDIA Container Toolkit? 描述:NVIDIA Container Toolkit(容器工具包)使用户能够构建和运行 GPU 加速的容器,该工具包括一个容器运行时库和实用程序,用于自动…...
全网第一个java链接阿里云redis并可操作
添加依赖 redis.clients jedis 5.1.2 然后通过 JedisPool pool new JedisPool(host3, 6379); Jedis jedis pool.getResource(); jedis.auth(“username”,“password”); jedis.set(“ab”,“ab”); System.out.println(jedis.get(“ab”)); 即可链接成功,成功…...
Mysql ORDER BY是否走索引?
在 MySQL 中,ORDER BY 子句是否使用索引取决于多种因素,包括查询的具体情况、索引的类型和结构、查询中的其他条件等。 使用索引的情况 单列索引和 ORDER BY: 当 ORDER BY 子句中的列有单列索引时,MySQL 可以利用该索引来加速排序…...

图纸文档管理新篇章:陕西航沣与三品软件合作 优化研发流程
近日,陕西航沣新材料有限公司与三品软件正式达成合作协议,共同打造高效、智能的图纸文档管理平台。此次合作旨在赋能陕西航沣在高性能碳纤维增强纸基摩擦材料领域的创新与发展,提升企业的核心竞争力。 客户简介 陕西航沣新材料有限公司&…...

链式队列的实现
//1:创建循环队列 //2:判空 //4:入队 //5:出队 //6:遍历 //7:队列长度 //8:销毁 main.c #include"loop.h" int main(int argc, const char *argv[]) {loop_p Lloop_create();//创建loop_empty(L);//判空loop_length(L);//长度loop_input(L,10);//入队loop_input(L,…...

深入剖析3D企业云展厅的价值,多维展示和精准营销的创新结合
一、3D企业云展厅的多维展示优势 1、全方位展示企业展品 3D企业云展厅通过3D建模技术为企业提供了全方位的展品展示平台。相比于传统平面的图片或视频,3D展厅能够让用户以任意角度观看展品,仿佛置身于真实展厅中。这种全方位展示不仅能够增加展品的真实…...

前台线程和后台线程(了解篇)
在多线程编程中,理解线程的不同类型对于编写高效、稳定的程序至关重要。特别地,前台线程(Foreground Threads)与后台线程(Background Threads)在行为上有着根本的区别,这些区别直接影响到程序的…...
最强文本编辑器 VIM 指令大全
Vim 是从 Vi 编辑器发展出来的一款极其强大的文本编辑器,它保留了 Vi 编辑器的所有功能,并添加了许多新特性。Vim 具有代码补全、语法高亮、错误跳转、批量化处理等编辑功能,还支持异常丰富的插件扩展,且整个编辑全程可通过键盘完…...

卤味江湖中,周黑鸭究竟该抓住什么赛点?
近年来,卤味江湖的决斗从未停止。 随着休闲卤味、佐餐卤味等细分赛道逐渐形成,“卤味三巨头”(周黑鸭、绝味食品、煌上煌)的牌桌上有了更多新对手,赛道变挤了,“周黑鸭们”也到了转型关键期。 这个夏天&a…...

2024年西安铁一中集训DAY1---- 杂题选讲
文章目录 牛客练习赛125 E 联谊活动(枚举,分讨)牛客练习赛125 F 玻璃弹珠(类莫队,离线询问,数据结构)2024ccpc长春邀请赛 D Parallel Lines(随机化)2024ccpc长春邀请赛 E…...

Python爬虫:BeautifulSoup的基本使用方法!
1.简介 Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析“标签树”等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。 Beautiful Soup…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...