360SDN.COM

首页/Java/列表

docx4j 处理word2007文档

来源:  2017-10-24 14:46:28    评论:0点击:

docx4j 处理word2007文档

一、处理word的第3方java项目

Word2007采用ECMA-376标准,在java开发中,处理word文档有很多优秀的第三方开源项目,例如:
1)POI(兼容doc、docx文件)
  官方网站:http://poi.apache.org/
  网上例子很多,由于发布时间较早,很多外国网站的例子,建议Google搜索。
2)Jacob
  下载地址:http://sourceforge.net/projects/jacob-project/
  原理讲解:http://www.ibm.com/developerworks/cn/java/j-lo-jacob/。
3)docx4j
  下载地址:http://www.docx4java.org/trac/docx4j
  示例:http://zhuerg.blog.163.com/blog/static/1404016362014223102843969/
4)PageOffice
  官方网站:http://www.zhuozhengsoft.com/。

二、项目需求

在就近的项目中,需要将数据动态生成固定格式的word文档报告,并输出成html,在浏览器上查看,并且用户可以修改生成后的报告。标准文档中包含大量的文字、表格、和chart图表。原先使用帆软报表来做,格式非常难处理、且导出格式都变型了,另外一个大问题是chart图表导出都变成了图片,用户不能修改。通过查询资料最后利用Docx4j项目来处理。
Docx4j项目处理word2007以上版本的word文档,既后缀为docx的word文档,包括创建新的docx,读取docx文档内容等。现有的Docx4j项目能获取文本、表格、图片等,但对一些二进制的部件只提供了获取方法,需要在此基础上二次开发,另外对word中的chart图片处理也需要二次开发。Docx4j导出成html也需要针对chart图表来特殊处理。

三、解决方案

考虑到Docx4j项目能力,解决方案采用docx文档+替换变量+替换图片+替换chart图表数据的方式来解决。就项目中遇到的问题做简单的描述。
1、文档格式
在项目中,文档格式是一个非常头痛的事情,从新新建一个word文档,文档格式处理非常麻烦,我通过一个编辑好的word文档模板,在Docx4j中能读取对应的格式,通过保留原有格式,并将处理后的文档另存为需要的目标文档,来避免文档格式的操作。这样就可以根据用户需要设置用户满意的格式了。
2、文字处理
在word存储格式中,文字都以xml格式存储,具体格式例子如下:
<w:p><w:pPr><w:pStyle w:val="2"/><w:jc w:val="center"/></w:pPr><w:r><w:t>例程模板</w:t></w:r></w:p>
在Docx4j中,会解析成P类,并将内容解析成Text类。在定义的word模板中,将需要替换的文字使用${变量名}来替换,并将需要的格式在模板中设置好。在利用Docx4j处理文字时,先收集${变量名},让后统一替换,这样就能完成文字的处理了。
3、表格处理
在word存储格式中,表格都以xml格式存储,具体格式例子如下:
<w:tbl>
……
<w:tblGrid>……</w:tblGrid>
<w:tr><w:tblPrEx>……</w:tblPrEx>
<w:tc>……<w:t>描述</w:t>……</w:tc>
<w:tc>……<w:t>描述</w:t>……</w:tc>
</w:tr>
</w:tbl>
其中,<w:tbl>是一个表单的开发,<w:tblGrid>表格列表信息,<w:tr>一行、<w:tc>一个单元。在处理表格时,将相应的单元处理替换就可以了。
动态添加行时,需要注意行的格式问题,可以通过在模板中定制好样式的行,通过拷贝该行来动态新增指定格式的列表行。

4、图片处理

在word存储格式中,图片都以xml格式指向说明,以二进制方式存储在word文档中。Word文档存储采用压缩包格式存储的,在Docx4j中可以通过代码来读取图片文件的二进制文件。Xml格式如下:
<w:drawing>
<wp:inline >……<pic:pic >
<pic:blipFill>
<a:blip r:embed="rId4">
</pic:blipFill>
</pic:pic>
……</wp:inline>
</w:drawing>

<w:drawing>
<wp:anchor >……<pic:pic >
<pic:blipFill>
<a:blip r:embed="rId4">
</pic:blipFill>
</pic:pic>
……</wp:anchor>
</w:drawing>
图片的xml表示有两种方式,一种内嵌、一种锚的方式。两种方式处理都差不多,都是通过获取<a:blip r:embed="rId4">中的id,然后通过id获取部件关联关系,关联关系的xml如下:
<Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image1.png"/>
并通过关联关系中的target在部件管理中获取具体的二进制内容。
替换图片,可以直接通过新建一个<wp:inline >或<wp:anchor >替换就可以了,在代码中,通过
BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes);
Inline inline = imagePart.createImageInline(null, "", ++no, ++no, false);
Bytes为替换的图片的byts数组。
5、chart图表处理
Chart图片处理就比较麻烦了,在word文档中chart图表都是采用DrawingML标准通过xml格式来存储, 具体xml格式如下:
<w:drawing>
<wp:inline >……<c:chart r:id="rId5" />
</pic:pic>
……</wp:inline>
</w:drawing>

<w:drawing>
<wp:anchor >……<c:chart r:id="rId5" />
……</wp:anchor>
Chart与图片类似,只不过图片通过pic:blipFill来指向相应的part,chart通过c:chart 中的r:id来指向。Chart在word部件中是利用xml文字方式保存。具体格式如下:
<c:chartSpace >……
<c:chart>
<c:view3D><c:rAngAx val="1"/></c:view3D>
<c:plotArea> ……
<c:bar3DChart>……
<c:ser>……
<c:cat>……<c:pt idx="0">
<c:v>500kV</c:v></c:pt>……</c:pt>
……</c:cat>
<c:val>……
<c:pt idx="0"><c:v>53</c:v></c:pt>
</c:val>
</c:ser>
……
</c:chart></c:chartSpace>
其中 c:plotArea 表示chart类型,c:ser表示chart图表中的系列,c:cat表示分类,c:val表示值。根据业务将相应的数据变成类似的格式填充,就可以修改chart图表了。
6、Word导出html
Docx4j项目中包含word导出html的方法,但由于对chart没有处理,需要单独处理chart。Docx4j导出是利用扩展样式表转换语言xlst来实现了,通过修改xlst模板文件,匹配c:chart,让后单独处理chart数据就可以了。
在html中处理chart可以采用jfreechart变成图片,也可以采用百度的echarts来处理。下面主要介绍使用echarts来处理。
ECharts是一款由百度前端技术部开发的,基于Javascript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表.提供大量常用的数据可视化图表,底层基于ZRender(一个全新的轻量级canvas类库),创建了坐标系,图例,提示,工具箱等基础组件,并在此上构建出折线图(区域图)、柱状图(条状图)、散点图(气泡图)、饼图(环形图)、K线图、地图、力导向布局图以及和弦图,同时支持任意维度的堆积和多图表混合展现。项目URL:http://echarts.baidu.com/
在处理chart图表时,需要引入支撑js,包括jquery,echarts。同时还要在处理chart图表时,既要生成对应的div 的html节点,同时又要生成对应百度echarts的配置对象Option,载入页面后调入百度echart的生成方法。

交流方式
Email : hhwygang@126.com
QQ: 284587931
为您推荐

友情链接 |九搜汽车网 |手机ok生活信息网|ok生活信息网|ok微生活
 Powered by www.360SDN.COM   京ICP备11022651号-4 © 2012-2016 版权