`
shappy1978
  • 浏览: 700251 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

POI3.6 对word2007解析总结

    博客分类:
  • J2EE
阅读更多

    刚刚接触XWPF,之前总算对HWPF摸得比较熟了,在POI对word2007摸索的过程中却发现不少问题。网上对POI的有用资料本来也不多,对于XWPF的几乎没有,这里做一点总结:

1 解析word2007需要7个包,poi,poi-scratchpad,poi-ooxml,poi-ooxml-schemas,xmlbeans,dom4j,geronimo-stax-api,缺少的话会运行时保错,暂未发现JDK版本的冲突。

2 XWPF似乎是自成体系,没有从HWPF继承已有的一些对象,不知道是原来的架构没做好还是两种word文件格式相差太大,这对于我原来的程序需要兼容多个版本word造成不少麻烦。

3 从已有的情况看,XWPF似乎是不支持isInTable的判断,检查XWPFWordExtractor解析getText的代码,居然是解析了文本,再解析表格,狂晕,作者还没找到定位table表格位置的方法?而且表格的内容似乎不再存于paragraph中了

由于XWPF采用openxml解析xml,并把所有同类的标签都分类解析,所以导出为文字时已经无法区分顺序了,实际上在docx中是顺序存放的,但是解析后把段落和表格分开存放,同时也就丢失了两者的位置关系,在Extractor就只能分别输出了,无语的半成品阿。

4 cell中居然可以支持多个段落,但是不再试用getParagraph方法,或者说只能获取一个段落getParagraph,必须用另外的方法读取。

5 从测试用例的程序可以看出,附件(如图片)是可以读出的,超链接应该也是可以的,没有详细查看。

6 cell居然无法获得宽度,郁闷,表格的问题相当多。看看它连getText都没来得及做可知完成的多么仓促

    public String getText() {
        //TODO
        return null;
    }

 

7 优势方面,理论上来说已经可以区分修订的添加或者删除内容了(虽然Extractor还是同样全部输出),但是和表格同一个德行,添加和删除的内容被分类读取出来了,同样无法判断顺序,于是Extractor按照一般、删除和插入的顺序输出文字,无语...

 

    protected XWPFParagraph(CTP prgrph, XWPFDocument docRef) {
        this.paragraph = prgrph;
        this.document = docRef;

        if (!isEmpty()) {
            // All the runs to loop over
            // TODO - replace this with some sort of XPath expression
            // to directly find all the CTRs, in the right order
            ArrayList<CTR> rs = new ArrayList<CTR>();
            rs.addAll(Arrays.asList(paragraph.getRArray()));

            for (CTSdtRun sdt : paragraph.getSdtArray()) {
                CTSdtContentRun run = sdt.getSdtContent();
                rs.addAll(Arrays.asList(run.getRArray()));
            }
            for (CTRunTrackChange c : paragraph.getDelArray()) {
                rs.addAll(Arrays.asList(c.getRArray()));
            }

            for (CTRunTrackChange c : paragraph.getInsArray()) {
                rs.addAll(Arrays.asList(c.getRArray()));
            }

8 (2-5)今天发现ooxml解析还存在一个bug,没有解析下面的标签

 

            <w:smartTag w:uri="urn:schemas-microsoft-com:office:smarttags" w:element="place">
              <w:r>
                <w:rPr>
                  <w:rFonts w:ascii="仿宋_GB2312" w:eastAsia="仿宋_GB2312" w:hAnsi="宋体" w:cs="宋体"/>
                  <w:b/>
                  <w:bCs/>
                  <w:kern w:val="0"/>
                  <w:szCs w:val="21"/>
                </w:rPr>
                <w:t>Para</w:t>
              </w:r>
            </w:smartTag>

 smallTag的标签不知道有什么意义,是word文档自己生成的,从word中看,标签中的内容和其他文字样式上没有任何不同,但是ooxml不会解析这个标签,导致文字丢失。

    目前而言,感觉XWPF完成的相当粗糙,例子很少,只有两个编辑的例子,文档则几乎没有,文档格式为xml,哪怕自己解析估计也不必POI差多少,不推荐使用。

9 宏替换标签直接把内容并入文本,导致缺少标志性标志(前缀和后缀),这样勉强替换可能误改正文,不过也没法子了。checkbox的例子,用了<w:instrText xml:space="preserve">标签,你可以看出word文档有多么繁琐。

            <w:r w:rsidRPr="00E7434E">
              <w:rPr>
                <w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体"/>
                <w:kern w:val="0"/>
                <w:szCs w:val="21"/>
              </w:rPr>
              <w:instrText xml:space="preserve">MACROBUTTON UncheckIt</w:instrText>
            </w:r>
            <w:r w:rsidRPr="00E7434E">
              <w:rPr>
                <w:rFonts w:ascii="宋体" w:hAnsi="Wingdings" w:cs="宋体" w:hint="eastAsia"/>
                <w:kern w:val="0"/>
                <w:szCs w:val="20"/>
              </w:rPr>
              <w:sym w:font="Wingdings" w:char="F0FE"/>
            </w:r>
            <w:r w:rsidRPr="00E7434E">
              <w:rPr>
                <w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体"/>
                <w:kern w:val="0"/>
                <w:szCs w:val="21"/>
              </w:rPr>
              <w:fldChar w:fldCharType="end"/>
            </w:r>
            <w:r w:rsidRPr="00E7434E">
              <w:rPr>
                <w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体"/>
                <w:kern w:val="0"/>
                <w:szCs w:val="21"/>
              </w:rPr>
              <w:t xml:space="preserve"></w:t>
            </w:r>
            <w:r w:rsidRPr="00157D2C">
              <w:rPr>
                <w:rFonts w:hint="eastAsia"/>
              </w:rPr>
              <w:t>固定资产</w:t>
            </w:r>
 

//*********************************************************

XWPF比较详细一点的介绍 http://hi.baidu.com/zrzx/blog/item/dde3bc31b9e248a15fdf0e36.html

 

费了很多功夫总算补充了POI无法定位表格位置和读取对象属性的问题,庆贺一个先。

分享到:
评论
2 楼 huzhiyong56 2012-05-09  
我现在也是在找怎么定位表格?楼主找到了吗?
1 楼 j2093 2010-07-14  
就是先不推荐使用XWPF呗

相关推荐

    poi3.7 poi3.6解析excel2007全jar包

    "poi3.7 poi3.6解析excel2007全jar包"指的是包含了Apache POI 3.7和3.6版本中用于解析Excel 2007 (.xlsx)文件的所有必需的JAR库。 Apache POI 3.6 和 3.7 版本之间的主要区别可能在于修复了一些已知的bug,增加了新...

    poi3.6 解析excel程序

    在本示例中,我们将重点关注如何使用Apache POI 3.6版本解析Excel 2003(.xls)文件。Excel 2003文件使用的是HSSF(Horrible Spreadsheet Format)API,它是POI项目早期版本支持的老式Excel格式。 Apache POI 提供...

    poi3.6_docs(English)

    "poi3.6_docs(English)"是针对Apache POI 3.6版本的英文官方帮助文档,它包含了详细的API参考、用户指南和示例代码,帮助开发者更好地理解和使用这个强大的工具。 1. **API参考**:这部分文档详细介绍了POI提供的各...

    poi操作总结 内附详细流程及poi-3.6.jar

    Apache POI是一个流行的Java库,专门用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。在本文中,我们将深入探讨如何使用Apache POI(POI-3.6.jar版本)来实现Excel的导入和导出功能。这是一项关键...

    poi3.6 event api

    而这里的重点是"poi3.6 event api",它指的是XSSFEventUserModel API,这是一种低内存占用的读取Excel文件的方法,特别适合处理大型工作簿。 XSSFEventUserModel API是基于事件驱动模型的,与传统的XSSFUserModel ...

    POI-3.6 解析Excel(2003\2010)的jar集合

    标题提到的是POI-3.6版本,这是一个较早的版本,但仍广泛应用于对Excel 2003、2010格式的支持。 **Apache POI 知识点** 1. **POI 概述**: Apache POI 是Apache软件基金会的一个项目,它的主要目标是使Java开发者...

    poi-bin-3.6-20091214

    - `poi-scratchpad-3.6-20091214.jar`:此库包含了一些实验性的和未稳定的功能,例如对Word和PowerPoint的支持。 - `poi-ooxml-3.6-20091214.jar`:这个库提供了与OOXML文件交互的功能,如处理.xlsx、.docx和.pptx...

    poi-scratchpad-3.6-20091214

    在描述中提到的"当你试图解析word文档时,此包必不可少",意味着这个Apache POI版本特别适用于读取和写入Word文档。POI提供了HWPF(Horrible Word Processor Format)组件来处理老版本的Word文档(.doc),以及XWPF...

    poi_3.6 all rar

    1. `poi-ooxml-schemas-3.6-20091214.jar`: 包含了微软Office Open XML(OOXML)的XML模式定义,这些模式用于解析和生成OOXML文件,如Word的`.docx`文档。 2. `xmlbeans-2.3.0.jar`: 这是一个XML处理库,Apache POI...

    poi导出excel2007

    ### 使用Apache POI导出Excel 2007并避免内存溢出问题 #### 背景介绍 在处理大量数据时,使用Java导出Excel文件可能会遇到内存溢出的问题,尤其是在导出Excel 2007(.xlsx格式)时更为常见。这是因为传统的`...

    poi-3.16.jar,poi-ooxml-3.16.jar,poi-ooxml-schemas-3.16.jar

    HSSF和HWPF分别用于处理老版本的BIFF格式(Excel 97-2007)和Word 97-2007格式,而XSSF和XWPF则用于处理Office Open XML(OOXML)格式的新版Excel和Word文件。 2. `poi-ooxml-3.16.jar`:这个库提供了对OOXML格式的...

    POI兼容2003 和 2007

    例如,POI-3.6版本可以很好地处理Excel 2003和Excel 2007文件。 - 在处理大量数据时,要注意内存占用问题,可以通过设置JVM参数如`-Xms256m-Xmx512m-XX:PermSize=128M-XX:MaxPermSize=256M`来调整堆内存大小。 - ...

    poi的所有jar包,poi, poi-ooxml,poi-ooxml-schemas的各个版本jar

    POI的OOXML库包含SXSSF(Streaming Usermodel API)和XSSF(XML Spreadsheet Format),前者用于处理大量数据,可以避免内存消耗过大,后者则是对XML格式的Excel文档的完全解析模型。 3. **poi-ooxml-schemas**:此...

    poi-scratchpad-3.6-20091214.jar

    当你试图解析word文档时,此包必不可少!!1

    POI Excel官方源码及文档及实例

    Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。这个资源包包含了POI项目的源代码、相关文档以及示例,可以帮助开发者深入理解如何使用POI来操作Excel文件。 一...

    解析mpp文件的jar包

    本文将详细介绍如何利用给定的两个jar包——mpxj.jar和poi-3.6-20091214.jar来解析MPP文件。 首先,`mpxj.jar`是一个专门用于处理Microsoft Project文件的Java库。它提供了丰富的API,可以读取和写入MPP文件,包括...

    poi官网ZIP文件

    Apache POI 是一个开源项目,专门用于处理微软的Office文档格式,如Excel(.xlsx、.xls)、Word(.docx、.doc)和PowerPoint(.pptx、.ppt)。在Java环境中,Apache POI 提供了一套API,使得开发者能够方便地读取、...

    java转换pdf、word为jpg图片,并打包exe

    在这个项目中,POI被用来读取Word文档的内容,并将其渲染为图像。以下是如何使用POI进行转换的基本步骤: 1. 引入poi-3.6-20091214.jar库。 2. 创建`HWPFDocument`对象来加载Word文档。 3. 使用`Pictures`类来获取...

    查看进度文件的小工具

    4. poi-3.6-20091214.dll:这是Apache POI库的一个版本,用于处理Microsoft Office文件格式,尤其是Excel(XLS和XLSX)。尽管MPP文件不是Excel格式,但POI库可能被用作解析MPP内部结构的一部分,因为MPP文件可以包含...

    java写的可配置的抽奖程序源码,所对应的类库集合

    1. poi-ooxml-schemas-3.6-20091214.jar、poi-3.6-20091214.jar、poi-scratchpad-3.6-20091214.jar:Apache POI 是一个用于处理Microsoft Office格式文件的Java库,如Excel(.xls 和 .xlsx)和Word(.doc 和 .docx)...

Global site tag (gtag.js) - Google Analytics