Java中Word的解析方法据我了解有多种,如通过jacob调用office com组件处理Word文档对象,这里介绍的方法是结合jacob与HtmlParser解析word文档内容,希望对利用该方法解析word的网友有帮助。
1. word转换为html
这里使用Jacob实现word到html的转换。Jacob的使用这里就不详述了,不过前提条件是服务器端需要安装微软的Office(当然操作系统也需要是微软家的)。word转换为html功能写在工具类Word2Html中(类似的做法网络上有很多介绍),这样针对word的解析转换为对html的解析。
2. 解析html(using HtmlParser)
在介绍html解析前,有必要说明一下word文档的内容结构。
对一份有标题编号的word文档来说,从首页至尾页以编号为依据可以看作是一棵深度遍历树,相邻编号之间是父子或兄弟关系,编号所在的层次通过标题格式定
义。另外,文档中可以认为是结构化的内容包括:各种约定格式的标题、表格、约定格式的段落、项目符号 和
编号。转换为html后,利用HtmlParser可以方便地解析这些结构化的数据。如果解析出来的数据要求保持父子关系的引用,则需要记录解析对象在html文档中的位置,HtmlParser有提供这些功能。
在HtmlParser API中,识别节点主要通过标签名称构造过滤器(NodeFilter)得到NodeList,在处理NodeList中的Node,关于HtmlParser介绍可以参考http://htmlparser.sourceforge.net/
下面介绍应用HtmlParser解析html常用元素的一些通用方法,这些方法封装在抽象类AbstractHtmlParser中,下面针对一些常用方法进行说明:
1.
获取一个节点下所有的text
比如下面的html片段,将返回"ABC":
<td width=230 style='width:172.65pt;border-top:none;border-left:none;
border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0cm 5.4pt 0cm 5.4pt'>
<p class=MsoNormal><span style='font-family:'>ABC</span></p>
</td>
protected String getAllTextInNode(Node node) {
StringBuffer sb = new StringBuffer();
if (node instanceof TextNode) {
TextNode textNode = (TextNode) node;
String text = textNode.getText().trim();
if (!StringUtil.isEmpty(text)) {
sb.append(text.replace(" ", " ").replace(">", ">")
.replace("<", "<").replace(""", "\"").replace(
"&", "&").replace("'", "'"));
}
} else if (node instanceof RemarkNode) {
// do nothing
} else if (node instanceof TagNode) {
TagNode tagNode = (TagNode) node;
NodeList nl = tagNode.getChildren();
if (null != nl) {
for (SimpleNodeIterator i = nl.elements(); i.hasMoreNodes();) {
sb.append(getAllTextInNode(i.nextNode()));
}
}
}
return sb.toString();
}
2. 解析带有表头的表格,返回List<Map<String, String>>
编码
|
编码名称
|
描述
|
1
|
8K
|
|
2
|
16K
|
|
3
|
32K
|
|
4
|
|
|
/**
* 以表第一行(带有thead元素)作为表头,后续行为List,首行作为List中Map的key,后续行每列作为该Map的value。<br>
* 后续行如果列数与表头不匹配,将终止处理。
* <p>
* @param table
* @return
*/
protected List<Map<String, String>> getListFromTheadTable(Node table) {
List<Map<String, String>> result = new ArrayList<Map<String,String>>();
TagNameFilter theadFilter = new TagNameFilter(TAG_THEAD);
NodeList theadList = table.getChildren().extractAllNodesThatMatch(
theadFilter);
TagNode theadNode = null;
if (theadList != null && theadList.size() > 0) {
theadNode = (TagNode)theadList.elementAt(0);
}
if (theadNode == null) {
return result;
}
// process rows following <thead>
HasSiblingFilter theadSibFilter = new HasSiblingFilter(theadFilter);
AndFilter andFilter = new AndFilter(new TagNameFilter(TAG_TR), theadSibFilter);
NodeList trNodeList = table.getChildren().extractAllNodesThatMatch(new TagNameFilter(TAG_TR));
String[] keys = getTdTextInRow(trNodeList.elementAt(0));
for (int i=1; i<trNodeList.size(); i++) {
Map<String, String> map = new HashMap<String, String>();
String [] values = getTdTextInRow(trNodeList.elementAt(i));
if (values.length != keys.length) {
break; // 后续行如果列数与表头不匹配,将终止处理后续行
}
for (int k=0; k<keys.length; k++) {
map.put(keys[k], values[k]);
}
result.add(map);
}
return result;
}
3. 解析获取形如下Table的数据对,返回Map<String, String>
:
编号
|
0001 |
名称
|
卡状态 |
编码长度
|
2 |
发布序号
|
01 |
说明
|
|
|
|
/**
* @param table
* @return
*/
protected Map<String, String> getMapFormTable(Node table) {
Map<String, String> result = new HashMap<String, String>();
NodeList trNodeList = table.getChildren();
for (SimpleNodeIterator trIter = trNodeList.elements(); trIter
.hasMoreNodes();) {
Node trNode = trIter.nextNode();
if (!isNodeType(trNode, TAG_TR)) {
continue;
}
NodeList tdNodeList = trNode.getChildren();
Node tdKeyNode = tdNodeList.elementAt(0);
Node tdValNode = null;
while (true) {
if (!isNodeType(tdKeyNode, TAG_TD)) {
tdKeyNode = getNextSiblingNode(tdKeyNode, TAG_TD);
continue;
}
tdValNode = getNextSiblingNode(tdKeyNode, TAG_TD);
if (null == tdValNode) {
break;
}
result.put(getAllTextInNode(tdKeyNode),
getAllTextInNode(tdValNode));
tdKeyNode = getNextSiblingNode(tdValNode, TAG_TD);
if (null == tdKeyNode) {
break;
}
}
}
return result;
}
4. 获取一行中td标记包含的text,返回String[]
/**
* 获取一行中td标记包含的text,返回String[]
*
* @param trNode
* @return
*/
protected String[] getTdTextInRow(Node trNode) {
if (!isNodeType(trNode, TAG_TR)) {
return null;
}
List<String> values = new ArrayList<String>();
NodeList tdNodeList = trNode.getChildren().extractAllNodesThatMatch(
new TagNameFilter(TAG_TD));
for (SimpleNodeIterator it = tdNodeList.elements(); it.hasMoreNodes();) {
values.add(getAllTextInNode(it.nextNode()));
}
return values.toArray(new String[] {});
}
5. 在指定父节点下查找指定TagName的子孙节点,按照深度遍历返回第一个TagName的子孙节点
/**
* 在指定父节点下查找指定TagName的子孙节点,按照深度遍历返回第一个TagName的子孙节点
*
* @param parent
* @param tagName
* @return
*/
protected Node getNodeInChildren (Node parent, String tagName) {
if (parent == null) {
return null;
}
NodeList children = parent.getChildren();
if (children == null) {
return null;
}
for (SimpleNodeIterator it=children.elements(); it.hasMoreNodes(); ) {
Node child = it.nextNode();
if (child instanceof TagNode) {
if (tagName.equalsIgnoreCase(((TagNode) child).getTagName())) {
return child;
} else {
return getNodeInChildren(child, tagName);
}
}
}
return null;
}
利用Jacob和HtmlParser解析Word文档就介绍到这,关于HtmlParser的深入用法有空再与大家分享。
分享到:
相关推荐
在这个场景下,我们将详细探讨如何利用Jacob来分析和处理Word文档,特别是目录、段落以及它们之间的关系。 首先,标题和目录在Word文档中起着组织和导航的作用。Jacob提供了API,可以让我们访问到Word文档的内置...
Jacob 操作 Word 文档详解 Jacob 操作 Word 文档概述 Jacob 是一个 Java 库,用于访问和操作 Microsoft Office 应用程序,包括 Word。它提供了一个基于 COM(Component Object Model)的接口,允许 Java 应用...
在这个“Jacob操作word文档的方法集”中,我们将探讨如何使用Jacob 1.5版本来创建和操作Word文档,特别是创建目录。 首先,为了使用Jacob,你需要在你的项目中添加Jacob的jar文件。这通常涉及到将库添加到项目的类...
载Jacob_1.11_zip,终于把Jacob处理Word文档搞定了
在IT行业中, Jacob是一个强大的Java库,用于与Microsoft Office应用程序进行交互,特别是Word文档的处理。这个库允许Java开发者在不使用COM(组件对象模型)的情况下,直接在Java程序中控制Word应用程序,实现对...
在这个特定的情况下,Jacob被用来调用打印机来打印Word文档。这个过程涉及到几个关键的知识点: 1. **Jacob库**:Jacob全称为Java COM Bridge,是一个开源的Java库,通过JNI(Java Native Interface)技术实现,...
### Java操作Word:Jacob(方法解析+环境配置) #### Jacob简介 Jacob是一个开源的Java-COM桥接工具,它允许Java程序与Windows平台上的COM组件进行交互。这意味着开发者可以通过Java来控制诸如Microsoft Word、...
本主题将深入探讨如何利用给定的`itextpdf-5.5.9.jar`和`jacob.jar`这两个库来实现Java读取Word文档页数的功能。 `jacob.jar`是一个Java到COM桥接库,它允许Java应用程序调用Microsoft Office组件,如Word,从而...
读取word文件的内容,并将内容返回为String类型!
### jacob给Word文档添加页脚 在日常工作中,Word文档是经常被使用的工具之一,尤其是在需要编写报告、论文或专业文档时。为了使文档更加规范和专业,往往需要添加页眉、页脚等元素。其中,页脚常用于显示页码、...
总结,通过结合iTextPDF和Jacob这两个库,Java开发者可以在Word文档中添加图片水印,从而实现对文档的个性化定制和保护。这种方法需要对Java、COM组件以及Word API有一定的理解,但是一旦掌握,就可以灵活地处理各种...
Java使用Jacob库通过模板生成Word文档是一个常见的技术实践,尤其在企业级应用中,这种技术常用于批量生成报告、合同等文档。Jacob全称为Java Advanced COM Bridge,它为Java提供了与COM组件交互的能力,让我们可以...
标题“jacob读取word表格”涉及到的是使用Jacob库来操作Microsoft Word文档,特别是从中读取表格数据。Jacob是一个Java到COM桥接库,允许Java应用程序调用COM组件,如Microsoft Office的应用程序。 在Java中,直接...
在本文中,我们将深入探讨如何使用Jacob在Word文档中插入其他文档。 首先,理解Java Jacob的基本使用是至关重要的。Jacob通过COM(Component Object Model)接口与Windows操作系统中的Office应用进行通信。因此,要...
Java使用Jacob库通过Word模板生成Word文档是一种常见的技术实践,特别是在需要自定义生成大量结构化报告的场景下。本项目实例提供了一个完整的解决方案,可以直接在MyEclipse环境中运行。下面将详细讲解这个项目的...
《使用Jacob库导出Word文档详解》 在Java编程中,有时我们需要与Microsoft Office应用程序进行交互,例如创建、编辑或导出Word文档。在这种情况下,Jacob(Java COM Bridge)库是一个非常有用的工具。Jacob允许Java...
通过Jacob,开发者可以利用Java语言调用像Word、Excel等Microsoft Office应用程序提供的功能,例如读取、修改、创建Word文档等。Jacob的关键在于它依赖于JNI(Java Native Interface)技术,使得Java能够调用本地的...
使用Jacob处理Word文档的功能非常强大,不仅可以获取文本,还可以编辑、格式化、插入图片、创建新的文档等。但同时,这也意味着它可能会受到Word应用程序本身的限制,并且性能可能不如专门设计用于处理Office文档的...
本篇文章将深入探讨如何利用JACOB来自动生成Word文档的目录。 首先,我们需要了解什么是目录(TOC,Table of Contents)。在Word文档中,目录是一份列出文档主要部分及其对应页码的索引,帮助读者快速定位到他们感...