許久沒來寫博客了,已至於登錄博客園的密碼都忘卻了。
時間過的真快,最近再做一個招聘管理系統,其中用到了導出Word文檔的功能,嘗試了各種方法,遇到了各種問題。不過最后還是解決了導出Word的問題。
一、針對導出Word文檔的功能,采用的幾個方案:
1.預置好Word文檔模板,采用加載替換文檔內容標簽的方式實現。
采用這種方案可以借助兩個第三方組件來實現,分別如下:
(1)、借助Microsoft.Office.Interop.Word組件實現。
(2)、借助NPOI實現。
(3)、借助Aspose.Words實現。
2.繪制方案,即利用第三方組件現實Word文件的繪制。
繪制方案的難點如下:
(1)、段落、表格的處理。
(2)、樣式的處理。
二、實現
方案選擇:最終權衡利弊,還是采用替換的方式更為合理,由於導出功能的使用量並不大,而且並發導出的情況也極少發生。所以在可行性方面,該方案可行。
1.首先采用的是借助Microsoft.Office.Interop.Word組件實現。
采用此方案實現的相關代碼網上有很多很多,大家可以搜下。利用此方法我實現了替換導出,但是問題來了,由於服務器上由於盜版審查,不允許安裝盜版軟件,而且Microsoft.Office.Interop.Word是需要在服務器上安裝Office的,所以被系統管理員Pass,經多方溝通后,還是不允許安裝。無奈只能另想辦法。
2.借NPOI實現。
NPOI是開源的框架,免費,但是由於對.net開發來說,NPOI對Excel的支持那是相當的強大的,唯獨對Word的支持還不是那么強大,而且最新NPOI2.1的說明文檔和案例又少之又少。不過還是硬着頭皮利用NPOI分別實現了下模板標簽替換和word繪制,最終都以失敗告終。替換后導出的word怎么也打不找,提示錯誤。繪制的方法成功的導出的Word,但是樣式實在是整不了。
3.借助Aspose.Words實現
在經過上述嘗試和實現后,思維陷入了崩潰的境地,好在同事提醒,說有個Aspose.Words可以一試。查了下Aspose.Words,發現了收費的,可然在還是有破解版的。考慮到是內部用的,而且不是商業用途,所以試着實現了下。
利用Aspose.Words實現官網上有相關的案例,支持各種輸出。大家可以百度下。
我這里要強調的是模板的制做,我采用的是替換 “文檔部件”來實現的。
具體操作見圖:
(1).模板制做
插入文檔部件,仔細看,你會在圖的最右側看到 “文檔部件”
選擇“域”項
域名選擇“MergeField”
域名置為"UserName"。
上圖就是模板的效果,當然,你可以自己美化和調整,到此我們的模板就制做完成了,接下來就是寫程序執行替換了。
(2).替換
private void ExportByAsPose(string vouchId) { try { //模板路徑 string tempPath = ConfigurationManager.AppSettings["RmaApplyTemplate"]; string outputPath = "D:/招聘需求申請表.doc"; var doc = new Document(tempPath); //載入模板 //提供數據源 String[] fieldNames = new String[] { "UserName" }; Object[] fieldValues = new Object[] { "Jerry" }; //合並模版,相當於頁面的渲染 doc.MailMerge.Execute(fieldNames, fieldValues); //保存合並后的文檔 //doc.Save(outputPath); //在WebForm中,保存文檔到流中,使用Response. BinaryWrite輸出該文件 var docStream = new MemoryStream(); doc.Save(docStream, SaveOptions.CreateSaveOptions(SaveFormat.Doc)); Response.ContentType = "application/msword"; Response.AddHeader("content-disposition", "attachment; filename=招聘需求申請表.doc"); Response.BinaryWrite(docStream.ToArray()); Response.End(); //File.Delete("D:/招聘需求申請表.docx"); //清除服務端生成的word文件 } catch (Exception e) { Response.Write(e.Message + " 請聯系管理員!"); } }
好了,到此完成了Word文檔的導出。 給自己留個印象,特此小記。
希望對大家有所幫助。