- 浏览: 144398 次
- 性别:
- 来自: 广州
最新评论
-
tianmo2008:
最近在使用,遇到点问题,希望能请教一下.
请问一下,你出现过I ...
RCP中实现带有run in background按钮的进度条对话框 -
zhangzcz1999:
lin36 写道楼主的程序有问题,测试的时间包含有调用&quo ...
java写文件方法之比较 -
hnbcjzj:
FileOutputStream 用于写入诸如图像数据之类的原 ...
java写文件方法之比较 -
zhangzcz1999:
xueshuanglong 写道网上现在的资料尽是一些旧版的, ...
LifeRay安装配置开发环境全过程(一) -
xueshuanglong:
网上现在的资料尽是一些旧版的,没有最新的。
LifeRay安装配置开发环境全过程(一)
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
2. 解析带有表头的表格,返回List<Map<String, String>>
3. 解析获取形如下Table的数据对,返回Map<String, String> :
4. 获取一行中td标记包含的text,返回String[]
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
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; }
发表评论
-
(转)Java同步技术
2010-03-15 15:26 1187Java同步技术 收藏 by:文/ Iangao 200 ... -
Java和oracle分页处理
2009-12-09 18:16 2511Oracle的分页查询语句基 ... -
java写文件方法之比较
2009-11-12 10:57 8530(转)最近对以前开发的一个通用数据迁移的软件进行优化。除了 ... -
Log4j记录详细异常信息
2009-08-11 16:56 1446//代码片断,其中log为log4j对象,ex为异常对象 / ... -
解决iframe中session丢失的问题
2009-08-04 11:35 2765最近由于要做页面引用,在Iframe中引用其他系统的页面,而其 ... -
转:HttpClient POST 的 UTF-8等编码问题
2009-04-26 15:46 3595Apache HttpClient ( http://jaka ... -
RCP中实现带有run in background按钮的进度条对话框
2009-04-02 12:05 3397public class TestWithProgress ... -
spring cron表达式
2009-03-02 15:35 1998Cron表达式是一个字符串 ... -
使用apache的Httpclient上传文件
2009-02-27 14:25 4510String targetUrl = "htt ... -
eclipse中的线程
2009-02-10 16:25 860先大致讲一讲GUI程序中 ... -
GEF初步学习
2009-01-21 17:06 1418这周公司突然要我去接手同事写的GEF和RCP工作。于是急匆匆的 ... -
(转)Java复习
2009-01-16 17:28 773类成员访问修饰符与继承的关系 私有的(private)类成员 ... -
eclipse启动参数(eclipse.ini)说明
2009-01-07 09:45 1640今天在写RCP程序的时候跟踪程序,出现了java.lang.O ... -
Lucene已建索引的全部删除
2008-11-07 17:37 1507今天搞个重建索引工作,一开始想要把建索引的文件目录删除然后再来 ... -
Lucene 搜索试用
2008-10-22 11:57 966传说中强大的Lucene搜索,首先要创建索引: impor ... -
JXL操作excel代码实例
2008-10-18 17:53 1445import java.io.File; import ... -
Webphere启动报java.lang.ClassCastException问题解决
2008-09-26 19:55 3382昨天使用websphere部署war包,部署成功了,启动也成功 ... -
opencsv开源 CSV文件操作包简介
2008-05-30 09:47 3902opencsv is a very simple csv (c ... -
Tomcat下配置与使用CAS实现单点登录
2008-05-23 10:47 2497配置Tomcat使用SSL安全认证 因为CAS使用的是http ... -
(转)TCP端口扫描程序
2008-05-22 10:17 1218import java.io.IOException; ...
相关推荐
通过目录找出对应的标题, 通过两个标题的位置得到之间的段落(得到了段落Range,但是我只处理了text,没有处理table和picture,这些都可以从Range中取出)
载Jacob_1.11_zip,终于把Jacob处理Word文档搞定了
jacob操作word文档
Java 实现word文件增加图片水印 jacob实现 用到的jar itextpdf-5.5.2和 jacob
jacob jacob配置 java操作word java操作word:jacob(方法解析+环境配置)
用Jacob,把word文档转换为html,还是很好用的,格式什么的也都保持很好; 需要说明的几点:1.要保证本地有office软件,才可以正常转换;2.jacob.dll放到jdk-->jre-->bin 路径下;3.把jacob.jar包加入到你的工程中;
该word中是一些关于jacob如何操作word的范例代码!互相交流学习
jacob官方文档,java读取word文档
SSM+freemaker+jacob实现生成word文档并转换为PDF 另一个是错的
Jacob操作word 文档的方法集!(含创建目录),使用的Jacob版本是1.5
java jacob操作word,往word中插入文档文件等等功能webservice
整个代码只需要一个jacob的jar包就可以运行了。 当然,在下载的文件里面还有个调用系统库的dll文件需要放置在jre的bin目录下: 示例:D:\Java\jdk1.7.0_67\jre\bin\jacob-...这样代码就可以实现word转pdf,html 转word。
可以给Word文档使用jacob控件来添加页脚,然而使用jacob来处理Word文档的页脚自己找了很久都没能找到解决的办法,只有自己动手解决了。 此函数可以自动把页码作为文档的页脚,页脚可以随着页码的值自动改变,页码的...
通过freemarker和jacob生成合同word文档html生成word文档(word模板类型的资源)压缩包里有有详细的生成方式,里面有两种生成方式,一种是用html生成。另一种则是后台生成 1、第一步通过office软件将word文档命名好...
如果你要对 MS Word、Excel 进行处理,JACOB 是一个好的选择。JACOB目前已经成为sourceforge(http://sourceforge.net/projects/jacob- project/)的一个开源项目,本文使用的版本是1.10.1。 这篇文章可能不能完全...
使用Jacob来处理Word文档
java调用ocx控件的方法,jacob技术调用ocx控件的步骤、流程,java项目调用具体代码,java调用ocx控件参数传递,jacob调用ocx控件常见bug解决办法,并且附上了java调用word控件的demo代码
1.如何将word文档转成html 2.ChangeWordToHtml
使用Jacob来处理Word文档,如Word转HTML等
使用jacob操作word文档的部分方法希望对你们能有所帮助