由于ooxml文档规范纳入ISO标准,所以世界一些开源组织对OOXML的java开发包的研发也越来越快,除了apache的POI项目宣布对office2007的支持,其他组织也开始加紧行动,相比行动比较迅速的有dev.plutext.org组织的docx4j这个包比较成熟些,docx提供3种方法来操作docx文档,现在我们可以来看看docx4j是怎么操作docx文档的:
package org.docx4j.samples; import java.io.File; import java.math.BigInteger; import org.docx4j.customxml.ObjectFactory; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.openpackaging.exceptions.InvalidFormatException; import org.docx4j.openpackaging.io.SaveToZipFile; import org.docx4j.wml.STPageOrientation; /** * 创建ooxml文档 * @素馨花 * @version 1.0 */ public class CreateWordprocessingMLDocument { public static void main(String[] args) throws Exception { System.out.println( "Creating package.."); //创建文档处理对象 WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage(); //插入文字方法-1(快捷方法,忽略详细属性) wordMLPackage.getMainDocumentPart().addStyledParagraphOfText("Title", "赛灵通(www.xerllent.cn)工作文档标题"); wordMLPackage.getMainDocumentPart().addParagraphOfText("赛灵通项目(Xerllent Projects)是一项基于j2ee技术的企业信息化系统研发计划!"); //插入文字方法-2(对象构造法,可以操作任何属性) /** * To get bold text, you must set the run's rPr@w:b, * so you can't use the createParagraphOfText convenience method * org.docx4j.wml.P p = wordMLPackage.getMainDocumentPart().createParagraphOfText("text");//创建无格式文本代码段 * */ org.docx4j.wml.ObjectFactory factory = new org.docx4j.wml.ObjectFactory();//文档子对象工厂 org.docx4j.wml.P p = factory.createP();//创建段落P //创建文本段R内容 org.docx4j.wml.R run = factory.createR();//创建文本段R org.docx4j.wml.Text t = factory.createText();//创建文本段内容Text t.setValue("text"); run.getRunContent().add(t);//Text添加到R //设置文本段R属性,Optionally, set pPr/rPr@w:b org.docx4j.wml.RPr rpr = factory.createRPr(); org.docx4j.wml.BooleanDefaultTrue b = new org.docx4j.wml.BooleanDefaultTrue();//创建带缺省值的boolen属性对象 b.setVal(true); rpr.setB(b); run.setRPr(rpr);//设置文本段R属性 p.getParagraphContent().add(run);//R添加到P // 创建默认的段落属性,并加入到段落对象中去 org.docx4j.wml.PPr ppr = factory.createPPr(); org.docx4j.wml.ParaRPr paraRpr = factory.createParaRPr(); ppr.setRPr(paraRpr); p.setPPr( ppr );//段落属性PPr添加到P //将P段落添加到文档里 wordMLPackage.getMainDocumentPart().addObject(p); //动态插入打印页面及分栏设置,这时一个A3幅面,页面分2栏的设置,试卷页面 org.docx4j.wml.SectPr sp= factory.createSectPr(); org.docx4j.wml.SectPr.PgSz pgsz=factory.createSectPrPgSz();//<w:pgSz w:w="23814" w:h="16840" w:orient="landscape" w:code="8"/> pgsz.setW(BigInteger.valueOf(23814L)); pgsz.setH(BigInteger.valueOf(16840L)); pgsz.setOrient(STPageOrientation.LANDSCAPE); pgsz.setCode(BigInteger.valueOf(8L)); sp.setPgSz(pgsz); org.docx4j.wml.SectPr.PgMar pgmar= factory.createSectPrPgMar();//<w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="720" w:footer="720" w:gutter="0"/> pgmar.setTop(BigInteger.valueOf(1440)); pgmar.setRight(BigInteger.valueOf(1440)); pgmar.setBottom(BigInteger.valueOf(1440)); pgmar.setLeft(BigInteger.valueOf(1440)); pgmar.setHeader(BigInteger.valueOf(720)); pgmar.setFooter(BigInteger.valueOf(720)); sp.setPgMar(pgmar); org.docx4j.wml.CTColumns cols=factory.createCTColumns();//<w:cols w:num="2" w:space="425"/> cols.setNum(BigInteger.valueOf(2)); cols.setSpace(BigInteger.valueOf(425)); sp.setCols(cols); org.docx4j.wml.CTDocGrid grd=factory.createCTDocGrid();//<w:docGrid w:linePitch="360"/> grd.setLinePitch(BigInteger.valueOf(360)); sp.setDocGrid(grd); wordMLPackage.getMainDocumentPart().addObject(sp); // 插入文字方法-3(更加简便快捷的插入内容方法,可以操作任何属性,但必须熟悉ooxml文档格式) //自定义标签转化的时候,必须加xmlns:w=/"http://schemas.openxmlformats.org/wordprocessingml/2006/main/"语句 String str = "<w:p xmlns:w=/"http://schemas.openxmlformats.org/wordprocessingml/2006/main/" ><w:r><w:rPr><w:b /></w:rPr><w:t>Bold, just at w:r level</w:t></w:r></w:p>"; wordMLPackage.getMainDocumentPart().addObject(org.docx4j.XmlUtils.unmarshalString(str)); //自定义标签转化的时候,必须加xmlns:w=/"http://schemas.openxmlformats.org/wordprocessingml/2006/main/"语句 String str1 = "<w:sectPr xmlns:w=/"http://schemas.openxmlformats.org/wordprocessingml/2006/main/" w:rsidR=/"00F10179/" w:rsidRPr=/"00CB557A/" w:rsidSect=/"001337D5/"><w:pgSz w:w=/"23814/" w:h=/"16840/" w:orient=/"landscape/" w:code=/"8/"/><w:pgMar w:top=/"1440/" w:right=/"1440/" w:bottom=/"1440/" w:left=/"1440/" w:header=/"720/" w:footer=/"720/" w:gutter=/"0/"/><w:cols w:num=/"2/" w:space=/"425/"/><w:docGrid w:linePitch=/"360/"/></w:sectPr>"; wordMLPackage.getMainDocumentPart().addObject(org.docx4j.XmlUtils.unmarshalString(str1) ); System.out.println( ".. done!"); // Now save it wordMLPackage.save(new java.io.File(System.getProperty("user.dir") + "/sample-docs/bolds.docx") ); System.out.println("Done."); } }
如果你喜欢本文, 请长按二维码,关注公众号 分布式编程. 作者:分布式编程 出处:https://zthinker.com/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。