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…...
机械臂空间直线圆弧圆插补代码介绍
【机械臂空间直线&圆弧&圆插补】 代码主要功能: 1. 正逆运动学解析解; 2. 空间直线、圆弧以及圆插补; 3. 基于Slerp、Nlerp算法的机械臂末端两姿态插补算法; 4. 机械臂空间直线、圆弧以及圆插补。 购前须知: 1. 代码均为个人手写&…...
轻量级加密新选择:tiny-AES-c深度解析
轻量级加密新选择:tiny-AES-c深度解析 【免费下载链接】tiny-AES-c Small portable AES128/192/256 in C 项目地址: https://gitcode.com/gh_mirrors/ti/tiny-AES-c 在嵌入式系统与物联网设备等资源受限环境中,数据安全面临着独特挑战。轻量级AES…...
别再手动量了!用Python+Open3D给BIM模型做‘CT扫描’,自动揪出施工误差(附完整代码)
BIM模型质量检测革命:PythonOpen3D实现毫米级施工误差智能分析 施工现场的质量控制一直是建筑行业的核心痛点。传统靠人工抽检的方式不仅效率低下,还容易遗漏隐蔽问题。想象一下,如果能把BIM模型当作"数字孪生体",用三维…...
护网行动入门指南:零基础也能参与,快速积累网安实战经验
护网行动入门指南:如何参与并积累实战经验 护网行动是国内最高规格的网络安全实战演练,旨在检验企业、单位的网络安全防御能力,现已成为网络安全领域的“实战练兵场”。对计算机专业学生而言,参与护网行动不仅能积累宝贵的实战经…...
WarcraftHelper兼容性技术方案:让经典游戏在现代系统重生的实战指南
WarcraftHelper兼容性技术方案:让经典游戏在现代系统重生的实战指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 1. 兼容性问题的技术根…...
Java Web 入门学习笔记:Servlet 请求响应与登录功能实战
一、开篇:今日学习核心与目标学习背景:Java Web 入门阶段核心 ——Servlet 与 HTTP 请求响应交互学习目标:掌握 HttpServletRequest/HttpServletResponse 核心用法实现「登录表单提交→Servlet 验证→页面重定向」完整流程解决实操中 404、中…...
别再让AI瞎猜了!5个实战案例教你写出让Vibe Coding一次成功的提示词
别再让AI瞎猜了!5个实战案例教你写出让Vibe Coding一次成功的提示词 当你在Vibe Coding平台上输入一串提示词,满心期待地按下生成按钮,结果却得到一个与你想象中完全不同的产物——这种经历相信很多开发者都不陌生。为什么AI总是"误解&q…...
镜像视界|从“静态建模”到“动态空间”:三维重构的终极形态——融合视频流建模与轨迹连续计算的空间智能引擎
镜像视界|从“静态建模”到“动态空间”:三维重构的终极形态——融合视频流建模与轨迹连续计算的空间智能引擎一、问题提出:为什么“建模”始终停留在静态在数字孪生、三维GIS与智慧城市系统中,“建模”一直是核心基础能力。 通过…...
10大经典量化策略:实战逻辑+买卖信号+风险点
目录 1. 趋势跟踪策略(最主流、最稳) 2. 均值回归策略(震荡市神器) 3. 多因子选股策略(机构标配) 4. 动量反转策略(A 股特别有效) 5. 统计套利 / 配对交易(低风险&a…...
探索汽车LAR LQG半主动/主动悬架:基于Simulink的奇妙之旅
汽车lar lqg 半主动/主动悬架 simulink在汽车工程领域,悬架系统犹如车辆的“脚”,直接影响着行驶的平顺性和安全性。今天咱们就来唠唠汽车的LAR LQG半主动/主动悬架,顺便用Simulink来比划比划。 LAR LQG悬架原理简述 LAR(Linear …...
