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

docx4j 处理word2007文档相关推荐

  1. 计算机文档插入操作,电脑在word2007文档中插入数学公式的方法

    Word 2007是一款老牌的办公软件套装,但基本的文字.表格.演示都能完成,运行速度快,体积小巧赢得很多用户喜爱.数学老师在word2007文档编辑公式类的计算题,需要插入数学公式,这该如何操作?如 ...

  2. word2007文档无法编辑怎么办

    通过另存为也不行,我们必须跳出这个文档,那么第一步我们新建一个空白的word文档. word2007文档无法编辑怎么办? 在菜单中选择"插入"-"对象"-&qu ...

  3. 在Word2003中打开Word2007文档的方法及教程下载

    1.到微软网站下载以下工具: http://download.microsoft.com/download/6/9/E/69EA942D-4636-4350-A526-0BFD9771A12A/O20 ...

  4. 在Word2007文档中设置页面边框

    用户可以在Word2007文档中设置普通的线型页面边框和各种图标样式的艺术型页面边框,使Word2007文档更富有表现力.在Word2007文档中设置页面边框的步骤如下所述: 1.打开Word2007 ...

  5. 去掉Word2007文档眉头的横线

    去掉Word2007文档眉头的横线 在使用 Word2007 编辑文档时文档的上方出现一条横线,打印时该横线也被打印出来. 1.打开文档后,在"插入"中打开"页眉&quo ...

  6. docx4j操作word文档之生成页码、合并多个文档

    docx4j操作word文档: 动态生成表格行数并填充数据 单元格内填充图片 合并多个word文档(包含页码,纸张方向等等) 1.动态生成表格行数并填充数据 首先创建模板文件.docx,如图: 代码如 ...

  7. 利用OpenXml生成Word2007文档

    一.OpenXml简介 利用C#生成Word文档并非一定要利用OpenXml技术,至少可以使用微软提供的Office相关组件来编程,不过对于Office2007(确切的说是Word.Excel和Pow ...

  8. 利用OpenXml生成Word2007文档(转)

    转自:http://blog.csdn.net/francislaw/article/details/7568317 一.OpenXml简介 利用C#生成Word文档并非一定要利用OpenXml技术, ...

  9. Docx4j替换word文档的页眉

    Docx4j替换word文档的页眉 目前国内关于Docx4j的帖子少的可怜,看来看去都是那几个.本人使用Docx4j也有一段时间,虽然还有许多东西没了解全,但在这边想分享我的学习经验,互相交流,也方便 ...

最新文章

  1. 从试用到使用:计算机视觉产业新一轮发展的起步年
  2. 调查与讨论:你在调用别人接口的时候有考虑过失败情况吗?
  3. MFC多视图与重绘效率
  4. ad采样频率_AD转换器是什么?快来一起学习一下
  5. python写日志到文件_python 通过logging写入日志到文件和控制台的实例
  6. 如何免费制作支付宝微信合并收款二维码?
  7. 磨煤机监测参数及实际运行数据
  8. 基于Java Servlet 构建的在线音乐服务器
  9. 计算机组成原理试题无答案,计算机组成原理试题及答案
  10. python xlrd获取excel行数_Python 使用xlrd库读取excel,获取最大行和最大列等
  11. 【如何设定系统的定时与延迟任务】
  12. Cocos Creator基于热更新的分包方案
  13. Python机器学习13——主成分分析
  14. 使用ppencode\rrencode\jjencode\aaencode进行好玩的代码混淆
  15. 上自由职客,Java工程师不再朝九晚五
  16. 2020年11月14日
  17. 全球与中国扩管器驱动市场深度研究分析报告
  18. 如何安全升级 TiDB
  19. 百度分享不支持https解决方法
  20. 榕力为某工业外贸大型国企公司搭建多媒体会议室大屏演示云平台

热门文章

  1. 转:统计与绘图神器seaborn库入门
  2. xss攻击解决方案php项目,php 过滤存储型XSS攻击,_PHP_ 少侠科技
  3. 【2023校招】吉比特雷霆研发岗笔试AK题解(CF2000~2200
  4. 9008刷机 小米max2_小米手机9008短接图,可进行深度刷机解锁操作!―远程580快修...
  5. PYTHON实现寻找完美立方数
  6. 〖编程初学者的自我修养 - 职业规划篇②〗- 进入职场前必须要考虑的问题
  7. dot ue4_UE4 常用数学
  8. 笔记本可以升级鸿蒙吗,华为首款纯国产笔记本,麒麟990+UOS,未来还能升级鸿蒙系统...
  9. 三年过去了,小米为何还不指纹解锁?
  10. 【2019年6月全新大学英语四六级】商志英语4级 6级 CET4 CET6 持续更新中 资料网盘