用poi操作docx文档将文档内容保留样式、去掉修订同时复制到另一个docx模板中

本文档介绍了一个项目需求,即如何使用Apache POI库将包含修订的docx文档内容复制到另一docx模板中,同时保留样式并移除修订。通过理解docx的XML结构,作者提供了实现这一功能的代码示例,强调了需要引入特定版本的ooxml-schemas jar包,并指出代码可能无法完美保留所有样式。
摘要由CSDN通过智能技术生成

文章目录

需求

做项目的时候有这样一个需求,我们现在有两个word(docx)文档,一个文档里面放着正文内容,另一个文档是模板,需求是需要将正文内容同时包含样式复制到另一个模板里,因为正文文档里还开启了修订,要求复制过去以后不带着修订,直接显示修订后的内容,完成需求的第一个工作就是做技术选型,选来选去还是选择poi,因为poi的资料相对来说多一些,虽然代码比较复杂一些,但是类名什么的还是有一定规律的容易熟悉。

代码

首先我们需要了解一些关于docx的知识,才能更好的了解下面的代码,根据我对poi的简单的了解,poi操作word应该主要是基于xml的,所以我们需要先了解一下docx文档的xml结构才能更好的去用poi完成需求,我们先打开一个docx文档然后选择另存为xml如下图:
在这里插入图片描述这是一个测试文档,带着样式和修订内容
在这里插入图片描述这是模板文档,带着"正文"两个字作为标记,我们要在模板里找到正文两个字,然后把正文两个字删除以后再正文这个段落上开始填充内容
在这里插入图片描述
文件格式选择为word xml文档保存以后打开保存的xml文档,打开以后百度一个xml在线格式化工具格式化一下以后变成这样,我们搜索一下我们标记的内容然后就能看到标签了
在这里插入图片描述其实还有一个ins标签。。代表着修订线。。了解了标签下面可以直接上代码了。。。代码没有多难。。还是很简单的。。只不过我在做的时候发现这方面的资料很少,所以就把我的第一次博客交给它了。
首先我们还需要引三个jar包

<!-- poi jar包 --&g
由于Java POI库并不支持直接复制docx文件的内容、格式、表格、图片等,因此需要借助其他的库或者手动实现复制的逻辑。以下是一种可能的实现方案: 1. 使用Apache Tika库解析原始docx文件,并获取其文本、表格、图片等信息。代码示例: ``` InputStream is = new FileInputStream("source.docx"); ContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); ParseContext context = new ParseContext(); AutoDetectParser parser = new AutoDetectParser(); parser.parse(is, handler, metadata, context); String text = handler.toString(); List<XWPFTable> tables = new XWPFDocument(is).getTables(); List<XWPFPictureData> pictures = new XWPFDocument(is).getAllPictures(); ``` 2. 创建一个新的XWPFDocument对象,并将上一步获取到的信息逐一添加到其。代码示例: ``` XWPFDocument newDoc = new XWPFDocument(); XWPFParagraph para = newDoc.createParagraph(); para.createRun().setText(text); for (XWPFTable table : tables) { newDoc.createTable(table); } for (XWPFPictureData picture : pictures) { byte[] bytes = picture.getData(); int type = picture.getPictureType(); String filename = picture.getFileName(); int id = newDoc.getNextPicNameNumber(type); newDoc.addPictureData(bytes, type); newDoc.createPicture(id, newDoc.getNextPicNameNumber(type), 1024, 768, filename); } ``` 3. 将新的XWPFDocument对象保存到目标docx文件。代码示例: ``` FileOutputStream fos = new FileOutputStream("target.docx"); newDoc.write(fos); fos.close(); ``` 完整代码如下: ``` import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.xwpf.usermodel.*; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.util.List; public class CopyDocx { public static void main(String[] args) throws Exception { InputStream is = new FileInputStream("source.docx"); ContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); ParseContext context = new ParseContext(); AutoDetectParser parser = new AutoDetectParser(); parser.parse(is, handler, metadata, context); String text = handler.toString(); List<XWPFTable> tables = new XWPFDocument(is).getTables(); List<XWPFPictureData> pictures = new XWPFDocument(is).getAllPictures(); XWPFDocument newDoc = new XWPFDocument(); XWPFParagraph para = newDoc.createParagraph(); para.createRun().setText(text); for (XWPFTable table : tables) { newDoc.createTable(table); } for (XWPFPictureData picture : pictures) { byte[] bytes = picture.getData(); int type = picture.getPictureType(); String filename = picture.getFileName(); int id = newDoc.getNextPicNameNumber(type); newDoc.addPictureData(bytes, type); newDoc.createPicture(id, newDoc.getNextPicNameNumber(type), 1024, 768, filename); } FileOutputStream fos = new FileOutputStream("target.docx"); newDoc.write(fos); fos.close(); } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值