`
53873039oycg
  • 浏览: 841800 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

[简单]Docx4j读取word 2007内容控件(区分纯文本与格式文本)

 
阅读更多

      见代码:

    

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);
				}
			}
		}
	}
}

 

    全文完。

分享到:
评论

相关推荐

    2021-2022计算机二级等级考试试题及答案No.11532.docx

    在Word中将文档另存为纯文本格式时,原始文档中的所有格式、图片、表格等非文本内容都会被去除,仅保留纯文本信息。 ### 12. 快速启动工具栏自定义 在大多数操作系统中,快速启动工具栏允许用户根据个人需求手动...

    2021-2022计算机二级等级考试试题及答案No.13309.docx

    根据提供的文档内容,我们可以归纳总结出一系列与计算机二级等级考试相关的知识点,具体涵盖编程语言的基础概念、数据库基础知识、软件工程的基本要素以及计算机操作系统的部分功能等。下面是详细的知识点解析: ##...

    2021-2022计算机二级等级考试试题及答案No.15374.docx

    下面根据提供的试题内容,详细解析相关知识点: 1. **数据模型**:层次模型是一种用树形结构表示实体间联系的数据库模型,其中每个节点代表一个实体,节点间的连线表示实体间的关系。 2. **工具栏的“启动”按钮**...

    2021-2022计算机二级等级考试试题及答案No.12412.docx

    - **scanf 函数使用**:在 C 语言中,使用 `scanf` 函数读取输入时,如果输入格式与格式字符串不匹配,可能会导致意外的行为。例如,要将 1、2、3、4 分别赋给变量 a、b、c、d,正确的输入格式应该是 `1,2,34`。 ##...

    2021-2022计算机二级等级考试试题及答案No.19412.docx

    14. **文件系统与数据库系统的区别**:数据库系统拥有特定的数据模型(A选项),而文件系统则相对简单。 15. **浏览器链接颜色**:浏览器通常通过颜色区分已访问和未访问的链接。 16. **Word拼写检查**:Word的...

    2021-2022计算机二级等级考试试题及答案No.17627.docx

    15. Excel2003中,设置不同的数字格式可以显示不同风格的数字,如常规格式、带有千位分隔符的数值格式、带有小数位的数值格式和货币格式。 16. Image控件仅用于显示图片,无点击事件;ImageButton可以响应点击事件...

    2021-2022计算机二级等级考试试题及答案No.1916.docx

    试题涵盖了多个方面的知识,包括病毒类型、宏命令、文档编辑、ASP.NET验证控件、Java Applet事件处理、数据结构、数据库操作、算法分析、编程语法、Web服务、关系模型、数据类型、集合运算、文本格式化、文件操作、...

    2021-2022计算机二级等级考试试题及答案No.1401.docx

    在Word 2000中,选定的文本及对象会以反色(黑底白字)显示,以便于区分选定部分与未选定部分。 ### 16. 浮点数表示 计算机中的浮点数通常采用阶码和尾数的形式表示。这种表示方法可以有效地提高数值表示的范围和...

    2021-2022计算机二级等级考试试题及答案No.10372.docx

    - **Word文档的基本操作**:Word提供了丰富的功能来创建和编辑文档,包括格式化文本、插入图片等。 - **Word文档的创建**:新建文档的快捷键是Ctrl+N而非Ctrl+O。 #### 数据库系统的演变历程 - **数据存储介质的...

    2021-2022计算机二级等级考试试题及答案No.17467.docx

    控件功能区分 - **不具有输入数据功能的控件**:在界面设计中,窗体控件本身并不具备接收用户输入数据的功能,它主要用于组织其他控件。 ### 19. 随机数生成 - **使用`Rnd`函数**:在某些编程语言中,如VB,`Rnd...

    2021-2022计算机二级等级考试试题及答案No.1648.docx

    11. Web 服务器控件是用于构建动态网页的组件,其中 Wizard、AdRotator 和 Calendar 控件是常见的,而 Input 不是 Web 服务器控件。 12. Java 中的 Random 对象可以生成 int 和 double 类型的随机数。 13. Java ...

    2021-2022计算机二级等级考试试题及答案No.15669.docx

    在Word中,选中部分文本或对象时,这些内容将以**反色**(如黑底白字)显示,以便于区分。 ### 19. JavaScript在HTML中的位置 JavaScript代码通常插入到HTML文档的`&lt;head&gt;`或`&lt;body&gt;`部分,也可以放在外部文件中并...

    2021-2022计算机二级等级考试试题及答案No.3826.docx

    - **知识点**:在Word和其他文本编辑器中,使用快捷键Ctrl+A可以快速选中当前文档中的所有内容。 #### 10. 网络类型的划分依据 - **知识点**:网络可以根据覆盖范围划分为广域网(WAN)、城域网(MAN)和局域网(LAN)。...

    2021-2022计算机二级等级考试试题及答案No.9589.docx

    21. 工作区中的反向选定:在文本编辑或处理环境中,反向选定指的是取消当前选定内容并选择其周围的未选定内容。 22. Visual FoxPro(VFP)的类创建工具:VFP提供了一套工具用于创建新类,包括类库、类设计器等,...

    2021-2022计算机二级等级考试试题及答案No.4795.docx

    4. `substring(3,4)`在字符串"abcdedcba"中返回的是'd'(C选项)。 5. Access的默认文本字段大小为50(D选项是错误的)。 6. `String`对象的比较,`s1==s2`为`true`,因为它们引用相同的字符串常量;而`s1==s3`为`...

    2021-2022计算机二级等级考试试题及答案No.14543.docx

    4. **千与兆的区分**:在计算机术语中,1000K并不等于1M。实际上,1M(兆)通常指的是1024K(千),这是基于二进制计数系统。而1000K通常用于十进制系统。 5. **字节的基本组成**:在计算机科学中,一个字节由8个二...

    2021-2022计算机二级等级考试试题及答案No.3897.docx

    15. **Word2000选中区域**:在Word中,选中区域内的文本和对象会被高亮显示,通常是反相显示,以便区分,`正确`是正确答案。 16. **函数调用参数**:在函数调用 `(exp1, exp2, exp3), (exp4, exp5)` 中,整体被视为...

    2021-2022计算机二级等级考试试题及答案No.3453.docx

    1. RAM(随机存取存储器)是可以读写的数据存储器,在计算机工作中可以随时往RAM写入和读取信息。 2. 字符串赋值: - 选项D正确是因为在C语言中,可以使用指针来初始化字符串,如`char *sp="right!";`。 3. 交叉...

    2021-2022计算机二级等级考试试题及答案No.14541.docx

    - **示例**:题目中的 “另存为” 命令可以将文档保存为 `.txt` 格式的纯文本文件。 - **扩展**:除了 `.txt` 格式外,还可以保存为 `.pdf`, `.docx`, `.rtf` 等多种格式。 ### 19. 十六进制数的表示 - **知识点**...

    2021-2022计算机二级等级考试试题及答案No.17713.docx

    在Word中,选择“编辑”菜单下的“选择性粘贴”选项,可以选择只粘贴纯文本内容,从而避免格式的复制。 #### 9. 数据库表间关系的建立 - **知识点**:在关系数据库设计中,建立表间关系是非常重要的步骤。 - **详细...

Global site tag (gtag.js) - Google Analytics