Docx4j替换word文档的页眉
来源:互联网 发布:windows安全模式进不了 编辑:程序博客网 时间:2024/05/22 04:39
Docx4j替换word文档的页眉
目前国内关于Docx4j的帖子少的可怜,看来看去都是那几个。本人使用Docx4j也有一段时间,虽然还有许多东西没了解全,但在这边想分享我的学习经验,互相交流,也方便自己以后回顾。
1、若想了解如何为word插入页眉页脚,请百度(一大堆都是)。
2、在看该文章之前需要大致了解下什么是Docx4j,是操作哪一种版本的word。需要对XML有一点了解。
3、废话不说,看代码。
(1)为方便,写一个抽象类
public abstract class Docx4jAbstract { protected WordprocessingMLPackage wordMLPackage; protected MainDocumentPart documentPart; public AbstractOp(WordprocessingMLPackage wordMLPackage) { this.wordMLPackage = wordMLPackage; this.documentPart = wordMLPackage.getMainDocumentPart(); }}
(2)主要内容
public class HeaderAndFooter extends Docx4jAbstract { private boolean revision = false;//是否需要修订记录 private String author = "";//修订记录的作者 public HeaderFooterOp(WordprocessingMLPackage wordMLPackage) { super(wordMLPackage); } public void setRevision (boolean revision ) { this.revision = revision ; } public void setAuthor(String author) { this.author = author; } /** * 替换页眉 * * @param content 要替换的内容 */ public void replaceHeader(String content) throws Exception { /** * .docx文件里面其实包含了三个header(header1、header2、header3) * 其中有一个header为首页不同的header(为什么是其中一个呢?因为不同文档header存放的内容并不是固定的) * 这边主要思路是找到header,将里面的P(段落)内的内容替换掉。 */ List<SectionWrapper> sections = this.wordMLPackage.getDocumentModel().getSections(); if (null == sections || 0 == sections.size()) return; for (int i = 0; i < sections.size(); i++) { HeaderFooterPolicy headerFooterPolicy = sections.get(i).getHeaderFooterPolicy(); HeaderPart firstHeader = headerFooterPolicy.getFirstHeader();//首页不同的页眉的header if (firstHeader != null) { handleHeader(firstHeader, content); } HeaderPart headerPart = headerFooterPolicy.getDefaultHeader();//普通情况的页眉header handleHeader(headerPart, content); } } private void handleHeader(HeaderPart headerPart, String content) throws Exception { List<Object> headList = headerPart.getContent(); for (Object headP : headList) { if (headP instanceof P) { P srcP = (P) headP;//获取文档中的页眉 deleteHeadRevision(headerPart, srcP);//删除原先的修订记录 String srcContent = extractText(srcP);//获取页眉的内容 P targetP = revision ? createDelAndInsP(srcContent, content, author, srcP.getPPr()) : DocxUtils.createP(content, srcP.getPPr());//生成新的段落 int index = headerPart.getContent().indexOf(srcP);//获取索引 headerPart.getContent().remove(index);//删除原先的页眉 headerPart.getContent().add(index, targetP);//插入新的页眉 } } } public void deleteHeadRevision(HeaderPart headerPart, P p) throws Exception { List<Object> objList = headerPart.getContent(); deleteDocxRevision(objList,p); } public String extractText(Object object) { StringWriter stringWriter = new StringWriter(); try { stringWriter.getBuffer().setLength(0); TextUtils.extractText(object, stringWriter); } catch (Exception e) { e.printStackTrace(); } return stringWriter.getBuffer().toString(); } public P createDelAndInsP(String srcContent, String replaceContent, String author, PPr ppr) { P pDelAndIns = createDelAndInsP(srcContent, replaceContent, author); pDelAndIns.setPPr(ppr); return pDelAndIns; } public P createDelAndInsP(String srcContent, String replaceContent, String author) { ObjectFactory factory = Context.getWmlObjectFactory(); P pDelAndIns = factory.createP(); insetIns(pDelAndIns, replaceContent, author); insetDel(pDelAndIns, srcContent, author); return pDelAndIns; } public void insetIns(P pIns, String content, String author) { RunIns Ins = createRunIns(content, author); pIns.getContent().add(Ins); } public RunIns createRunIns(String content, String author) { ObjectFactory factory = Context.getWmlObjectFactory(); RunIns ins = factory.createRunIns(); R r = createR(factory, content); ins.setAuthor(author); ins.getCustomXmlOrSmartTagOrSdt().add(r); return ins; } public void insetDel(P pDel, String content, String author) { RunDel Del = createRunDel(content, author); pDel.getContent().add(Del); } public RunDel createRunDel(String content, String author) { ObjectFactory factory = Context.getWmlObjectFactory(); RunDel del = factory.createRunDel(); R rDel = factory.createR(); DelText delText = factory.createDelText(); delText.setValue(content); rDel.getContent().add(delText); del.setAuthor(author); del.getCustomXmlOrSmartTagOrSdt().add(rDel); return del; } public P createP(String content, PPr ppr) { P p = createP(content); p.setPPr(ppr); return p; } public P createP(String content) { ObjectFactory factory = Context.getWmlObjectFactory(); P p = factory.createP(); R r = createR(content); p.getContent().add(r); return p; }}
(3)不懂请留言
1 0
- Docx4j替换word文档的页眉
- docx4j创建word文档
- 使用Docx4j创建word文档
- 使用Docx4j创建word文档
- word文档删除页眉横线
- docx4j 在页眉同时增加图片和文字的方法
- 向Docx4j生成的word文档添加图片和布局--第一部分
- 向Docx4j生成的word文档中添加布局--第二部分
- 使用docx4j编程式地创建复杂的Word(.docx)文档
- 向Docx4j生成的word文档添加图片和布局--第一部分
- 向Docx4j生成的word文档中添加布局--第二部分
- 使用docx4j编程式地创建复杂的Word(.docx)文档
- 如何使WORD文档的页眉不相同
- Word分节:同一个文档使用不同的页眉页脚
- word文档设置页眉页脚的技巧
- word文档中页眉页脚的设置问题
- Word文档设置多个不同的页眉页脚
- 去除不同版本Word文档页眉横线的方法
- popwindow 焦点问题,物理返回键截获,软键盘监听问题
- 河工大校赛总结+补题(未完待续)
- 用java搭建自己的http服务器
- Repeated Substring Pattern问题及解法
- 优云亮相GOPS2017全球运维大会 “黑科技”获全场最高关注
- Docx4j替换word文档的页眉
- 机器学习模型LaTeX公式版:支持向量机
- android 处理软键盘弹出时的一种方法
- 位运算的奇淫技巧
- 原生js+cookie实现购物车功能
- Flink Java与Scala的Api类型不匹配问题
- 挑战 poj 3041 二分图最大匹配算法 (匈牙利算法)
- oj383. Ransom Note
- 关于EasyUI中阻止事件冒泡