热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ApachePoi操作word,替换字符保留样式问题,runs段落混乱问题。

关于这个问题也是刚好遇到,一通搜索也没有找到类似的或者是有效的方法。下面介绍一下。首先apachepoi




关于这个问题也是刚好遇到,一通搜索也没有找到类似的或者是有效的方法。下面介绍一下。

Apache Poi 操作word,替换字符保留样式问题,runs段落混乱问题。

首先apache poi的引入

<dependency>
<groupId>org.apache.poigroupId>
<artifactId>poiartifactId>
<version>4.1.2version>
dependency>
<dependency>
<groupId>org.apache.poigroupId>
<artifactId>poi-ooxmlartifactId>
<version>4.1.2version>
dependency>
<dependency>
<groupId>org.apache.poigroupId>
<artifactId>poi-ooxml-schemasartifactId>
<version>4.1.2version>
dependency>
<dependency>
<groupId>org.apache.poigroupId>
<artifactId>poi-scratchpadartifactId>
<version>4.1.2version>
dependency>

<dependency>
<groupId>com.deepoovegroupId>
<artifactId>poi-tlartifactId>
<version>1.10.0version>
dependency>

上面的包都是一些基础的东西,然后需要注意的是版本问题。因为版本不一样可能导致的用法也不一样。 poi-tl 1.10.0 版本需要poi 4.1.2的版本来支持。这个官方的作者已经说了。

下面直接上 替换word的代码

    XWPFDocument document = new XWPFDocument(in);
List
paragraphs = document.getParagraphs();
Map
replacements = new HashMap<>();
    //这里是找回替换的特殊字符,我是通过正则去找回的。因为我的比较多。而且我一般习惯${}的写法。
    //当然poi-tl也可以直接替换很方便,但是这里用的是原生的apache poi。因为担心poi-tl还不是很成熟。
List
replaceFields = retrieveReplaceFields(document, regex);
for (String replaceField : replaceFields) {
String factField
= StringUtils.substringBetween(replaceField, prefix, suffix);
String val
= retrieveData(factField, data);
replacements.put(replaceField,val);
}
    //这里是普通段落
replaceInParagraphs(replacements,paragraphs);
//处理表格
Iterator iterator = document.getTablesIterator();
while (iterator.hasNext()) {
XWPFTable table
= iterator.next();
List
rows = table.getRows();
for (XWPFTableRow row : rows) {
List
tableCells = row.getTableCells();
for (XWPFTableCell cell : tableCells) {
List
cellParagraphs = cell.getParagraphs();
replaceInParagraphs(replacements,cellParagraphs);
}
}
}
ByteArrayOutputStream output
= new ByteArrayOutputStream();
document.write(output);
document.write(
new FileOutputStream("C:\\Users\\dato\\Desktop\\dato.docx"));

这其中最重要替换方法来了:

replaceInParagraphs(replacements,cellParagraphs);

private static long replaceInParagraphs(Map replacements, List xwpfParagraphs) {
long count = 0;
for (XWPFParagraph paragraph : xwpfParagraphs) {
List runs = paragraph.getRuns();
for (Map.Entry replPair : replacements.entrySet()) {
String find = replPair.getKey();
String repl = replPair.getValue();
TextSegment found = paragraph.searchText(find, new PositionInParagraph());
if ( found != null ) {
count++;
if ( found.getBeginRun() == found.getEndRun() ) {// whole search string is in one RunXWPFRun run = runs.get(found.getBeginRun());String runText = run.getText(run.getTextPosition());String replaced = runText.replace(find, repl);run.setText(replaced, 0);
} else {
// The search string spans over more than one Run
// Put the Strings togetherStringBuilder b = new StringBuilder();for (int runPos = found.getBeginRun(); runPos <= found.getEndRun(); runPos++) { XWPFRun run = runs.get(runPos); b.append(run.getText(run.getTextPosition()));}String cOnnectedRuns= b.toString();String replaced = connectedRuns.replace(find, repl);// The first Run receives the replaced String of all connected RunsXWPFRun partOne= runs.get(found.getBeginRun());partOne.setText(replaced, 0);// Removing the text in the other Runs.for (int runPos = found.getBeginRun()+1; runPos <= found.getEndRun(); runPos++) { XWPFRun partNext = runs.get(runPos); partNext.setText("", 0);}
}
}
}
}
return count;
}

 

 


推荐阅读
  • 本文介绍了多个关于JavaScript的书籍资源、实用工具和编程实例,涵盖从入门到进阶的各个阶段,帮助读者全面提升JavaScript编程能力。 ... [详细]
  • 本文详细介绍如何利用已搭建的LAMP(Linux、Apache、MySQL、PHP)环境,快速创建一个基于WordPress的内容管理系统(CMS)。WordPress是一款流行的开源博客平台,适用于个人或小型团队使用。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • 最近团队在部署DLP,作为一个技术人员对于黑盒看不到的地方还是充满了好奇心。多次咨询乙方人员DLP的算法原理是什么,他们都以商业秘密为由避而不谈,不得已只能自己查资料学习,于是有了下面的浅见。身为甲方,虽然不需要开发DLP产品,但是也有必要弄明白DLP基本的原理。俗话说工欲善其事必先利其器,只有在懂这个工具的原理之后才能更加灵活地使用这个工具,即使出现意外情况也能快速排错,越接近底层,越接近真相。根据DLP的实际用途,本文将DLP检测分为2部分,泄露关键字检测和近似重复文档检测。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文探讨了在Java多线程环境下,如何确保具有相同key值的线程能够互斥执行并按顺序输出结果。通过优化代码结构和使用线程安全的数据结构,我们解决了线程同步问题,并实现了预期的并发行为。 ... [详细]
  • 本文介绍如何使用布局文件在Android应用中排列多行TextView和Button,使其占据屏幕的特定比例,并提供示例代码以帮助理解和实现。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 本文介绍了Android开发中Intent的基本概念及其在不同Activity之间的数据传递方式,详细展示了如何通过Intent实现Activity间的跳转和数据传输。 ... [详细]
  • 本文详细介绍了 RosPack 类的功能和用法,探讨了其在 ROS 系统中的重要作用。RosPack 类提供了类似于终端命令 rospack 的功能,能够方便地查询和管理 ROS 包的相关信息。 ... [详细]
  • 阿里云ecs怎么配置php环境,阿里云ecs配置选择 ... [详细]
  • 本文介绍如何使用 Android 的 Canvas 和 View 组件创建一个简单的绘图板应用程序,支持触摸绘画和保存图片功能。 ... [详细]
author-avatar
好咯午睡了_740
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有