Docx4J知识积累.docx
《Docx4J知识积累.docx》由会员分享,可在线阅读,更多相关《Docx4J知识积累.docx(27页珍藏版)》请在冰豆网上搜索。
Docx4J知识积累
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:
.docx4java.org/trac/docx4j
Samplecodes:
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("tblPr ").append(Namespaces.W_NAMESPACE_DECLARATION).append(">");
7. tblSb.append("tblStyle w:
val=\"TableGrid\"/>");
8. tblSb.append("tblW w:
w=\"0\" w:
type=\"auto\"/>");
9. //上边框双线
10. tblSb.append("tblBorders>top w:
val=\"double\" w:
sz=\"4\" w:
space=\"0\" w:
color=\"auto\"/>");
11. //左边无边框
12. tblSb.append("left w:
val=\"none\" w:
sz=\"0\" w:
space=\"0\" w:
color=\"auto\"/>");
13. //下边框双线
14. tblSb.append("bottom w:
val=\"double\" w:
sz=\"4\" w:
space=\"0\" w:
color=\"auto\"/>");
15. //右边无边框
16. tblSb.append("right w:
val=\"none\" w:
sz=\"0\" w:
space=\"0\" w:
color=\"auto\"/>");
17. tblSb.append("
tblBorders>");
18. tblSb.append("tblLook w:
val=\"04A0\"/>");
19. tblSb.append("
tblPr>");
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);
35. tblPr.setTblLayout(tbll);
36. }
37. // tblGrid>gridCol w:
w="4788"/>
38. TblGrid tblGrid = factory.createTblGrid();
39. tbl.setTblGrid(tblGrid);
40. // Add required gridCol w:
w="4788"/>
41. for (int i = 1; i <= cols; i++) {
42. TblGridCol gridCol = factory.createTblGridCol();
43. gridCol.setW(BigInteger.valueOf(widths[i - 1]));
44. tblGrid.getGridCol().add(gridCol);
45. }
46. // Now the rows
47. for (int j = 1; j <= rows; j++) {
48. Tr tr = factory.createTr();
49. tbl.getContent().add(tr);
50. // The cells
51. for (int i = 1; i <= cols; i++) {
52. Tc tc = factory.createTc();
53. tr.getContent().add(tc);
54. TcPr tcPr = factory.createTcPr();
55. tc.setTcPr(tcPr);
56. // tcW w:
w="4788" w:
type="dxa"/>
57. TblWidth cellWidth = factory.createTblWidth();
58. tcPr.setTcW(cellWidth);
59. cellWidth.setType("dxa");
60. cellWidth.setW(BigInteger.valueOf(widths[i - 1]));
61. tc.getContent().add(factory.createP());
62. }
63.
64. }
65. return tbl;
66. }
四指定格式创建文档
1.修改文档格式
页边距
67. /**
68. * 功能描述:
设置页边距
69. * param wordPackage 文档处理包对象
70. * param top 上边距
71. * param bottom 下边距
72. * param left 左边距
73. * param right 右边距
74. * author myclover
75. */
76. public static void setMarginSpace(WordprocessingMLPackage wordPackage , String top , String bottom , String left , String right ){
77. ObjectFactory factory = Context.getWmlObjectFactory();
78. PgMar pg = factory.createSectPrPgMar();
79. pg.setTop(new BigInteger(top));
80. pg.setBottom(new BigInteger(bottom));
81. pg.setLeft(new BigInteger(left));
82. pg.setRight(new BigInteger(right));
83. wordPackage.getDocumentModel().getSections().get(0).getSectPr().setPgMar(pg);
84. }
85.
86. /**
87. * 功能描述:
设置页边距,上下边距都为1440,2.54厘米
88. * param wordPackage 文档处理包对象
89. * param left 左边距
90. * param right 右边距
91. * author myclover
92. */
93. public static void setMarginSpace(WordprocessingMLPackage wordPackage , String left , String right ){
94. setMarginSpace(wordPackage, "1440", "1440", left, right);
95. }
96.
97. /**
98. * 功能描述:
设置页边距,上下边距都为1440,2.54厘米,左右边距都为1797,3.17厘米
99. * param wordPackage 文档处理包对象
100. * author myclover
101. */
102. public static void setMarginSpace(WordprocessingMLPackage wordPackage){
103. setMarginSpace(wordPackage, "1440", "1440", "1797", "1797");
104. }
文档只读
1. /**
2. * 功能描述:
设置文档是否只读,包括容和样式
3. * param wordPackage 文档处理包对象
4. * param isReadOnly 是否只读
5. * throws Exception
6. * author myclover
7. */
8. public static void setReadOnly(WordprocessingMLPackage wordPackage , boolean isReadOnly)throws Exception{
9. byte[] bt = "".getBytes();
10. if(isReadOnly){
11. bt = "123456".getBytes();
12. }
13. ObjectFactory factory = Context.getWmlObjectFactory();
14. //创建设置文档对象
15. DocumentSettingsPart ds = wordPackage.getMainDocumentPart().getDocumentSettingsPart();
16. if(ds == null){
17. ds = new DocumentSettingsPart();
18. }
19. CTSettings cs = ds.getJaxbElement();
20. if(cs == null){
21. cs = factory.createCTSettings();
22. }
23. //创建文档保护对象
24. CTDocProtect cp = cs.getDocumentProtection();
25. if(cp == null){
26. cp = new CTDocProtect();
27. }
28. //设置加密方式
29. cp.setCryptProviderType(STCryptProv.RSA_AES);
30. cp.setCryptAlgorithmClass(STAlgClass.HASH);
31. //设置任何用户
32. cp.setCryptAlgorithmType(STAlgType.TYPE_ANY);
33. cp.setCryptAlgorithmSid(new BigInteger("4"));
34. cp.setCryptSpinCount(new BigInteger("50000"));
35. //只读
36. if(isReadOnly){
37. cp.setEdit(STDocProtect.READ_ONLY);
38. cp.setHash(bt);
39. cp.setSalt(bt);
40. //设置容不可编辑
41. cp.setEnforcement(true);
42. //设置格式不可编辑
43. cp.setFormatting(true);
44. }else{
45. cp.setEdit(STDocProtect.NONE);
46. cp.setHash(null);
47.