见代码:
import java.io.File; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; import javax.xml.bind.JAXBElement; import org.docx4j.TextUtils; import org.docx4j.TraversalUtil; import org.docx4j.TraversalUtil.CallbackImpl; import org.docx4j.XmlUtils; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart; import org.docx4j.wml.Body; import org.docx4j.wml.CTLock; import org.docx4j.wml.CTSdtCell; import org.docx4j.wml.ContentAccessor; import org.docx4j.wml.Document; import org.docx4j.wml.Id; import org.docx4j.wml.RPr; import org.docx4j.wml.RStyle; import org.docx4j.wml.SdtBlock; import org.docx4j.wml.SdtPr; import org.docx4j.wml.SdtPr.Alias; import org.docx4j.wml.SdtRun; import org.docx4j.wml.Tag; import org.jvnet.jaxb2_commons.ppp.Child; //能区分纯文本和格式文本(格式文本能插入公式,纯文本不能) public class Docx4j_读取内容控件_S4_Test { public static void main(String[] args) throws Exception { Docx4j_读取内容控件_S4_Test t = new Docx4j_读取内容控件_S4_Test(); t.printSdtContent("f:/saveFile/temp/kkk3.docx"); } public void printSdtContent(String filePath) throws Exception { WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File(filePath)); MainDocumentPart mdp = wordMLPackage.getMainDocumentPart(); Document wmlDocumentEl = (Document) mdp.getContents(); Body body = wmlDocumentEl.getBody(); SdtFinder_2 sdtFinder = new SdtFinder_2(); new TraversalUtil(body, sdtFinder); for (Child sdtChild : sdtFinder.sdtList) { if (sdtChild instanceof SdtRun) { SdtRun sdtRun = (SdtRun) sdtChild; SdtPr sdtPr = sdtRun.getSdtPr(); printSdtPrContent(sdtPr); ContentAccessor sdtContent = sdtRun.getSdtContent(); System.out.println("-----------p content="+ getContentAccessorContent(sdtContent)); } else if (sdtChild instanceof CTSdtCell) { CTSdtCell sdtCell = (CTSdtCell) sdtChild; SdtPr sdtPr = sdtCell.getSdtPr(); printSdtPrContent(sdtPr); ContentAccessor sdtContent = sdtCell.getSdtContent(); System.out.println("-----------table content="+ getContentAccessorContent(sdtContent)); } else if (sdtChild instanceof SdtBlock) { SdtBlock sdtBlock = (SdtBlock) sdtChild; SdtPr sdtPr = sdtBlock.getSdtPr(); printSdtPrContent(sdtPr); ContentAccessor sdtContent = sdtBlock.getSdtContent(); System.out.println("-----------sdtblock content="+ getContentAccessorContent(sdtContent)); } } } // 解析样式,区分纯文本和格式文本 public void printSdtPrContent(SdtPr sdtPr) { StringBuffer sb = new StringBuffer(); List<Object> rprList = sdtPr.getRPrOrAliasOrLock(); boolean flag=false; for (Object obj : rprList) { if (obj instanceof JAXBElement) { String eName = ((JAXBElement) obj).getName().getLocalPart(); // System.out.println("---------=" + eName); // 布尔类型特殊处理 if ("temporary".equals(eName)) { sb.append(" 替换后是否删除内容控件:").append("是"); } else if ("text".equals(eName)) { // 纯文本是否允许回车特殊处理 // CTSdtText判断是否回车代码不准确 // if (this.multiLine == null) { // return true; // } flag=true; String textXml = XmlUtils.marshaltoString(obj, true, true); if (textXml.indexOf("w:multiLine") != -1) { sb.append(" 是否允许回车:").append("是"); } } obj = XmlUtils.unwrap(obj); if (obj instanceof Alias) { Alias alias = (Alias) obj; if (alias != null) { sb.append(" 标题:").append(alias.getVal()); } } else if (obj instanceof CTLock) { CTLock lock = (CTLock) obj; if (lock != null) { if (lock.getVal().value().toUpperCase().equals("CONTENTLOCKED")) { sb.append(" 锁定方式:").append("无法编辑内容"); } else if (lock.getVal().value().toUpperCase().equals("SDTLOCKED")) { sb.append(" 锁定方式:").append("无法删除内容控件"); }else if (lock.getVal().value().toUpperCase().equals("SDTCONTENTLOCKED")) { sb.append(" 锁定方式:").append("无法删除内容控件,无法编辑内容"); } else { sb.append(" 锁定方式:").append(lock.getVal()); } } }else if(obj instanceof RPr){ RPr rpr = (RPr) obj; if(rpr!=null){ RStyle rprStyle = rpr.getRStyle(); if(rprStyle!=null){ sb.append(" 样式名称:").append(rprStyle.getVal()); } } } } else if (obj instanceof Tag) { Tag tag = (Tag) obj; if (tag != null) { sb.append(" tag标记:").append(tag.getVal()); } } else if (obj instanceof Id) { Id id = (Id) obj; if (id != null) { sb.append(" id:").append(id.getVal()); } } } if(flag){ sb.append(" 内容控件类型:").append("纯文本"); }else{ sb.append(" 内容控件类型:").append("格式文本"); } System.out.println(sb.toString()); } public String getContentAccessorContent(ContentAccessor contentAcc) throws Exception { StringWriter stringWriter = new StringWriter(); TextUtils.extractText(contentAcc, stringWriter); return stringWriter.toString(); } } class SdtFinder_2 extends CallbackImpl { List<Child> sdtList = new ArrayList<Child>(); public List<Object> apply(Object o) { if (o instanceof javax.xml.bind.JAXBElement && (((JAXBElement) o).getName().getLocalPart().equals("sdt"))) { sdtList.add((Child) XmlUtils.unwrap(o)); } else if (o instanceof SdtBlock) { sdtList.add((Child) o); } return null; } // to setParent public void walkJAXBElements(Object parent) { List children = getChildren(parent); if (children != null) { for (Object o : children) { if (o instanceof javax.xml.bind.JAXBElement && (((JAXBElement) o).getName().getLocalPart() .equals("sdt"))) { ((Child) ((JAXBElement) o).getValue()).setParent(XmlUtils .unwrap(parent)); } else { o = XmlUtils.unwrap(o); if (o instanceof Child) { ((Child) o).setParent(XmlUtils.unwrap(parent)); } } this.apply(o); if (this.shouldTraverse(o)) { walkJAXBElements(o); } } } } }
全文完。
相关推荐
使用docx4J技术操作word的读写,使用docx4J技术操作word的读写,
用docx4j,jar出去word书签,在word书签中插入文本 源码可以通过以下链接查看: https://github.com/xulp-mzl/xlp-core https://github.com/xulp-mzl/xlp-third ...实例: public static void main(String[] args) ...
docx4j操作word,主要使用docx4j对word进行操作,比如chart图表、标签替换、目录等。
最近在做一个出卷系统,需要通过试卷模板从数据库中抽取题目,然后按照模板的样式生成完整的试卷,包括试卷格式的排版和图片的写入。这是用docx4j生成word文档。里面包括完整代码和所需jar包。
docx4j操作word2007
这是一段用docx4j根据书签替换word文档中的内容的代码,研究了一段时间,而且下了很多东西,希望有点用
Docx4j是Java操作office2007+中的Word、Excel、PPT的开源项目,其主要针对WordXML 同时也可以处理Excel和PPT,比POI要强大很多 . Docx4J基于开源协议ASLv2。 ASL是一个广泛适用于社区开源软件并被开源业界所认可的...
word合并全家桶,包括横页和竖页兼容合并,里面包含使用文件格式转换,rtf转换为标准的word格式或者其他类型转换,jacob合并word案例及jar包,docx4j合并word案例及jar包,还有poi合并,以及Plutext-Enterprise-3.3.0.6...
docx4j所需jar包整合,其中word转pdf,word转html,word中docx转doc,java代码实现,都可以使用,仅限学习参考使用。
docx4j解析word导入试题入库,支持图片解析,mathType公式解析,word自带数学公式解析
使用docx4j相关jar包,实现多个word文档合并,并转为pdf文档格式
docx4j 用的jar包,docx4j学习网址:http://www.docx4java.org/trac/docx4j
docx4j支持操作后缀.docx得word文档,替换书签,获取文档内容,稳定资源
利用docx4j实现docx转pdf小dome
功能主要实现了1、对pdf、word文件进行预览显示2、读取pdf、word文本数据3、进行文本之间的相似度比较。 资源每段我基本都有详细的过程注解,Demo可以直接运行测试。 pdf的预览及读取我是用的网上的Poppler第三方库...
NULL 博文链接:https://01jiangwei01.iteye.com/blog/2123628
代码很短,但是找jar包找的欲仙欲死,包括commons-io-1.4.jar,commons-logging-1.1.1.jar,docx4j-3.3.3.jar,freemarker.jar,google-collections.jar,log4j-1.2.8.jar,slf4j-api-1.7.12.jar,slf4j-log4j12-...
压缩包里包含了必要的docx4j.jar、commons-io-1.4.jar、slf4j-api-1.7.17.jar、freemrkker.jar等架包,导入到到项目后重新build path,然后运行InsertPicture.java文件,(ps:文件的参数替换成自己本地的),便可以...
What is docx4j? docx4j is an open source (Apache v2) library for creating, editing, and saving OpenXML "packages", including docx, pptx, and xslx. It uses JAXB to create the Java representation. ...