版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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: /trac/docx4jSample codes:docx4j, pptx4j, xlsx4j, 生成docx文件(第一部分),生成docx文件(第二部分),使用docx4j编程式地创建复杂的Word(.docx)文档,向Docx4j生成的word文档添加图片和布局-第一部分,向Docx4j生成的word文档中添加布局-第二部分 docx4j - 使用Java处理word2007(.docx)文档Docx4J的使用一 打开文件/模板Docx4J中,在内存中操作的word文档是“WordprocessingMLPackage”
4、类型的对象(本文以下简称包)。在编辑一个word文档前,开发者需要选择:创建一个新的空白包,并逐一将需要的内容填充进去,或者打开一个已有的文档,并在里面添加/替换新的内容。前者思路比较简单,比较适合简单文档的创建。但由于添加每条新内容时,都需要手动进行设置其各项参数(比如表格的行宽、列宽、边框等),且添加修改复杂控件(公式、页眉页脚)的过程都比较繁琐,所以在创建格式复杂的文档时不是很建议。后者需要事先制作一个模板文档,添加不同的占位符和各种模板信息,在准备上比前者复杂。但也具有很多优点:可以简化细节参数的调整(不需要手动调整表格、段落的具体细节参数)从而将精力集中到文档内容上;复杂的文档部分(
5、如公式、复选框等)可以直接从模板中读取,只需要在其基础上修改文字等内容部分,而避开了繁琐的创建操作等。在创建格式复杂的文档时,这个方法相比前者可以精简大量代码。(本文之后将主要基于该方法进行说明)二 保存文件当结束对包的编辑时,开发者可以选择多种方式进行保存。三 常用类型Docx4J支持所有的docx内容格式,其中比较常见的有如下几种:1. Text:基本的文字内容2. R:文字格式信息 3. P:段落,可以单独使用,也可以添加到单元格(Tc)等作为内容以下代码创建了新文本,并将其填到指定的单元格中1. /* 2.
6、0; * 功能描述:填充单元格内容 3. * param tc 单元格对象 4. * param data 内容 5.
7、; * param fontFamily 字体 6. * param fontSize 字号 7. * param isBlod 是否加粗 8. * param
8、 jcEnumeration 对齐方式 9. * author myclover 10. */ 11. private static void fillCellData(Tc tc , String data , String fontFamily&
9、#160;, String fontSize , boolean isBlod , JcEnumeration jcEnumeration) 12. ObjectFactory factory = Context.getWmlObjectFactory(); 13.
10、; org.docx4j.wml.P p = (P) XmlUtils.unwrap(tc.getContent().get(0); 14. /设置表格内容的对齐方式 15. setCellContentStyle(p , jcEnumeration); 16.
11、0; org.docx4j.wml.Text t = factory.createText(); 17. t.setValue(data); 18. org.docx4j.wml.R run = factory.creat
12、eR(); 19. /设置表格内容字体样式 20. run.setRPr(getRPr(fontFamily, fontSize, isBlod); 21. TcPr tcpr = tc.getT
13、cPr(); 22. if(tcpr = null) 23. tcpr = factory.createTcPr(); 24. 25.
14、 /设置内容垂直居中 26. CTVerticalJc valign = factory.createCTVerticalJc(); 27. valign.setVal(STVerticalJc.CENTER); 2
15、8. tcpr.setVAlign(valign); 29. run.getContent().add(t); 30. p.getContent().add(run); 31.
16、0;32. 33. /* 34. * 功能描述:填充单元格内容,小五号,宋体,内容居中 35. * param tc 单元格对象 36. * param data
17、 数据 37. * param isBlod 是否加粗 38. * author myclover 39. */ 40. public static void fillCellData(Tc tc
18、 , String data , boolean isBlod ) 41. fillCellData(tc, data, "宋体", "18", isBlod, JcEnumeration.CENTER); 42. 4. Tbl
19、:表格,每个表格含有一行或多行(Tr),每行有一个或者多个单元格(Tc)Tc是表格用于存储信息的基本单位以下代码创建了一个“rows行、cols列、行宽为widths“的空表格1. public static Tbl createTable(int rows, int cols, int widths) 2. ObjectFactory factory =
20、Context.getWmlObjectFactory(); 3. Tbl tbl = factory.createTbl(); 4. / w:tblPr 5. StringBuffer tblS
21、b = new StringBuffer(); 6. tblSb.append("<w:tblPr ").append(Namespaces.W_NAMESPACE_DECLARATION).append(">"); 7. tblSb.append("<w
22、:tblStyle w:val="TableGrid"/>"); 8. tblSb.append("<w:tblW w:w="0" w:type="auto"/>"); 9. /上边框双线 10.
23、60; tblSb.append("<w:tblBorders><w:top w:val="double" w:sz="4" w:space="0" w:color="auto"/>"); 11. /左边无边框 1
24、2. 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.
26、; tblSb.append("<w:right w:val="none" w:sz="0" w:space="0" w:color="auto"/>"); 17. tblSb.append("</w:tblBorders>");
27、;18. tblSb.append("<w:tblLook w:val="04A0"/>"); 19. tblSb.append("</w:tblPr>"); 20. Tbl
28、Pr tblPr = null; 21. try 22. tblPr = (TblPr) XmlUtils.unmarshalString(tblSb.toString(); 23. &
29、#160; catch (JAXBException e) 24. e.printStackTrace(); 25. 26.
30、160; tbl.setTblPr(tblPr); 27. if (tblPr != null) 28. Jc jc = factory.createJc(); 29.
31、60; /单元格居中对齐 30. jc.setVal(JcEnumeration.CENTER); 31. tblPr.setJc(jc); 32. &
32、#160; CTTblLayoutType tbll = factory.createCTTblLayoutType(); 33. / 固定列宽 34.
33、160; tbll.setType(STTblLayoutType.FIXED); 35. tblPr.setTblLayout(tbll); 36. 37. &
34、#160;/ <w:tblGrid><w: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、60; TblGridCol gridCol = factory.createTblGridCol(); 43. gridCol.setW(BigInteger.valueOf(widthsi - 1); 44.
37、60; tblGrid.getGridCol().add(gridCol); 45. 46. / Now the rows 47.
38、for (int j = 1; j <= rows; j+) 48. Tr tr = factory.createTr(); 49. tbl
39、.getContent().add(tr); 50. / The cells 51. for (int i = 1; i <= cols; i+)
40、160; 52. Tc tc = factory.createTc(); 53. tr.getContent().add(tc);
41、54. TcPr tcPr = factory.createTcPr(); 55. tc.setTcPr(tcPr); 56. &
42、#160; / <w:tcW w:w="4788" w:type="dxa"/> 57. TblWidth cellWidth&
43、#160;= factory.createTblWidth(); 58. tcPr.setTcW(cellWidth); 59. cellWidth.setTyp
44、e("dxa"); 60. cellWidth.setW(BigInteger.valueOf(widthsi - 1); 61.
45、tc.getContent().add(factory.createP(); 62. 63. 64. 65. return tbl; 66
46、. 四 指定格式创建文档1. 修改文档格式页边距67. /* 68. * 功能描述:设置页边距 69. * param wordPackage 文档处理包对象 70. * param top
47、0; 上边距 71. * param bottom 下边距 72. * param left 左边距 73. * param right 右边距 74. * au
48、thor myclover 75. */ 76. public static void setMarginSpace(WordprocessingMLPackage wordPackage , String top , String bottom , String left , String
49、0;right ) 77. ObjectFactory factory = Context.getWmlObjectFactory(); 78. PgMar pg = factory.createSectPrPgMar(); 79. &
50、#160; pg.setTop(new BigInteger(top); 80. pg.setBottom(new BigInteger(bottom); 81. pg.setLeft(new BigInteger(left); 82.
51、160; pg.setRight(new BigInteger(right); 83. wordPackage.getDocumentModel().getSections().get(0).getSectPr().setPgMar(pg); 84. 85.
52、 86. /* 87. * 功能描述:设置页边距,上下边距都为1440,2.54厘米 88. * param wordPackage 文档处理包对象 89. * param left 左边距 90.
53、160; * param right 右边距 91. * author myclover 92. */ 93. public static void setMarginSpace(WordprocessingMLPackage wordPackage ,&
54、#160;String left , String right ) 94. setMarginSpace(wordPackage, "1440", "1440", left, right); 95. 96. &
55、#160; 97. /* 98. * 功能描述:设置页边距,上下边距都为1440,2.54厘米,左右边距都为1797,3.17厘米 99. * param wordPackage 文档处理包对象 100. * author myclover 101.
56、; */ 102. public static void setMarginSpace(WordprocessingMLPackage wordPackage) 103. setMarginSpace(wordPackage, "1440", "1440",
57、0;"1797", "1797"); 104. 文档只读1. /* 2. * 功能描述:设置文档是否只读,包括内容和样式 3. * param wordPackage 文档处理包对象 4.
58、160; * param isReadOnly 是否只读 5. * throws Exception 6. * author myclover 7. */ 8. public sta
59、tic void setReadOnly(WordprocessingMLPackage wordPackage , boolean isReadOnly)throws Exception 9. byte bt = "".getBytes(); 10. &
60、#160;if(isReadOnly) 11. bt = "123456".getBytes(); 12. 13. ObjectFactory f
61、actory = Context.getWmlObjectFactory(); 14. /创建设置文档对象 15. DocumentSettingsPart ds = wordPackage.getMainDocumentPart().getDocumentSettingsPart(); 1
62、6. if(ds = null) 17. ds = new DocumentSettingsPart(); 18. 19.
63、; CTSettings cs = ds.getJaxbElement(); 20. if(cs = null) 21. cs = factory.createCTSettin
64、gs(); 22. 23. /创建文档保护对象 24. CTDocProtect cp = cs.getDocumentProtection(); 25.
65、 if(cp = null) 26. cp = new CTDocProtect(); 27. 28.
66、0; /设置加密方式 29. cp.setCryptProviderType(STCryptProv.RSA_AES); 30. cp.setCryptAlgorithmClass(STAlgClass.HASH); 31. /设置任何
67、用户 32. cp.setCryptAlgorithmType(STAlgType.TYPE_ANY); 33. cp.setCryptAlgorithmSid(new BigInteger("4"); 34. cp
68、.setCryptSpinCount(new BigInteger("50000"); 35. /只读 36. if(isReadOnly) 37. cp.setEdi
69、t(STDocProtect.READ_ONLY); 38. cp.setHash(bt); 39. cp.setSalt(bt); 40.
70、0; /设置内容不可编辑 41. cp.setEnforcement(true); 42. /设置格式不可编辑 43.
71、0; cp.setFormatting(true); 44. else 45. cp.setEdit(STDocProtect.NONE); 46. &
72、#160; cp.setHash(null); 47. cp.setSalt(null); 48. /设置内容不可编辑 49.
73、 cp.setEnforcement(false); 50. /设置格式不可编辑 51. cp.setFormatting(false); 52.
74、160; 53. 54. cs.setDocumentProtection(cp); 55. ds.setJaxbElement(cs); 56. &
75、#160; /添加到文档主体中 57. wordPackage.getMainDocumentPart().addTargetPart(ds); 58. 59. 60. /* 61.
76、160; * 功能描述:设置文档是否只读,包括内容和样式 62. * param fileName 文件 63. * param isReadOnly 是否只读 64. * return
77、60; 返回值:设置成功,则返回true,否则返回false 65. * throws Exception 66. * author myclover 67. */ 68. public
78、 static boolean setReadOnly(String fileName , boolean isReadOnly)throws Exception 69. try 70. File file
79、0;= new File(fileName); 71. if (!file.exists() 72. return false; 73.
80、0; 74. /加载需要设置只读的文件 75. WordprocessingMLPackage wordPackage
81、0;= WordprocessingMLPackage.load(file); 76. /设置只读 77. setReadOnly(wordPackage, isReadOnly); 78.
82、; /保存文件 79. saveWordPackage(wordPackage, file); 80. catch (Exception e) &
83、#160;81. e.printStackTrace(); 82. return false; 83. 84. &
84、#160; return true; 85. 2. 修改字体生成的RPr不能单独使用,应与Text共同使用1. /* 2. * 功能描述:设置字体的样式 3. * param fontFamily
85、 字体类型 4. * param colorVal 字体颜色 5. * param hpsMeasureSize 字号大小 6. * param sTHint
86、; 字体格式 7. * param isBlod 是否加粗 8. * return
87、160; 返回值:返回字体样式对象 9. * throws Exception 10. * author myclover 11. */ 12. private static RPr getR
88、Pr(String fontFamily , String colorVal , String hpsMeasureSize , STHint sTHint , boolean isBold) 13. ObjectFactory factory = Context.getWmlObjectFactory();
89、 14. RPr rPr = factory.createRPr(); 15. 16. org.docx4j.wml.RFonts rf = new org.docx4j.wml.RFo
90、nts(); 17. rf.setHint(sTHint); 18. rf.setAscii(fontFamily); 19. rf.setHAnsi(fontFamily); 20. &
91、#160; rPr.setRFonts(rf); 21. 22. BooleanDefaultTrue bdt = Context.getWmlObjectFactory().createBooleanDefaultTrue(); 23.
92、 rPr.setBCs(bdt); 24. if(isBold) 25. rPr.setB(bdt); 26.
93、160;27. org.docx4j.wml.Color color = new org.docx4j.wml.Color(); 28. color.setVal(colorVal); 29. rPr.setColor(colo
94、r); 30. 31. 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.
96、 38. Text t = factory.createText(); 39. t.setValue(data); 40. R run = factory.createR(); 41.
97、 run.setRPr(getRPr("宋体", "000000", "18" , STHint.EAST_ASIA, isBold)42. run.getContent().add(t); 43. p.getContent().add(run);&
98、#160; 3. 修改单元格/表格样式单元格内容垂直居中(已有Tc tc)1. TcPr tcpr = tc.getTcPr(); 2. ObjectFactory factory = Context.getWmlObjectFactory(); 3. if(tcpr = null) 4.
99、0; tcpr = factory.createTcPr(); 5. 6. /设置内容垂直居中 7. CTVerticalJc va
100、lign = factory.createCTVerticalJc(); 8. valign.setVal(STVerticalJc.CENTER); 9. tcpr.setVAlign(valign); 获取表格边框样式。修改样式就是创建或获取CTBorder对象后,修改参数再set回1.
101、160; /* 2. * 功能描述:获取单元格边框样式 3. * param type 单元格类型,0表示无边框,2表示双线边框,其他表示单线边框 4. * param color 边框颜色 5.
102、60; * param border 边框大小 6. * param space 间距 7. * return 返回值:返回边框对象 8. * author m
103、yclover 9. */ 10. private static CTBorder getCTBorder(int type , String color , String border , String space) 11.
104、0; CTBorder ctb = new CTBorder(); 12. if(type = 0) 13. ctb.setVal(STBorder.NIL); 14.
105、60; else 15. ctb.setColor(color); 16. ctb.setSz(new BigInteger(border); 17. &
106、#160; ctb.setSpace(new BigInteger(space); 18. if(type = 2) 19.
107、60; ctb.setVal(STBorder.DOUBLE); 20. else 21. ctb.setVal(STBorder.SINGLE); 22.
108、60; 23. 24. return ctb; 25. 26. /*27. * Description:表格增加边框 可以设置上下左右四个边框样式以及
109、横竖水平线样式28. */29. public void setTblBorders(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.setTblBord
110、ers(borders);34. 35. if (topBorder != 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 != nu
111、ll) 48. borders.setInsideH(hBorder);49. 50. if (vBorder != null) 51. borders.setInsideV(vBorder);52. 53. 54.4. 合并单元格1. /* 2. * 功能描述:合并单元格</BR> 3. *
112、 表示合并第startRow(开始行)行中的第startCol(开始列)列到(startCol + colSpan - 1)列 </BR> 4. * 表示合并第startCol(开始列)行中的第startRow(开始行)列到(startRow + rowSpan - 1)行 5
113、. * param tc 单元格对象 6. * param currentRow 当前行号,传入的是遍历表格时的行索引参数 7. * param startRow &
114、#160;开始行 8. * param rowSpan 合并的行数,大于1才表示合并 9. * param currentCol 当前列号,传入的是遍历表格时的列索引参数 10. * param startCol &
115、#160;开始列 11. * param colSpan 合并的列数,大于1才表示合并 12. * author myclover 13. */ 14. public static void
116、setCellMerge(Tc tc , int currentRow , int startRow , int rowSpan , int currentCol , int startCol , int colSpan) 15. ObjectFactory factory
117、0;= Context.getWmlObjectFactory(); 16. TcPr tcpr = tc.getTcPr(); 17. if(tcpr = null) 18.
118、0; tcpr = factory.createTcPr(); 19. 20. /表示合并列 21. if(colSpan > 1) 22.
119、 /表示从第startRow行开始 23. if(currentRow = startRow) 24. &
120、#160; /表示从第startRow行的第startCol列开始合并,合并到第startCol + colSpan - 1列 25. if(currentCol = startCol) 26. &
121、#160; HMerge hm = factory.createTcPrInnerHMerge(); 27. hm.setVal("restar
122、t"); 28. tcpr.setHMerge(hm); 29.
123、tc.setTcPr(tcpr); 30. else if(currentCol > startCol && currentCol <= (startCol + colSpan - 1) 31.
124、60; HMerge hm = factory.createTcPrInnerHMerge(); 32.
125、tcpr.setHMerge(hm); 33. tc.setTcPr(tcpr); 34. 35.
126、 36. 37. /表示合并行 38. if(rowSpan > 1)
127、160; 39. /表示从第startCol列开始 40. if(currentCol = startCol) 41.
128、; /表示从第startCol列的第startRow行始合并,合并到第startRow + rowSpan - 1行 42. if(currentRow = startRow) 43.
129、 VMerge vm = factory.createTcPrInnerVMerge(); 44. vm.setVal
130、("restart"); 45. tcpr.setVMerge(vm); 46. tc.setTcPr(tcpr); 47. else if(currentRow > startRow && currentRow <= (startRow + rowSpan
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025浙江丽水市金投鑫创私募基金管理有限公司招聘工作人员3人笔试历年参考题库附带答案详解
- 2025河南洛阳市某国企部分岗位招聘8人笔试历年参考题库附带答案详解
- 2025民生人寿保险福建分公司基层单位后备管理干部招聘笔试历年参考题库附带答案详解
- 2025广西桂林市恭城瑶族自治县泰源粮油购销公司招聘国有企业人员笔试及人员笔试历年参考题库附带答案详解
- 2025广东梅州平远国有控股集团有限公司招聘总及人员笔试历年参考题库附带答案详解
- 2025四川泸州市鸿韵工程建设咨询有限公司招聘4人笔试历年参考题库附带答案详解
- 2025四川兴雅水利水电咨询有限公司第二期引进人员笔试历年参考题库附带答案详解
- 2025北京市自来水集团禹通市政工程有限公司社会招聘35人笔试历年参考题库附带答案详解
- 2025内蒙古呼伦贝尔林业集团有限公司招聘工作人员5人笔试历年参考题库附带答案详解
- 2025云南大理州祥云县云之源医疗物资有限责任公司招聘3人笔试历年参考题库附带答案详解
- 《中国成人支气管扩张症诊断与治疗专家共识2021》
- 洁净室运行维护管理方案
- 2024年课堂实践:3拍手歌公开课教学效果评估
- 网约车停运损失赔偿协议书范文
- 人教部编版四年级语文上册 第四单元主题阅读-神话故事(含答案及详细解析)
- 人教版九年级物理-第十三章-第十七章综合测试-含答案
- 《REACH法规中文全文》
- 边坡应力分布的一般特征
- 中国丝绸智慧树知到答案2024年浙江理工大学
- 幼儿园《认识医生和护士》课件
- 5S现场管理完整版课件
评论
0/150
提交评论