版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Docx4J概述: Docx4j是Java操作office2007+中的Word、Excel、PPT的开源项目,其主要针对WordXML同时也可以处理Excel和PPT,比POI要强大很多.Docx4J基于开源协议ASLv2。 ASL是一个广泛适用于社区开源软件并被开源业界所认可的协议,该协议更有益于商业化产品的开发和再发行。遵循ASL发行的代码和其它许可协议可以整合成为一个闭源的商业产品,然后被其它开发人员再次发行。这不像开源许可协议。"类GPL许可协议"(有些像GPL),通常情况下用于确保其它类似开发成员再发行已经被发布并修改的代码及其衍生代码的开源和可发布性
2、。Docx4J能做什么:1. 打开已存在docx(从文件系统、SMB/CIFS、使用VFS的WebDAV),pptx,xlsx2. 创建新的docx、pptx、xlsx3. 编程式地操作上面打开的文档Docx4J特殊的功能支持:1. 模版替换;CustomXML绑定2. 生产/消费Word2007的xmlPackage(pkg)格式3. 作为docx保存docx到文件系统(zipped)或者保存到JCR(unzipped)4. 应用转换,包括常见过滤器5. 作为HTML或者PDF导出6. 比较文档、段落或者sdt(内容控件)之间的差异7. 字体支持(字体替换及使用任何文档中嵌入的字体)一些有用
3、的链接:Docx4J: Sample codes:docx4j, pptx4j, xlsx4j, 生成docx文件(第一部分),生成docx文件(第二部分),使用docx4j编程式地创建复杂的Word(.docx)文档,向Docx4j生成的word文档添加图片和布局-第一部分,向Docx4j生成的word文档中添加布局-第二部分 docx4j - 使用Java处理word2007(.docx)文档Docx4J的使用一 打开文件/模板Docx4J中,在内存中操作的word文档是“WordprocessingMLPackage”类型的对象(本文以下简称包)。在编辑一个word文档前,开发者需要选择
4、:创建一个新的空白包,并逐一将需要的内容填充进去,或者打开一个已有的文档,并在里面添加/替换新的内容。前者思路比较简单,比较适合简单文档的创建。但由于添加每条新内容时,都需要手动进行设置其各项参数(比如表格的行宽、列宽、边框等),且添加修改复杂控件(公式、页眉页脚)的过程都比较繁琐,所以在创建格式复杂的文档时不是很建议。后者需要事先制作一个模板文档,添加不同的占位符和各种模板信息,在准备上比前者复杂。但也具有很多优点:可以简化细节参数的调整(不需要手动调整表格、段落的具体细节参数)从而将精力集中到文档内容上;复杂的文档部分(如公式、复选框等)可以直接从模板中读取,只需要在其基础上修改文字等内容
5、部分,而避开了繁琐的创建操作等。在创建格式复杂的文档时,这个方法相比前者可以精简大量代码。(本文之后将主要基于该方法进行说明)二 保存文件当结束对包的编辑时,开发者可以选择多种方式进行保存。三 常用类型Docx4J支持所有的docx内容格式,其中比较常见的有如下几种:1. Text:基本的文字内容2. R:文字格式信息 3. P:段落,可以单独使用,也可以添加到单元格(Tc)等作为内容以下代码创建了新文本,并将其填到指定的单元格中1. /* 2. * 功能描述:填充单
6、元格内容 3. * param tc 单元格对象 4. * param data 内容 5. * param font
7、Family 字体 6. * param fontSize 字号 7. * param isBlod 是否加粗 8. * param jcEnumeration 对齐方式
8、9. * author myclover 10. */ 11. private static void fillCellData(Tc tc , String data , String fontFamily , String fontSize
9、60;, boolean isBlod , JcEnumeration jcEnumeration) 12. ObjectFactory factory = Context.getWmlObjectFactory(); 13. org.docx4j.wml.P p
10、;= (P) XmlUtils.unwrap(tc.getContent().get(0); 14. /设置表格内容的对齐方式 15. setCellContentStyle(p , jcEnumeration); 16.
11、60; org.docx4j.wml.Text t = factory.createText(); 17. t.setValue(data); 18. org.docx4j.wml.R run = factory.createR(); 19.
12、160; /设置表格内容字体样式 20. run.setRPr(getRPr(fontFamily, fontSize, isBlod); 21. TcPr tcpr = tc.getTcPr(); 22. &
13、#160; if(tcpr = null) 23. tcpr = factory.createTcPr(); 24. 25.
14、0; /设置内容垂直居中 26. CTVerticalJc valign = factory.createCTVerticalJc(); 27. valign.setVal(STVerticalJc.CENTER); 28.
15、160; tcpr.setVAlign(valign); 29. run.getContent().add(t); 30. p.getContent().add(run); 31. 32.
16、; 33. /* 34. * 功能描述:填充单元格内容,小五号,宋体,内容居中 35. * param tc 单元格对象 36. * param data 数据 37.
17、; * param isBlod 是否加粗 38. * author myclover 39. */ 40. public static void fillCellData(Tc tc , String data
18、, boolean isBlod ) 41. fillCellData(tc, data, "宋体", "18", isBlod, JcEnumeration.CENTER); 42. 4. Tbl:表格,每个表格含有一行或多行(Tr),每行有一个或者多个单元格(Tc
19、)Tc是表格用于存储信息的基本单位以下代码创建了一个“rows行、cols列、行宽为widths“的空表格1. public static Tbl createTable(int rows, int cols, int widths) 2. ObjectFactory factory = Context.getWmlObjectFactory();
20、; 3. Tbl tbl = factory.createTbl(); 4. / w:tblPr 5. StringBuffer tblSb = new StringBuffer
21、(); 6. tblSb.append("<w:tblPr ").append(Namespaces.W_NAMESPACE_DECLARATION).append(">"); 7. tblSb.append("<w:tblStyle w:val="TableGri
22、d"/>"); 8. tblSb.append("<w:tblW w:w="0" w:type="auto"/>"); 9. /上边框双线 10.
23、160; tblSb.append("<w:tblBorders><w:top w:val="double" w:sz="4" w:space="0" w:color="auto"/>"); 11. /左边无边框 12.
24、160; tblSb.append("<w:left w:val="none" w:sz="0" w:space="0" w:color="auto"/>"); 13. /下边框双线 14.
25、;tblSb.append("<w:bottom w:val="double" w:sz="4" w:space="0" w:color="auto"/>"); 15. /右边无边框 16. tblSb.appe
26、nd("<w:right w:val="none" w:sz="0" w:space="0" w:color="auto"/>"); 17. tblSb.append("</w:tblBorders>"); 18.
27、 tblSb.append("<w:tblLook w:val="04A0"/>"); 19. tblSb.append("</w:tblPr>"); 20. TblPr tblPr = null;
28、0; 21. try 22. tblPr = (TblPr) XmlUtils.unmarshalString(tblSb.toString(); 23.
29、catch (JAXBException e) 24. e.printStackTrace(); 25. 26. tbl.setTblPr(tblPr);
30、; 27. if (tblPr != null) 28. Jc jc = factory.createJc(); 29.
31、160; /单元格居中对齐 30. jc.setVal(JcEnumeration.CENTER); 31. tblPr.setJc(jc); 32.
32、 CTTblLayoutType tbll = factory.createCTTblLayoutType(); 33. / 固定列宽 34. tbll.se
33、tType(STTblLayoutType.FIXED); 35. tblPr.setTblLayout(tbll); 36. 37. / <w:tblGrid><w:
34、gridCol w:w="4788"/> 38. TblGrid tblGrid = factory.createTblGrid(); 39. tbl.setTblGrid(tblGrid); 40. &
35、#160; / Add required <w:gridCol w:w="4788"/> 41. for (int i = 1; i <= cols; i+) 42.
36、160; TblGridCol gridCol = factory.createTblGridCol(); 43. gridCol.setW(BigInteger.valueOf(widthsi - 1); 44.
37、160; tblGrid.getGridCol().add(gridCol); 45. 46. / Now the rows 47. for (int j = 1;
38、 j <= rows; j+) 48. Tr tr = factory.createTr(); 49. tbl.getContent().add(tr); 5
39、0. / The cells 51. for (int i = 1; i <= cols; i+) 52.
40、60; Tc tc = factory.createTc(); 53. tr.getContent().add(tc); 54. &
41、#160; TcPr tcPr = factory.createTcPr(); 55. tc.setTcPr(tcPr); 56.
42、 / <w:tcW w:w="4788" w:type="dxa"/> 57. TblWidth cellWidth = factory.createTblWidth(
43、); 58. tcPr.setTcW(cellWidth); 59. cellWidth.setType("dxa"); 60.
44、 cellWidth.setW(BigInteger.valueOf(widthsi - 1); 61. tc.getContent().add(factory.createP
45、(); 62. 63. 64. 65. return tbl; 66.
46、60;四 指定格式创建文档1. 修改文档格式页边距67. /* 68. * 功能描述:设置页边距 69. * param wordPackage 文档处理包对象 70. * param top 上边距 71.
47、160; * param bottom 下边距 72. * param left 左边距 73. * param right 右边距 74. * author myclover 75. &
48、#160; */ 76. public static void setMarginSpace(WordprocessingMLPackage wordPackage , String top , String bottom , String left , String right ) 77.
49、; ObjectFactory factory = Context.getWmlObjectFactory(); 78. PgMar pg = factory.createSectPrPgMar(); 79. pg.set
50、Top(new BigInteger(top); 80. pg.setBottom(new BigInteger(bottom); 81. pg.setLeft(new BigInteger(left); 82. p
51、g.setRight(new BigInteger(right); 83. wordPackage.getDocumentModel().getSections().get(0).getSectPr().setPgMar(pg); 84. 85. 86. /
52、* 87. * 功能描述:设置页边距,上下边距都为1440,2.54厘米 88. * param wordPackage 文档处理包对象 89. * param left 左边距 90. * param r
53、ight 右边距 91. * author myclover 92. */ 93. public static void setMarginSpace(WordprocessingMLPackage wordPackage , String left , S
54、tring right ) 94. setMarginSpace(wordPackage, "1440", "1440", left, right); 95. 96. 97.
55、160;/* 98. * 功能描述:设置页边距,上下边距都为1440,2.54厘米,左右边距都为1797,3.17厘米 99. * param wordPackage 文档处理包对象 100. * author myclover 101. */
56、160;102. public static void setMarginSpace(WordprocessingMLPackage wordPackage) 103. setMarginSpace(wordPackage, "1440", "1440", "1797", "1797
57、"); 104. 文档只读1. /* 2. * 功能描述:设置文档是否只读,包括内容和样式 3. * param wordPackage 文档处理包对象 4. * param&
58、#160;isReadOnly 是否只读 5. * throws Exception 6. * author myclover 7. */ 8. public static void setReadOnly(Word
59、processingMLPackage wordPackage , boolean isReadOnly)throws Exception 9. byte bt = "".getBytes(); 10. if(isReadOnly) 11.
60、 bt = "123456".getBytes(); 12. 13. ObjectFactory factory = Context.getWmlOb
61、jectFactory(); 14. /创建设置文档对象 15. DocumentSettingsPart ds = wordPackage.getMainDocumentPart().getDocumentSettingsPart(); 16.
62、160; if(ds = null) 17. ds = new DocumentSettingsPart(); 18. 19.
63、0;CTSettings cs = ds.getJaxbElement(); 20. if(cs = null) 21. cs = factory.createCTSettings(); 22.
64、160; 23. /创建文档保护对象 24. CTDocProtect cp = cs.getDocumentProtection(); 25. if(cp
65、 = null) 26. cp = new CTDocProtect(); 27. 28. /设置加密方式 29.
66、0; cp.setCryptProviderType(STCryptProv.RSA_AES); 30. cp.setCryptAlgorithmClass(STAlgClass.HASH); 31. /设置任何用户 32.
67、; cp.setCryptAlgorithmType(STAlgType.TYPE_ANY); 33. cp.setCryptAlgorithmSid(new BigInteger("4"); 34. cp.setCryptSpinCount(new BigInte
68、ger("50000"); 35. /只读 36. if(isReadOnly) 37. cp.setEdit(STDocProtect.READ_ONLY);
69、60;38. cp.setHash(bt); 39. cp.setSalt(bt); 40. /设置内容不可编辑
70、 41. cp.setEnforcement(true); 42. /设置格式不可编辑 43. cp.setFor
71、matting(true); 44. else 45. cp.setEdit(STDocProtect.NONE); 46. cp.setHash(n
72、ull); 47. cp.setSalt(null); 48. /设置内容不可编辑 49. cp.se
73、tEnforcement(false); 50. /设置格式不可编辑 51. cp.setFormatting(false); 52. &
74、#160;53. 54. cs.setDocumentProtection(cp); 55. ds.setJaxbElement(cs); 56.
75、/添加到文档主体中 57. wordPackage.getMainDocumentPart().addTargetPart(ds); 58. 59. 60. /* 61. * 功能描述:设
76、置文档是否只读,包括内容和样式 62. * param fileName 文件 63. * param isReadOnly 是否只读 64. * return
77、160; 返回值:设置成功,则返回true,否则返回false 65. * throws Exception 66. * author myclover 67. */ 68. public static boolean setR
78、eadOnly(String fileName , boolean isReadOnly)throws Exception 69. try 70. File file = new File(fileName);
79、160; 71. if (!file.exists() 72. return false; 73.
80、60; 74. /加载需要设置只读的文件 75. WordprocessingMLPackage wordPackage = WordprocessingMLPackage.lo
81、ad(file); 76. /设置只读 77. setReadOnly(wordPackage, isReadOnly); 78.
82、0; /保存文件 79. saveWordPackage(wordPackage, file); 80. catch (Exception e) 81.
83、160; e.printStackTrace(); 82. return false; 83. 84.
84、return true; 85. 2. 修改字体生成的RPr不能单独使用,应与Text共同使用1. /* 2. * 功能描述:设置字体的样式 3. * param fontFamily 字体类型 4
85、. * param colorVal 字体颜色 5. * param hpsMeasureSize 字号大小 6. * param sTHint
86、0; 字体格式 7. * param isBlod 是否加粗 8. * return 返
87、回值:返回字体样式对象 9. * throws Exception 10. * author myclover 11. */ 12. private static RPr getRPr(String fontFamily ,
88、60;String colorVal , String hpsMeasureSize , STHint sTHint , boolean isBold) 13. ObjectFactory factory = Context.getWmlObjectFactory(); 14. &
89、#160; RPr rPr = factory.createRPr(); 15. 16. org.docx4j.wml.RFonts rf = new org.docx4j.wml.RFonts(); 17. &
90、#160; rf.setHint(sTHint); 18. rf.setAscii(fontFamily); 19. rf.setHAnsi(fontFamily); 20. rPr.se
91、tRFonts(rf); 21. 22. BooleanDefaultTrue bdt = Context.getWmlObjectFactory().createBooleanDefaultTrue(); 23.
92、;rPr.setBCs(bdt); 24. if(isBold) 25. rPr.setB(bdt); 26. 27.
93、60; org.docx4j.wml.Color color = new org.docx4j.wml.Color(); 28. color.setVal(colorVal); 29. rPr.setColor(color); 30. 31.
94、 org.docx4j.wml.HpsMeasure sz = new org.docx4j.wml.HpsMeasure(); 32. sz.setVal(new BigInteger(hpsMeasureSize); 33. &
95、#160;rPr.setSz(sz); 34. rPr.setSzCs(sz); 35. 36. return rPr; 37. 38. Text
96、160;t = factory.createText(); 39. t.setValue(data); 40. R run = factory.createR(); 41. run.setRPr(
97、getRPr("宋体", "000000", "18" , STHint.EAST_ASIA, isBold)42. run.getContent().add(t); 43. p.getContent().add(run); 3. 修改单元格/表格样式单元格内容垂直居中(已
98、有Tc tc)1. TcPr tcpr = tc.getTcPr(); 2. ObjectFactory factory = Context.getWmlObjectFactory(); 3. if(tcpr = null) 4.
99、60; tcpr = factory.createTcPr(); 5. 6. /设置内容垂直居中 7. CTVerticalJc valign = factory.createCTVe
100、rticalJc(); 8. valign.setVal(STVerticalJc.CENTER); 9. tcpr.setVAlign(valign); 获取表格边框样式。修改样式就是创建或获取CTBorder对象后,修改参数再set回1. /* 2.
101、160; * 功能描述:获取单元格边框样式 3. * param type 单元格类型,0表示无边框,2表示双线边框,其他表示单线边框 4. * param color 边框颜色 5. * param border
102、160; 边框大小 6. * param space 间距 7. * return 返回值:返回边框对象 8. * author myclover 9. &
103、#160; */ 10. private static CTBorder getCTBorder(int type , String color , String border , String space) 11. CTBorder ctb =
104、60;new CTBorder(); 12. if(type = 0) 13. ctb.setVal(STBorder.NIL); 14. else
105、0;15. ctb.setColor(color); 16. ctb.setSz(new BigInteger(border); 17.
106、 ctb.setSpace(new BigInteger(space); 18. if(type = 2) 19. ctb.setVal(STBorder.DOUBLE
107、); 20. else 21. ctb.setVal(STBorder.SINGLE); 22.
108、160; 23. 24. return ctb; 25. 26. /*27. * Description:表格增加边框 可以设置上下左右四个边框样式以及横竖水平线样式28. */29. public void setTbl
109、Borders(TblPr tblPr, CTBorder topBorder, CTBorder rightBorder, CTBorder bottomBorder, CTBorder leftBorder, CTBorder hBorder, CTBorder vBorder) 30. TblBorders borders = tblPr.getTblBorders();31. if (borders = null) 32. borders = new TblBorders();33. tblPr.setTblBorders(borders);34. 35. if (topBorder
110、!= null) 36. borders.setTop(topBorder);37. 38. if (rightBorder != null) 39. borders.setRight(rightBorder);40. 41. if (bottomBorder != null) 42. borders.setBottom(bottomBorder);43. 44. if (leftBorder != null) 45. borders.setLeft(leftBorder);46. 47. if (hBorder != null) 48. borders.setInsideH(hBorder)
111、;49. 50. if (vBorder != null) 51. borders.setInsideV(vBorder);52. 53. 54.4. 合并单元格1. /* 2. * 功能描述:合并单元格</BR> 3. * 表示合并第startRow(开始行)行中的第s
112、tartCol(开始列)列到(startCol + colSpan - 1)列 </BR> 4. * 表示合并第startCol(开始列)行中的第startRow(开始行)列到(startRow + rowSpan - 1)行 5. *
113、160;param tc 单元格对象 6. * param currentRow 当前行号,传入的是遍历表格时的行索引参数 7. * param startRow 开始行 8.
114、 * param rowSpan 合并的行数,大于1才表示合并 9. * param currentCol 当前列号,传入的是遍历表格时的列索引参数 10. * param startCol 开始列 11.
115、; * param colSpan 合并的列数,大于1才表示合并 12. * author myclover 13. */ 14. public static void setCellMerge(Tc tc ,
116、;int currentRow , int startRow , int rowSpan , int currentCol , int startCol , int colSpan) 15. ObjectFactory factory = Context.getWmlObjectFactor
117、y(); 16. TcPr tcpr = tc.getTcPr(); 17. if(tcpr = null) 18. tcpr =
118、0;factory.createTcPr(); 19. 20. /表示合并列 21. if(colSpan > 1) 22.
119、; /表示从第startRow行开始 23. if(currentRow = startRow) 24. /表示从第startRo
120、w行的第startCol列开始合并,合并到第startCol + colSpan - 1列 25. if(currentCol = startCol) 26.
121、 HMerge hm = factory.createTcPrInnerHMerge(); 27. hm.setVal("restart"); 28.
122、0; tcpr.setHMerge(hm); 29. tc.setTcPr(tcpr); 30.
123、160; else if(currentCol > startCol && currentCol <= (startCol + colSpan - 1) 31.
124、160; HMerge hm = factory.createTcPrInnerHMerge(); 32. tcpr.setHMerge(hm); 33.
125、 tc.setTcPr(tcpr); 34. 35.
126、; 36. 37. /表示合并行 38. if(rowSpan > 1) 39.
127、60; /表示从第startCol列开始 40. if(currentCol = startCol) 41.
128、0;/表示从第startCol列的第startRow行始合并,合并到第startRow + rowSpan - 1行 42. if(currentRow = startRow) 43.
129、; VMerge vm = factory.createTcPrInnerVMerge(); 44. vm.setVal("restart"); 4
130、5. tcpr.setVMerge(vm); 46. tc.setTcPr(tcpr);
131、; 47. else if(currentRow > startRow && currentRow <= (startRow + rowSpan - 1) 48.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年工业机器人运维服务模式创新
- 护理课件规范标准
- 护理员情绪调节策略
- 热风炉工操作测试考核试卷含答案
- 暗盒生产工班组管理测试考核试卷含答案
- 铁合金炉外法冶炼工岗前技术创新考核试卷含答案
- 石雕工风险评估与管理考核试卷含答案
- 趸船水手发展趋势知识考核试卷含答案
- 美容师安全专项评优考核试卷含答案
- 针制作工岗前工作改进考核试卷含答案
- 2026年有限空间作业人员安全知识考试试题(含答案)
- 2026年天津市高三高考二模英语模拟试卷试题(含答案详解)
- 2026年监理工程师之交通工程目标控制押题模拟附参考答案详解【巩固】
- 广东省广州市增城区2025-2026学年九年级上学期1月期末考试语文试题
- 2026中国卵巢上皮性癌维持治疗专家共识解读
- 眼科中医诊室工作制度
- 阴道镜门诊工作制度
- 2025-2030中国激光脱毛产品市场未来趋势与营销战略规划研究报告
- (正式版)DB50∕T 1915-2025 《电动重型货车大功率充电站建设技术规范》
- 高处作业吊篮安装、拆卸、使用技术规程(2025版)
- 天津市园林建设工程监理用表和质量验收用表(绿表)
评论
0/150
提交评论