见代码:
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); } } } } }
全文完。
相关推荐
在Word中将文档另存为纯文本格式时,原始文档中的所有格式、图片、表格等非文本内容都会被去除,仅保留纯文本信息。 ### 12. 快速启动工具栏自定义 在大多数操作系统中,快速启动工具栏允许用户根据个人需求手动...
根据提供的文档内容,我们可以归纳总结出一系列与计算机二级等级考试相关的知识点,具体涵盖编程语言的基础概念、数据库基础知识、软件工程的基本要素以及计算机操作系统的部分功能等。下面是详细的知识点解析: ##...
下面根据提供的试题内容,详细解析相关知识点: 1. **数据模型**:层次模型是一种用树形结构表示实体间联系的数据库模型,其中每个节点代表一个实体,节点间的连线表示实体间的关系。 2. **工具栏的“启动”按钮**...
- **scanf 函数使用**:在 C 语言中,使用 `scanf` 函数读取输入时,如果输入格式与格式字符串不匹配,可能会导致意外的行为。例如,要将 1、2、3、4 分别赋给变量 a、b、c、d,正确的输入格式应该是 `1,2,34`。 ##...
14. **文件系统与数据库系统的区别**:数据库系统拥有特定的数据模型(A选项),而文件系统则相对简单。 15. **浏览器链接颜色**:浏览器通常通过颜色区分已访问和未访问的链接。 16. **Word拼写检查**:Word的...
15. Excel2003中,设置不同的数字格式可以显示不同风格的数字,如常规格式、带有千位分隔符的数值格式、带有小数位的数值格式和货币格式。 16. Image控件仅用于显示图片,无点击事件;ImageButton可以响应点击事件...
试题涵盖了多个方面的知识,包括病毒类型、宏命令、文档编辑、ASP.NET验证控件、Java Applet事件处理、数据结构、数据库操作、算法分析、编程语法、Web服务、关系模型、数据类型、集合运算、文本格式化、文件操作、...
在Word 2000中,选定的文本及对象会以反色(黑底白字)显示,以便于区分选定部分与未选定部分。 ### 16. 浮点数表示 计算机中的浮点数通常采用阶码和尾数的形式表示。这种表示方法可以有效地提高数值表示的范围和...
- **Word文档的基本操作**:Word提供了丰富的功能来创建和编辑文档,包括格式化文本、插入图片等。 - **Word文档的创建**:新建文档的快捷键是Ctrl+N而非Ctrl+O。 #### 数据库系统的演变历程 - **数据存储介质的...
控件功能区分 - **不具有输入数据功能的控件**:在界面设计中,窗体控件本身并不具备接收用户输入数据的功能,它主要用于组织其他控件。 ### 19. 随机数生成 - **使用`Rnd`函数**:在某些编程语言中,如VB,`Rnd...
11. Web 服务器控件是用于构建动态网页的组件,其中 Wizard、AdRotator 和 Calendar 控件是常见的,而 Input 不是 Web 服务器控件。 12. Java 中的 Random 对象可以生成 int 和 double 类型的随机数。 13. Java ...
在Word中,选中部分文本或对象时,这些内容将以**反色**(如黑底白字)显示,以便于区分。 ### 19. JavaScript在HTML中的位置 JavaScript代码通常插入到HTML文档的`<head>`或`<body>`部分,也可以放在外部文件中并...
- **知识点**:在Word和其他文本编辑器中,使用快捷键Ctrl+A可以快速选中当前文档中的所有内容。 #### 10. 网络类型的划分依据 - **知识点**:网络可以根据覆盖范围划分为广域网(WAN)、城域网(MAN)和局域网(LAN)。...
21. 工作区中的反向选定:在文本编辑或处理环境中,反向选定指的是取消当前选定内容并选择其周围的未选定内容。 22. Visual FoxPro(VFP)的类创建工具:VFP提供了一套工具用于创建新类,包括类库、类设计器等,...
4. `substring(3,4)`在字符串"abcdedcba"中返回的是'd'(C选项)。 5. Access的默认文本字段大小为50(D选项是错误的)。 6. `String`对象的比较,`s1==s2`为`true`,因为它们引用相同的字符串常量;而`s1==s3`为`...
4. **千与兆的区分**:在计算机术语中,1000K并不等于1M。实际上,1M(兆)通常指的是1024K(千),这是基于二进制计数系统。而1000K通常用于十进制系统。 5. **字节的基本组成**:在计算机科学中,一个字节由8个二...
15. **Word2000选中区域**:在Word中,选中区域内的文本和对象会被高亮显示,通常是反相显示,以便区分,`正确`是正确答案。 16. **函数调用参数**:在函数调用 `(exp1, exp2, exp3), (exp4, exp5)` 中,整体被视为...
1. RAM(随机存取存储器)是可以读写的数据存储器,在计算机工作中可以随时往RAM写入和读取信息。 2. 字符串赋值: - 选项D正确是因为在C语言中,可以使用指针来初始化字符串,如`char *sp="right!";`。 3. 交叉...
- **示例**:题目中的 “另存为” 命令可以将文档保存为 `.txt` 格式的纯文本文件。 - **扩展**:除了 `.txt` 格式外,还可以保存为 `.pdf`, `.docx`, `.rtf` 等多种格式。 ### 19. 十六进制数的表示 - **知识点**...
在Word中,选择“编辑”菜单下的“选择性粘贴”选项,可以选择只粘贴纯文本内容,从而避免格式的复制。 #### 9. 数据库表间关系的建立 - **知识点**:在关系数据库设计中,建立表间关系是非常重要的步骤。 - **详细...