Docx4J知识积累_第1页
Docx4J知识积累_第2页
Docx4J知识积累_第3页
Docx4J知识积累_第4页
Docx4J知识积累_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论