在项目需求中,需要对于一个word模板文档生成相对应的word文件,而此word模板是多页的并且需要在最终文件中生成相应的目录,由于项目环境是Linux,所以舍弃了jacob(windows环境)。然后主要是研究了Apache poi 进行word操作以及如何生成目录。
主要分两个部分介绍:
Apache poi 操作word:主要是通过XWPFDocument对象进行操作,api 地址:
//读取word文件
InputStream is = new FileInputStream(path);
XWPFDocument doc = new XWPFDocument(is);
List<IBodyElement> elements= doc.getBodyElements();//获取所有元素(段落和表格)
int pIndex =0;
int tIndex =0;
for(int i=0 ; i< elements.size(); i++) {
IBodyElement e = elements.get(i);
//判断元素类型:段落/ 表格
if(BodyElementType.PARAGRAPH.equals(e.getElementType())) {
XWPFParagraph pa = e.getBody().getParagraphArray(pIndex); //获取段落
List<XWPFRun> runs = paragraph.getRuns(); //获取段落文本
for (XWPFRun run : runs) {
...替换文本
}
}
else if(BodyElementType.TABLE.equals(e.getElementType())){//表格
XWPFTable ta = e.getBody().getTableArray(tIndex);
List<XWPFTableRow> rows = ta.getRows(); //获取所有行
for (XWPFTableRow row : rows) { 遍历每行
List<XWPFTableCell> cells = row.getTableCells(); //获取每行单元格
for (XWPFTableCell cell : cells) { //遍历单元格
List<XWPFParagraph> paragraphs = cell.getParagraphs(); //获取单元格段落
for (XWPFParagraph paragraph : paragraphs) {
List<XWPFRun> runs = paragraph.getRuns();//获取单元格文本
for (XWPFRun run : runs) {
...替换文本
}
}
}
}
}
}
Bash
Copy
操作word方面还是很方便,可以参考一些更详细的:<br> [https://blog.csdn.net/eye9093/article/details/77368703](https://blog.csdn.net/eye9093/article/details/77368703)<br> [https://blog.csdn.net/u012775558/article/details/79678701](https://blog.csdn.net/u012775558/article/details/79678701)
主要是介绍一下目录如何生成<br> 2. .Apache poi 生成word目录: 需要了解ooxml(Office Open XML)的大体结构,参考:[http://www.datypic.com/sc/ooxml/s-wml.xsd.html](http://www.datypic.com/sc/ooxml/s-wml.xsd.html),主要是通过xml标签进行识别分页。
之前在网上也查阅了很多,发现目录的页数问题始终没有一个好的解决方案,之前看的可以通过转成pdf计算页数,但是这个耗时太长,特别是对于我们项目word页数较多的时候转换再重写消耗的时间很长。所以选择再去研究一下word对应的xml文件是否有思路去解决这一问题。<br> 我们选择的是xxx.docx 文件,通过word另存为xml<br> 
获取到此word文件的xml文件,xml文件结构如下:<br> 
<br> 其实大体看一下可以大致理清xml的结构,而我们主要是关注这一个标签<br> 
<br> 这个标签就是分页之后产生的标签(经测试插入空白页不会产生这个标签,如果是遇到表格处于分页那么分页后的表格的第一个单元格必须有文本,不然也不会产生这个标签,而且文档必须有页码),而通过获取这个标签就可以计算出页数,可以看出这个标签位置是<w:p>下的<w:r>下,可以通过poi判断这个标签是否存在:<br> 
主要代码如下:
.//承接上面的获取的段落
int num =1;//页数
XWPFParagraph pa = e.getBody().getParagraphArray(pIndex); //获取段落
List<CTR> ctrlist = pa.getCTP().getRList();//获取<w:p>标签下的<w:r>list
for(int j=0; j < ctrlist.size(); j++) { .//遍历r
CTR r = ctrlist.get(j);
List<CTEmpty> breaklist = r.getLastRenderedPageBreakList();//判断是否存在此标签
if(breaklist.size() > 0) {
num++; //页数添加
}
}
由此可以高效率的获取到页码,生成目录的代码可以参考:[https://www.jianshu.com/p/0a32d8bd6878](https://www.jianshu.com/p/0a32d8bd6878)
所以大体功能实现思路如下:
* POI读取word模板文件(模板必须有页码并且目录位置先用标签标记),然后进行模板内容替换。
* 内容替换完毕后,再整体遍历所有段落和表格,在添加目录项时将对应的目录标题和页码作为参数传入,生成目录。
* 全部生成完毕后,将文档输出到目标文件。
---------------------------------------------------
原网址: [访问](https://www.404bugs.com/index.php/details/1078824995089338368)
创建于: 2023-05-08 11:16:58
目录: default
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论