Docx4J知识积累培训讲学

  • 格式:doc
  • 大小:473.00 KB
  • 文档页数:20

学习资料

精品文档 Docx4J概述:

Docx4j是Java操作office2007+中的Word、Excel、PPT的开源项目,其主要针对WordXML同时也可以处理Excel和PPT,比POI要强大很多.

Docx4J基于开源协议ASLv2。 ASL是一个广泛适用于社区开源软件并被开源业界所认可的协议,该协议更有益于商业化产品的开发和再发行。遵循ASL发行的代码和其它许可协议可以整合成为一个闭源的商业产品,然后被其它开发人员再次发行。这不像开源许可协议。"类GPL许可协议"(有些像GPL),通常情况下用于确保其它类似开发成员再发行已经被发布并修改的代码及其衍生代码的开源和可发布性。

Docx4J能做什么:

1. 打开已存在docx(从文件系统、SMB/CIFS、使用VFS的WebDAV),pptx,xlsx

2. 创建新的docx、pptx、xlsx

3. 编程式地操作上面打开的文档

Docx4J特殊的功能支持:

1. 模版替换;CustomXML绑定

2. 生产/消费Word2007的xmlPackage(pkg)格式

3. 作为docx保存docx到文件系统(zipped)或者保存到JCR(unzipped)

4. 应用转换,包括常见过滤器

5. 作为HTML或者PDF导出

6. 比较文档、段落或者sdt(内容控件)之间的差异

7. 字体支持(字体替换及使用任何文档中嵌入的字体)

一些有用的链接:

Docx4J:

/trac/docx4j

Sample codes:

docx4j, pptx4j, xlsx4j,

生成docx文件(第一部分),

生成docx文件(第二部分),

使用docx4j编程式地创建复杂的Word(.docx)文档,

向Docx4j生成的word文档添加图片和布局--第一部分,

向Docx4j生成的word文档中添加布局--第二部分

docx4j -- 使用Java处理word2007(.docx)文档

学习资料

精品文档 Docx4J的使用

一 打开文件/模板

Docx4J中,在内存中操作的word文档是“WordprocessingMLPackage”类型的对象(本文以下简称包)。

在编辑一个word文档前,开发者需要选择:创建一个新的空白包,并逐一将需要的内容填充进去,或者打开一个已有的文档,并在里面添加/替换新的内容。

前者思路比较简单,比较适合简单文档的创建。但由于添加每条新内容时,都需要手动进行设置其各项参数(比如表格的行宽、列宽、边框等),且添加修改复杂控件(公式、页眉页脚)的过程都比较繁琐,所以在创建格式复杂的文档时不是很建议。

后者需要事先制作一个模板文档,添加不同的占位符和各种模板信息,在准备上比前者复杂。但也具有很多优点:可以简化细节参数的调整(不需要手动调整表格、段落的具体细节参数)从而将精力集中到文档内容上;复杂的文档部分(如公式、复选框等)可以直接从模板中读取,只需要在其基础上修改文字等内容部分,而避开了繁琐的创建操作等。在创建格式复杂的文档时,这个方法相比前者可以精简大量代码。(本文之后将主要基于该方法进行说明)

二 保存文件

当结束对包的编辑时,开发者可以选择多种方式进行保存。

三 常用类型

Docx4J支持所有的docx内容格式,其中比较常见的有如下几种:

1. Text:基本的文字内容 学习资料

精品文档 2. R: 文字格式信息

3. P: 段落,可以单独使用,也可以添加到单元格(Tc)等作为内容

以下代码创建了新文本,并将其填到指定的单元格中

1. /**

2. * 功能描述:填充单元格内容

3. * @param tc 单元格对象

4. * @param data 内容

5. * @param fontFamily 字体

6. * @param fontSize 字号

7. * @param isBlod 是否加粗

8. * @param jcEnumeration 对齐方式

9. * @author myclover

10. */

11. private static void fillCellData(Tc tc , String data , String fontFamily , String fontSize , boolean isBlod , JcEnumeration jcEnumeration){

12. ObjectFactory factory = Context.getWmlObjectFactory();

13. org.docx4j.wml.P p = (P) XmlUtils.unwrap(tc.getContent().get(0));

14. //设置表格内容的对齐方式

15. setCellContentStyle(p , jcEnumeration);

16. org.docx4j.wml.Text t = factory.createText();

17. t.setValue(data);

18. org.docx4j.wml.R run = factory.createR();

19. //设置表格内容字体样式

20. run.setRPr(getRPr(fontFamily, fontSize, isBlod));

21. TcPr tcpr = tc.getTcPr();

22. if(tcpr == null){

23. tcpr = factory.createTcPr();

24. }

25. //设置内容垂直居中

26. CTVerticalJc valign = factory.createCTVerticalJc();

27. valign.setVal(STVerticalJc.CENTER);

28. tcpr.setVAlign(valign);

29. run.getContent().add(t);

30. p.getContent().add(run);

31. }

32.

33. /**

34. * 功能描述:填充单元格内容,小五号,宋体,内容居中

35. * @param tc 单元格对象

36. * @param data 数据

37. * @param isBlod 是否加粗

38. * @author myclover

39. */

40. public static void fillCellData(Tc tc , String data , boolean isBlod ){ 学习资料

精品文档 41. fillCellData(tc, data, "宋体", "18", isBlod, JcEnumeration.CENTER);

42. }

4. Tbl:表格,每个表格含有一行或多行(Tr),每行有一个或者多个单元格(Tc)

Tc是表格用于存储信息的基本单位

以下代码创建了一个“rows行、cols列、行宽为widths“的空表格

1. public static Tbl createTable(int rows, int cols, int[] widths) {

2. ObjectFactory factory = Context.getWmlObjectFactory();

3. Tbl tbl = factory.createTbl();

4. // w:tblPr

5. StringBuffer tblSb = new StringBuffer();

6. tblSb.append("");

7. tblSb.append("");

8. tblSb.append("");

9. //上边框双线

10. tblSb.append("");

11. //左边无边框

12. tblSb.append("");

13. //下边框双线

14. tblSb.append("");

15. //右边无边框

16. tblSb.append("");

17. tblSb.append("");

18. tblSb.append("");

19. tblSb.append("");

20. TblPr tblPr = null;

21. try {

22. tblPr = (TblPr) XmlUtils.unmarshalString(tblSb.toString());

23. } catch (JAXBException e) {

24. e.printStackTrace();

25. }

26. tbl.setTblPr(tblPr);

27. if (tblPr != null) {

28. Jc jc = factory.createJc();

29. //单元格居中对齐

30. jc.setVal(JcEnumeration.CENTER);

31. tblPr.setJc(jc);

32. CTTblLayoutType tbll = factory.createCTTblLayoutType();

33. // 固定列宽

34. tbll.setType(STTblLayoutType.FIXED);