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

下载本文档

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

文档简介

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,xlsx2. 创建新的docx、pptx、xlsx3. 编程式地操作上面打开的文档Docx4J特殊的功能支持:1. 模版替换;CustomXML绑定2. 生产/消费Word2007的xmlPackage(pkg)格式3. 作为docx保存docx到文件系统(zipped)或者保存到JCR(unzipped)4. 应用转换,包括常见过滤器5. 作为HTML或者PDF导出6. 比较文档、段落或者sdt(内容控件)之间的差异7. 字体支持(字体替换及使用任何文档中嵌入的字体)一些有用的链接:Docx4J: /trac/docx4jSample 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. *paramtc单元格对象4. *paramdata内容5. *paramfontFamily字体6. *paramfontSize字号7. *paramisBlod是否加粗8. *paramjcEnumeration对齐方式9. *authormyclover10. */11. privatestaticvoidfillCellData(Tctc,Stringdata,StringfontFamily,StringfontSize,booleanisBlod,JcEnumerationjcEnumeration)12. ObjectFactoryfactory=Context.getWmlObjectFactory();13. org.docx4j.wml.Pp=(P)XmlUtils.unwrap(tc.getContent().get(0);14. /设置表格内容的对齐方式15. setCellContentStyle(p,jcEnumeration);16. org.docx4j.wml.Textt=factory.createText();17. t.setValue(data);18. org.docx4j.wml.Rrun=factory.createR();19. /设置表格内容字体样式20. run.setRPr(getRPr(fontFamily,fontSize,isBlod);21. TcPrtcpr=tc.getTcPr();22. if(tcpr=null)23. tcpr=factory.createTcPr();24. 25. /设置内容垂直居中26. CTVerticalJcvalign=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. *paramtc单元格对象36. *paramdata数据37. *paramisBlod是否加粗38. *authormyclover39. */40. publicstaticvoidfillCellData(Tctc,Stringdata,booleanisBlod)41. fillCellData(tc,data,宋体,18,isBlod,JcEnumeration.CENTER);42. 4. Tbl:表格,每个表格含有一行或多行(Tr),每行有一个或者多个单元格(Tc)Tc是表格用于存储信息的基本单位以下代码创建了一个“rows行、cols列、行宽为widths“的空表格1. publicstaticTblcreateTable(introws,intcols,intwidths)2. ObjectFactoryfactory=Context.getWmlObjectFactory();3. Tbltbl=factory.createTbl();4. /w:tblPr5. StringBuffertblSb=newStringBuffer();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. TblPrtblPr=null;21. try22. tblPr=(TblPr)XmlUtils.unmarshalString(tblSb.toString();23. catch(JAXBExceptione)24. e.printStackTrace();25. 26. tbl.setTblPr(tblPr);27. if(tblPr!=null)28. Jcjc=factory.createJc();29. /单元格居中对齐30. jc.setVal(JcEnumeration.CENTER);31. tblPr.setJc(jc);32. CTTblLayoutTypetbll=factory.createCTTblLayoutType();33. /固定列宽34. tbll.setType(STTblLayoutType.FIXED);35. tblPr.setTblLayout(tbll);36. 37. /38. TblGridtblGrid=factory.createTblGrid();39. tbl.setTblGrid(tblGrid);40. /Addrequired41. for(inti=1;i=cols;i+)42. TblGridColgridCol=factory.createTblGridCol();43. gridCol.setW(BigInteger.valueOf(widthsi-1);44. tblGrid.getGridCol().add(gridCol);45. 46. /Nowtherows47. for(intj=1;j=rows;j+)48. Trtr=factory.createTr();49. tbl.getContent().add(tr);50. /Thecells51. for(inti=1;i=cols;i+)52. Tctc=factory.createTc();53. tr.getContent().add(tc);54. TcPrtcPr=factory.createTcPr();55. tc.setTcPr(tcPr);56. /57. TblWidthcellWidth=factory.createTblWidth();58. tcPr.setTcW(cellWidth);59. cellWidth.setType(dxa);60. cellWidth.setW(BigInteger.valueOf(widthsi-1);61. tc.getContent().add(factory.createP();62. 63. 64. 65. returntbl;66. 四 指定格式创建文档1. 修改文档格式页边距67. /*68. *功能描述:设置页边距69. *paramwordPackage文档处理包对象70. *paramtop上边距71. *parambottom下边距72. *paramleft左边距73. *paramright右边距74. *authormyclover75. */76. publicstaticvoidsetMarginSpace(WordprocessingMLPackagewordPackage,Stringtop,Stringbottom,Stringleft,Stringright)77. ObjectFactoryfactory=Context.getWmlObjectFactory();78. PgMarpg=factory.createSectPrPgMar();79. pg.setTop(newBigInteger(top);80. pg.setBottom(newBigInteger(bottom);81. pg.setLeft(newBigInteger(left);82. pg.setRight(newBigInteger(right);83. wordPackage.getDocumentModel().getSections().get(0).getSectPr().setPgMar(pg);84. 85. 86. /*87. *功能描述:设置页边距,上下边距都为1440,2.54厘米88. *paramwordPackage文档处理包对象89. *paramleft左边距90. *paramright右边距91. *authormyclover92. */93. publicstaticvoidsetMarginSpace(WordprocessingMLPackagewordPackage,Stringleft,Stringright)94. setMarginSpace(wordPackage,1440,1440,left,right);95. 96. 97. /*98. *功能描述:设置页边距,上下边距都为1440,2.54厘米,左右边距都为1797,3.17厘米99. *paramwordPackage文档处理包对象100. *authormyclover101. */102. publicstaticvoidsetMarginSpace(WordprocessingMLPackagewordPackage)103. setMarginSpace(wordPackage,1440,1440,1797,1797);104. 文档只读1. /*2. *功能描述:设置文档是否只读,包括内容和样式3. *paramwordPackage文档处理包对象4. *paramisReadOnly是否只读5. *throwsException6. *authormyclover7. */8. publicstaticvoidsetReadOnly(WordprocessingMLPackagewordPackage,booleanisReadOnly)throwsException9. bytebt=.getBytes();10. if(isReadOnly)11. bt=123456.getBytes();12. 13. ObjectFactoryfactory=Context.getWmlObjectFactory();14. /创建设置文档对象15. DocumentSettingsPartds=wordPackage.getMainDocumentPart().getDocumentSettingsPart();16. if(ds=null)17. ds=newDocumentSettingsPart();18. 19. CTSettingscs=ds.getJaxbElement();20. if(cs=null)21. cs=factory.createCTSettings();22. 23. /创建文档保护对象24. CTDocProtectcp=cs.getDocumentProtection();25. if(cp=null)26. cp=newCTDocProtect();27. 28. /设置加密方式29. cp.setCryptProviderType(STCryptProv.RSA_AES);30. cp.setCryptAlgorithmClass(STAlgClass.HASH);31. /设置任何用户32. cp.setCryptAlgorithmType(STAlgType.TYPE_ANY);33. cp.setCryptAlgorithmSid(newBigInteger(4);34. cp.setCryptSpinCount(newBigInteger(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. else45. cp.setEdit(STDocProtect.NONE);46. cp.setHash(null);47. cp.setSalt(null);48. /设置内容不可编辑49. cp.setEnforcement(false);50. /设置格式不可编辑51. cp.setFormatting(false);52. 53. 54. cs.setDocumentProtection(cp);55. ds.setJaxbElement(cs);56. /添加到文档主体中57. wordPackage.getMainDocumentPart().addTargetPart(ds);58. 59. 60. /*61. *功能描述:设置文档是否只读,包括内容和样式62. *paramfileName文件63. *paramisReadOnly是否只读64. *return返回值:设置成功,则返回true,否则返回false65. *throwsException66. *authormyclover67. */68. publicstaticbooleansetReadOnly(StringfileName,booleanisReadOnly)throwsException69. try70. Filefile=newFile(fileName);71. if(!file.exists()72. returnfalse;73. 74. /加载需要设置只读的文件75. WordprocessingMLPackagewordPackage=WordprocessingMLPackage.load(file);76. /设置只读77. setReadOnly(wordPackage,isReadOnly);78. /保存文件79. saveWordPackage(wordPackage,file);80. catch(Exceptione)81. e.printStackTrace();82. returnfalse;83. 84. returntrue;85. 2. 修改字体生成的RPr不能单独使用,应与Text共同使用1. /*2. *功能描述:设置字体的样式3. *paramfontFamily字体类型4. *paramcolorVal字体颜色5. *paramhpsMeasureSize字号大小6. *paramsTHint字体格式7. *paramisBlod是否加粗8. *return返回值:返回字体样式对象9. *throwsException10. *authormyclover11. */12. privatestaticRPrgetRPr(StringfontFamily,StringcolorVal,StringhpsMeasureSize,STHintsTHint,booleanisBold)13. ObjectFactoryfactory=Context.getWmlObjectFactory();14. RPrrPr=factory.createRPr();15. 16. org.docx4j.wml.RFontsrf=neworg.docx4j.wml.RFonts();17. rf.setHint(sTHint);18. rf.setAscii(fontFamily);19. rf.setHAnsi(fontFamily);20. rPr.setRFonts(rf);21. 22. BooleanDefaultTruebdt=Context.getWmlObjectFactory().createBooleanDefaultTrue();23. rPr.setBCs(bdt);24. if(isBold)25. rPr.setB(bdt);26. 27. org.docx4j.wml.Colorcolor=neworg.docx4j.wml.Color();28. color.setVal(colorVal);29. rPr.setColor(color);30. 31. org.docx4j.wml.HpsMeasuresz=neworg.docx4j.wml.HpsMeasure();32. sz.setVal(newBigInteger(hpsMeasureSize);33. rPr.setSz(sz);34. rPr.setSzCs(sz);35. 36. returnrPr;37. 38. Textt=factory.createText();39. t.setValue(data);40. Rrun=factory.createR();41. run.setRPr(getRPr(宋体, 000000,18 ,STHint.EAST_ASIA,isBold)42. run.getContent().add(t);43. p.getContent().add(run);3. 修改单元格/表格样式单元格内容垂直居中(已有Tc tc)1. TcPrtcpr=tc.getTcPr();2. ObjectFactoryfactory=Context.getWmlObjectFactory();3. if(tcpr=null)4. tcpr=factory.createTcPr();5. 6. /设置内容垂直居中7. CTVerticalJcvalign=factory.createCTVerticalJc();8. valign.setVal(STVerticalJc.CENTER);9. tcpr.setVAlign(valign);获取表格边框样式。修改样式就是创建或获取CTBorder对象后,修改参数再set回1. /*2. *功能描述:获取单元格边框样式3. *paramtype单元格类型,0表示无边框,2表示双线边框,其他表示单线边框4. *paramcolor边框颜色5. *paramborder边框大小6. *paramspace间距7. *return返回值:返回边框对象8. *authormyclover9. */10. privatestaticCTBordergetCTBorder(inttype,Stringcolor,Stringborder,Stringspace)11. CTBorderctb=newCTBorder();12. if(type=0)13. ctb.setVal(STBorder.NIL);14. else15. ctb.setColor(color);16. ctb.setSz(newBigInteger(border);17. ctb.setSpace(newBigInteger(space);18. if(type=2)19. ctb.setVal(STBorder.DOUBLE);20. else21. ctb.setVal(STBorder.SINGLE);22. 23. 24. returnctb;25. 26. /*27. * Description:表格增加边框 可以设置上下左右四个边框样式以及横竖水平线样式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.setTblBorders(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 != null) 48. borders.setInsideH(hBorder);49. 50. if (vBorder != null) 51. borders.setInsideV(vBorder);52. 53. 54.4. 合并单元格1. /*2. *功能描述:合并单元格3. *表示合并第startRow(开始行)行中的第startCol(开始列)列到(startCol+colSpan-1)列4. *表示合并第startCol(开始列)行中的第startRow(开始行)列到(startRow+rowSpan-1)行5. *paramtc单元格对象6. *paramcurrentRow当前行号,传入的是遍历表格时的行索引参数7. *paramstartRow开始行8. *paramrowSpan合并的行数,大于1才表示合并9. *paramcurrentCol当前列号,传入的是遍历表格时的列索引参数10. *paramstartCol开始列11. *paramcolSpan合并的列数,大于1才表示合并12. *authormyclover13. */14. publicstaticvoidsetCellMerge(Tctc,intcurrentRow,intstartRow,introwSpan,intcurrentCol,intstartCol,intcolSpan)15. ObjectFactoryfactory=Context.getWmlObjectFactory();16. TcPrtcpr=tc.getTcPr();17. if(tcpr=null)18. tcpr=factory.createTcPr();19. 20. /表示合并列21. if(colSpan1)22. /表示从第startRow行开始23. if(currentRow=startRow)24. /表示从第startRow行的第startCol列开始合并,合并到第startCol+colSpan-1列25. if(currentCol=startCol)26. HMergehm=factory.createTcPrInnerHMerge();27. hm.setVal(restart);28. tcpr.setHMerge(hm);29. tc.setTcPr(tcpr);30. elseif(currentColstartCol¤tCol1)39. /表示从第startCol列开始40. if(currentCol=startCol)41. /表示从第startCol列的第startRow行始合并,合并到第startRow+rowSpan-1行42. if(currentRow=startRow)43. VMergevm=factory.createTcPrInnerVMerge();44. vm.setVal(restart);45. tcpr.setVMerge(vm);46. tc.setTcPr(tcpr);47. elseif(currentRowstartRow¤tRow=(startRow+rowSpan-1)48. VM

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论