当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

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

发表于: 2015-03-19   作者:53873039oycg   来源:转载   浏览:
摘要:       见代码:      import java.io.File; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; import javax.xml.bind.JAXBElem

      见代码:

    

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 2007内容控件(区分纯文本与格式文本)

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
word 2007内容控件位置: 代码如下: import java.io.File; import java.io.StringWriter; import jav
直接上代码: import java.io.File; import java.math.BigInteger; import java.util.Calendar; impo
直接上代码: import java.io.FileOutputStream; import java.math.BigInteger; import java.util.R
建议直接看docx4j官网例子: https://github.com/plutext/docx4j/tree/master/src/samples/docx4j/or
如果在使用docx4j的过程中有一些效果自己不会写,上网也没搜索到答案,怎么解决呢? 可以把word 200
采用docx4j 替换word模板内容,并输出进行保存文件。 模板截图如下: 替换后截图如下: 模板制作过
word 2007批注测试数据如下图: 代码执行结果为: 主要思路: 利用docx4j的org.docx4j.finders.Comment
昨天花了点时间写了个使用docx4j制作word 2007的例子,例子很粗糙,很多细节没有处理好,今天我放一
word表格插入一行如下: 实现思路: 主要分在当前行上方插入行和在当前行下方插入行。对首尾2行特殊处
功能介绍: 主要实现往已有表格填充数据,在数据列大于表格列时不会新增列,因为新增列涉及单元格宽度
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号