Docx4J知识积累.docx
- 文档编号:28061445
- 上传时间:2023-07-08
- 格式:DOCX
- 页数:19
- 大小:345.59KB
Docx4J知识积累.docx
《Docx4J知识积累.docx》由会员分享,可在线阅读,更多相关《Docx4J知识积累.docx(19页珍藏版)》请在冰豆网上搜索。
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:
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 = ();
13. p = (P) ().get(0));
14. dd(t);
15. ().add(run);
16. }
17.
18. /**
19. * 功能描述:
填充单元格内容,小五号,宋体,内容居中
20. * @param tc 单元格对象
21. * @param data 数据
22. * @param isBlod 是否加粗
23. * @author myclover
24. */
25. public static void fillCellData(Tc tc , String data , boolean isBlod ){
26. fillCellData(tc, data, "宋体", "18", isBlod, ;
27. }
4.Tbl:
表格,每个表格含有一行或多行(Tr),每行有一个或者多个单元格(Tc)
Tc是表格用于存储信息的基本单位
以下代码创建了一个“rows行、cols列、行宽为widths“的空表格
1.public static Tbl createTable(int rows, int cols, int[] widths) {
2. ObjectFactory factory = ();
3. Tbl tbl = ();
4. ppend.append(">");
5. (" tblStyle w: val=\"TableGrid\"/>"); 6. (" tblW w: w=\"0\" w: type=\"auto\"/>"); 7. dd(gridCol); 8. } 9. dd(tr); 10. dd(tc); 11. TcPr tcPr = (); 12. (tcPr); 13. dd()); 14. } 15. 16. } 17. return tbl; 18. } 四指定格式创建文档 1.修改文档格式 页边距 19. /** 20. * 功能描述: 设置页边距 21. * @param wordPackage 文档处理包对象 22. * @param top 上边距 23. * @param bottom 下边距 24. * @param left 左边距 25. * @param right 右边距 26. * @author myclover 27. */ 28. public static void setMarginSpace(WordprocessingMLPackage wordPackage , String top , String bottom , String left , String right ){ 29. ObjectFactory factory = (); 30. PgMar pg = (); 31. (new BigInteger(top)); 32. (new BigInteger(bottom)); 33. (new BigInteger(left)); 34. (new BigInteger(right)); 35. ().getSections().get(0).getSectPr().setPgMar(pg); 36. } 37. 38. /** 39. * 功能描述: 设置页边距,上下边距都为1440,厘米 40. * @param wordPackage 文档处理包对象 41. * @param left 左边距 42. * @param right 右边距 43. * @author myclover 44. */ 45. public static void setMarginSpace(WordprocessingMLPackage wordPackage , String left , String right ){ 46. setMarginSpace(wordPackage, "1440", "1440", left, right); 47. } 48. 49. /** 50. * 功能描述: 设置页边距,上下边距都为1440,厘米,左右边距都为1797,厘米 51. * @param wordPackage 文档处理包对象 52. * @author myclover 53. */ 54. public static void setMarginSpace(WordprocessingMLPackage wordPackage){ 55. setMarginSpace(wordPackage, "1440", "1440", "1797", "1797"); 56. } 文档只读 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 = (); 14. etDocumentSettingsPart(); 15. if(ds == null){ 16. ds = new DocumentSettingsPart(); 17. } 18. CTSettings cs = (); 19. if(cs == null){ 20. cs = (); 21. } 22. ddTargetPart(ds); 23. } 24. 25. /** 26. * 功能描述: 设置文档是否只读,包括内容和样式 27. * @param fileName 文件 28. * @param isReadOnly 是否只读 29. * @return 返回值: 设置成功,则返回true,否则返回false 30. * @throws Exception 31. * @author myclover 32. */ 33. public static boolean setReadOnly(String fileName , boolean isReadOnly)throws Exception{ 34. try { 35. File file = new File(fileName); 36. if (! ()) { 37. return false; 38. } 修改字体 生成的RPr不能单独使用,应与Text共同使用 1. /** 2. * 功能描述: 设置字体的样式 3. * @param fontFamily 字体类型 4. * @param colorVal 字体颜色 5. * @param hpsMeasureSize 字号大小 6. * @param sTHint 字体格式 7. * @param isBlod 是否加粗 8. * @return 返回值: 返回字体样式对象 9. * @throws Exception 10. * @author myclover 11. */ 12. private static RPr getRPr(String fontFamily , String colorVal , String hpsMeasureSize , STHint sTHint , boolean isBold){ 13. ObjectFactory factory = (); 14. RPr rPr = (); 15. 16. rf = new 17. (sTHint); 18. (fontFamily); 19. (fontFamily); 20. (rf); 21. 22. BooleanDefaultTrue bdt = ().createBooleanDefaultTrue(); 23. (bdt); 24. if(isBold){ 25. (bdt); 26. } 27. color = new 28. (colorVal); 29. (color); 30. 31. sz = new 32. (new BigInteger(hpsMeasureSize)); 33. (sz); 34. (sz); 35. 36. return rPr; 37. } 38.Text t = (); 39. (data); 40. R run = (); 41. (getRPr("宋体","000000", "18", , isBold) 42. ().add(t); 43. ().add(run); 3.修改单元格/表格样式 单元格内容垂直居中(已有Tctc) 1.TcPr tcpr = (); 2.ObjectFactory factory = (); 3. if(tcpr == null){ 4. tcpr = (); 5. } 合并单元格 1. /** 2. * 功能描述: 合并单元格 3. * 表示合并第startRow(开始行)行中的第startCol(开始列)列到(startCol + colSpan - 1)列 4. * 表示合并第startCol(开始列)行中的第startRow(开始行)列到(startRow + rowSpan - 1)行 5. * @param tc 单元格对象 6. * @param currentRow 当前行号,传入的是遍历表格时的行索引参数 7. * @param startRow 开始行 8. * @param rowSpan 合并的行数,大于1才表示合并 9. * @param currentCol 当前列号,传入的是遍历表格时的列索引参数 10. * @param startCol 开始列 11. * @param colSpan 合并的列数,大于1才表示合并 12. * @author myclover 13. */ 14. public static void setCellMerge(Tc tc , int currentRow , int startRow , int rowSpan , int currentCol , int startCol , int colSpan){ 15. ObjectFactory factory = (); 16. TcPr tcpr = (); 17. if(tcpr == null){ 18. tcpr = (); 19. } 插入分页符 添加换页符相当地简单。 Docx4j拥有一个叫作Br的break对象,这个对象有一个type属性,这种情况下我们需要将其设置为page,type其它可选的值为column和textWrapping。 这个break可以很简单地添加到段落中。 1. private static void addPageBreak() { 2. MainDocumentPart documentPart = (); 3. 4. Br breakObj = new Br(); 5. ; 6. 7. P paragraph = (); 8. ().add(breakObj); 9. ().getBody().getContent().add(paragraph); 10. } 6.插入目录 1.public class AddingTableOfContent { 2. private static ObjectFactory factory; 3. 4. /** 5. * 首先我们创建对象工厂和包并从包中抽出文档部件. 然后我们添加目录表, 后面跟着一些带有分类 6. * 标题样式的段落. 最后我们保存包. 7. */ 8. public static void main(String[] args) throws Docx4JException { 9. factory = (); 10. WordprocessingMLPackage wordMLPackage = (); 11. MainDocumentPart documentPart = (); 12. 13. addTableOfContent(documentPart); 14. 15. ("Heading1", "Hello 1"); 16. ("Heading2", "Hello 2"); 17. ("Heading3", "Hello 3"); 18. ("Heading1", "Hello 1"); 19. 20. (new File("src/main/files/")); 21. } 22. 23. /** 24. * 将目录表添加到文档. 25. * 26. * 首先我们创建段落. 然后添加标记域开始的指示符, 然后添加域内容(真正的目录表), 接着添加域 27. * 结束的指示符. 最后将段落添加到给定文档的JAXB元素中. 28. * 29. * @param documentPart 30. */ 31. private static void addTableOfContent(MainDocumentPart documentPart) { 32. P paragraph = (); 33. 34. addFieldBegin(paragraph); 35. addTableOfContentField(paragraph); 36. addFieldEnd(paragraph); 37. 38.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Docx4J 知识 积累