在开发文档系统或办公系统的过程当中,有时候咱们须要导出word文档。在网上发现了一个用PageOffice生成word文件的功能,就将这块拿出来和你们分享。html
生成word文件与咱们编辑word文档本质上是相同的,只不过在用程序生成word文档的时候换成了用代码来操做。下面的例子中主要有添加标题,正文(段落、字体、字号、倍行间距、对齐方式、首行缩进等),插入图片等操做。这里写的例子给出的内容只是PageOffice 组件生成word文件的部分方法,须要使用更多方法的仍是要本身根据实际的需求去查看API。API地址:http://www.zhuozhengsoft.com/help/java3/index.htmljava
查看com.zhuozhengsoft.pageoffice.wordwriter 包下的对象和方法是用来生成word文件的web
那就直接先上代码吧:编程
1 PageOfficeCtrl poCtrl1 = new PageOfficeCtrl(request); 2 poCtrl1.setServerPage(request.getContextPath()+"/poserver.zz"); 3 //建立WordDocument对象 4 WordDocument doc = new WordDocument(); 5 //设置内容标题 6 //建立DataRegion对象,PO_title为自动添加的书签名称,书签名称需以“PO_”为前缀,切书签名称不能重复 7 //三个参数分别为要新插入书签的名称、新书签的插入位置、相关联的书签名称(“[home]”表明Word文档的第一个位置) 8 DataRegion title = doc.createDataRegion("PO_title", 9 DataRegionInsertType.After, "[home]"); 10 //给DataRegion对象赋值 11 title.setValue("C#中Socket多线程编程实例\n"); 12 //设置字体:粗细、大小、字体名称、是不是斜体 13 title.getFont().setBold(true); 14 title.getFont().setSize(20); 15 title.getFont().setName("黑体"); 16 title.getFont().setItalic(false); 17 //定义段落对象 18 ParagraphFormat titlePara = title.getParagraphFormat(); 19 //设置段落对齐方式 20 titlePara.setAlignment(WdParagraphAlignment.wdAlignParagraphCenter); 21 //设置段落行间距 22 titlePara.setLineSpacingRule(WdLineSpacing.wdLineSpaceMultiple); 23 24 //设置内容 25 //第一段 26 //建立DataRegion对象,PO_body为自动添加的书签名称 27 DataRegion body = doc.createDataRegion("PO_body",DataRegionInsertType.After, "PO_title"); 28 //设置字体:粗细、是不是斜体、大小、字体名称、字体颜色 29 body.getFont().setBold(false); 30 body.getFont().setItalic(true); 31 body.getFont().setSize(10); 32 //设置中文字体名称 33 body.getFont().setName("楷体"); 34 //设置英文字体名称 35 body.getFont().setName("Times New Roman"); 36 body.getFont().setColor(Color.RED); 37 //给DataRegion对象赋值 38 body.setValue("是微软随着VS.net新推出的一门语言。它做为一门新兴的语言,有着C++的强健,又有着VB等的RAD特性。并且,微软推出C#主要的目的是为了对抗Sun公司的Java。你们都知道Java语言的强大功能,尤为在网络编程方面。因而,C#在网络编程方面也天然不甘落后于人。本文就向你们介绍一下C#下实现套接字(Sockets)编程的一些基本知识,以期能使你们对此有个大体了解。首先,我向你们介绍一下套接字的概念。\n"); 39 //建立ParagraphFormat对象 40 ParagraphFormat bodyPara = body.getParagraphFormat(); 41 //设置段落的行间距、对齐方式、首行缩进 42 bodyPara.setLineSpacingRule(WdLineSpacing.wdLineSpaceAtLeast); 43 bodyPara.setAlignment(WdParagraphAlignment.wdAlignParagraphLeft); 44 bodyPara.setFirstLineIndent(21); 45 46 //第二段 47 DataRegion body2 = doc.createDataRegion("PO_body2",DataRegionInsertType.After, "PO_body"); 48 body2.getFont().setBold(false); 49 body2.getFont().setSize(12); 50 body2.getFont().setName("黑体"); 51 body2.setValue("套接字是通讯的基石,是支持TCP/IP协议的网络通讯的基本操做单元。能够将套接字看做不一样主机间的进程进行双向通讯的端点,它构成了单个主机内及整个网络间的编程界面。套接字存在于通讯域中,通讯域是为了处理通常的线程经过套接字通讯而引进的一种抽象概念。套接字一般和同一个域中的套接字交换数据(数据交换也可能穿越域的界限,但这时必定要执行某种解释程序)。各类进程使用这个相同的域互相之间用Internet协议簇来进行通讯。\n"); 52 //body2.setValue("[image]../images/logo.jpg[/image]"); 53 ParagraphFormat bodyPara2 = body2.getParagraphFormat(); 54 bodyPara2.setLineSpacingRule(WdLineSpacing.wdLineSpace1pt5); 55 bodyPara2.setAlignment(WdParagraphAlignment.wdAlignParagraphLeft); 56 bodyPara2.setFirstLineIndent(21); 57 58 //第三段 59 DataRegion body3 = doc.createDataRegion("PO_body3", DataRegionInsertType.After, "PO_body2"); 60 body3.getFont().setBold(false); 61 body3.getFont().setColor(Color.getHSBColor(0, 128, 228)); 62 body3.getFont().setSize(14); 63 body3.getFont().setName("华文彩云"); 64 body3.setValue("套接字能够根据通讯性质分类,这种性质对于用户是可见的。应用程序通常仅在同一类的套接字间进行通讯。不过只要底层的通讯协议容许,不一样类型的套接字间也照样能够通讯。套接字有两种不一样的类型:流套接字和数据报套接字。\n"); 65 ParagraphFormat bodyPara3 = body3.getParagraphFormat(); 66 bodyPara3.setLineSpacingRule(WdLineSpacing.wdLineSpaceDouble); 67 bodyPara3.setAlignment(WdParagraphAlignment.wdAlignParagraphLeft); 68 bodyPara3.setFirstLineIndent(21); 69 70 //第四段,插入图片 71 DataRegion body4 = doc.createDataRegion("PO_body4", DataRegionInsertType.After, "PO_body3"); 72 body4.setValue("[image]doc/logo.png[/image]"); 73 //body4.setValue("[word]doc/1.doc[/word]");//还可嵌入其余Word文件 74 ParagraphFormat bodyPara4 = body4.getParagraphFormat(); 75 bodyPara4.setAlignment(WdParagraphAlignment.wdAlignParagraphCenter); 76 77 poCtrl1.setWriter(doc); 78 poCtrl1.webOpen("doc/template.doc", OpenModeType.docNormalEdit,"张三");
在开发的过程当中可能会遇到的问题,在此给你们作个解释。网络
DataRegion(数据区域):数据区域也就是“PO_”开头的word书签,标记在生成文件的时数据在文件中插入的位置。多线程
两个无需定义的特殊位置:[home]:表示一个word文件页首的位置;[end]:表示word文件的末尾位置;app
--------------------------------------------------------------------------------------------------------------------------------------------------- 字体
public DataRegion createDataRegion(java.lang.String newDataRegionName, DataRegionInsertType insertType, java.lang.String relativeDataRegionName) throws java.lang.Exception, java.io.IOException
建立一个新的数据区域,并返回 DataRegion 对象。spa
调用此方法能够轻松地在指定的数据区域以前或以后建立新的数据区域并对新数据区域赋值或控制。.net
RelativeDataRegionName通常是文档中已存在的用户已预先定义的数据区域,可是RelativeDataRegionName还可使用PageOffice开发平台预留的两个特殊数据区域:[HOME]和[END]。 [HOME]和[END]不需用户打开文档手动定义,它们分别表明文档的开始光标位置和结束光标位置。
若是当前文档是空白文档,一个数据区域都不存在,使用[HOME]和[END]能够从空白文档生成一个图文并茂的格式文档。
参数:
newDataRegionName
- 新建 DataRegion 的名称。注意:应当确保不与文档中已存在的数据区域同名。
insertType
- 新建 DataRegion 的插入方式。
relativeDataRegionName
- 相对 DataRegion 的名称。
返回:
返回 DataRegion 对象。
---------------------------------------------------------------------------------------------------------------------------------------------------
当一个空白的word文件作模板时,文件中是没有一个数据区域的,下面的代码就是在word文件页首位置的后面建立了一个数据区域PO_title,赋值了标题内容,而后在这个标题的后面建立了一个数据区域PO_body,赋值了正文的内容:
1 DataRegion title = doc.createDataRegion("PO_title",DataRegionInsertType.After, "[home]"); 2 title.setValue("C#中Socket多线程编程实例\n"); 3 DataRegion body = doc.createDataRegion("PO_body",DataRegionInsertType.After, "PO_title"); 4 body.setValue("是微软随着VS.net新推出的一门语言……");
其余的代码应该就无需解释了。运行上面的程序就能够生成以下图所示的word文件了。
源码下载:http://www.zhuozhengsoft.com/dowm/ 下载PageOffice for Java,解压以后,拷贝Samples4文件夹到Tomcat的Webapps目录下,访问:http://localhost:8080/Samples4/index.html
查看示例:3、七、彻底编程实现动态生成Word文件