[轉載]Java生成Word文檔
在開發文檔系統或辦公系統的過程中,有時候我們需要導出word文檔。在網上發現了一個用PageOffice生成word文件的功能,就將這塊拿出來和大家分享。
生成word文件與我們編輯word文檔本質上是相同的,只不過在用程序生成word文檔的時候換成了用代碼來操作。下面的例子中主要有添加標題,正文(段落、字體、字號、倍行間距、對齊方式、首行縮進等),插入圖片等操作。這裏寫的例子給出的內容只是PageOffice 組件生成word文件的部分方法,需要使用更多方法的還是要自己根據實際的需求去查看API。API地址:http://www.zhuozhengsoft.com/help/java3/index.html
查看com.zhuozhengsoft.pageoffice.wordwriter 包下的對象和方法是用來生成word文件的
那就直接先上代碼吧:
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文件的末尾位置;
---------------------------------------------------------------------------------------------------------------------------------------------------
createDataRegion
public DataRegion createDataRegion(java.lang.String newDataRegionName, DataRegionInsertType insertType, java.lang.String relativeDataRegionName) throws java.lang.Exception, java.io.IOException
- 創建一個新的數據區域,並返回 DataRegion 對象。
調用此方法可以輕松地在指定的數據區域之前或之後創建新的數據區域並對新數據區域賦值或控制。
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
查看示例:三、7、完全編程實現動態生成Word文件
[轉載]Java生成Word文檔