摘 要 開發中往往會因業務需要對word文檔進行操作和處理,本文介紹.net處理word文檔的配置、準備工作以及規范的開發過程,并給出了部分標準化的處理過程代碼段。
關鍵詞 C#. net word 文檔處理
鑒于大量用戶非常熟悉辦公軟件特別是微軟office軟件,應用軟件開發過程中常常需要將一些應用數據以一定的格式轉換成word或者excel軟件,這就需要在軟件開發中實施對word文檔的控制和處理。這種控制的細節是因具體需求而千變萬化的,但其基礎配置、準備和部分開發過程是具有一定“套路”的。本文結合實際開發談談粗淺的認識,包括如何在開發前做好系統配置工作、如何做好開發準備工作以及標準的開發過程并以C#語言形式提供部分標準化的程序代碼。
一、配置準備工作
為了在開發和部署應用后能夠正常實施對word文檔的控制和處理,必須在開發環境和部署服務器上做好一些準備工作。首先,重新安裝office軟件部件以支持開發,并在開發環境中添加引用Microsoft.Office.Interop.Word.12。其次,修改操作系統和iis中的權限以支持.net調用word部件。操作程序如下:
1.控制面板→管理工具→組件服務→計算機→我的電腦→DCom配置→找到Microsoft Word文檔之后,單擊屬性打開此應用程序的屬性對話框。
2.單擊標識選項卡,然后選擇交互式用戶。
3.單擊“安全”選項卡,分別在“啟動和激活權限”和“訪問權限”組中選中“自定義”,然后自定義→編輯→添加ASP.NET賬戶和IUSER_計算機名。
4.確保允許每個用戶訪問,然后單擊確定。
5.單擊確定關閉DCOMCNFG。
6.調整webconfig中的權限配置,請嘗試用下面的方法:在web.config中使用身份模擬,在
二、開發準備工作
完成配置準備工作后,可以為后續的開發做一些具體的準備,包括:
1.建立一個符合項目開發需要的word模板;
2.在模板中需要實施操作以插入內容的位置定義標簽(bookmark)并完成命名工作,這一步非常重要,標簽是開發中判斷在什么具體位置插入要顯示的內容的關鍵;
3.在需要處理word文檔的代碼文件中引用word類,即using Microsoft.Office.Interop.Word;
三、開發過程
完成配置準備工作后即可根據具體需求實施開發工作了,具體的開發因項目差異而存在極大的差異,但就word文檔控制和處理而言,存在一些共性的過程,這些共性的過程包括定義對象、新建word文檔或獲取word模板并根據模板新建word文檔、指定文檔的插入位置(根據書簽)、對象插入、數據插入、文檔保存、收尾工作等。
1.定義對象。定義對象是所有開發過程的前提,在處理word文檔的開發過程,必須要定義的一些對象如下:
Application對象,用以打開word程序,定義:Application appWord = new Application();
Document 對象,是一個word文檔對象用以打開一個word文檔,定義:Document doc = new Document();或DocumentClass doc = 1;
object對象,在使用word操作相關函數是用于缺省參數,定義:object oMissing = System.Reflection.Missing.Value;
object對象,表示是否保存文檔中已發生改變,定義:的object do Not Save Changes = WdSaveOptions.wdDoNotSaveChanges;
模板類型對象,并指定路徑,定義:object objTemplate = Server.MapPath(\"~\\path\\name.dot\");要注意指定文檔路徑時的格式和轉義;
文檔類型對象,定義:object objDocType = WdDocumentType.wdTypeDocument;
布爾型的對象,object objTrue = true;
布爾型的對象,object objFalse = 1;以上兩個對象主要用于某些函數中的布爾型引用;
定義書簽對象并指向word文檔中已存在的書簽object doc_bookmark = \"bookmark\";
2.利用模板創建新文檔并根據書簽寫入內容。
(1)創建新文檔。
doc = (DocumentClass)appWord.Documents.Add(ref objTemplate, ref objFalse, ref objDocType, ref objTrue);
(2)根據書簽寫入內容。
①寫入普通文本:
doc.Bookmarks.get_Item(ref doc_bookmark).Range.Text = “string”;
②寫入表格并控制表格樣式:
利用書簽定義處理“范圍”,以明確表格插入位置,Range wrdRng = doc.Bookmarks.get_Item(ref doc_bookmark).Range;
根據前面定義的wrdRng定義一個表格對象,并指明行列(rows和column為整數類型),Table newTable = doc.Tables.Add(wrdRng, rows, columns, ref oMissing, ref oMissing);oMissing為前面定義的缺省值參數;
指定表格中字號大小,newTable.Range.Font.Size = 11;
指定表格文本框中文字的對齊方式newTable.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;(示例代碼中指定水平居中對齊)
指定表格外邊框樣式,newTable.Borders.OutsideLineStyle = WdLineStyle.wdLineStyleSingle;
指定表格外邊框線條的粗細,newTable.Borders.OutsideLineWidth = WdLineWidth.wdLineWidth150pt;
指定表格內邊框樣式,newTable.Borders.InsideLineStyle = Microsoft.Office.Interop.Word.WdLineStyle.wdLineStyleSingle;
指定表格某列的寬度,newTable.Columns[1].Width = 50f;
定義單元格對象并指定到表格中的某個單元格,Cell cell = doc.Tables[1].Cell(1, 1);(示例代碼中table中的參數指明所操作表格為文檔中的的第一個表格,cell的參數指明所操作的單元格為第一個表格的第一行、第一列單元格);
向單元格中寫入內容,cell.Range.Text = \"string\";
合并單元格,先指定起始單元格cell = doc.Tables[1].Cell(1, 1);再使用Merge函數,cell.Merge(doc.Tables[1].Cell(dt.Rows.Count + 1, 5));merge函數的參數為要合并的最后一個單元格;
③插入圖片:
利用書簽定義處理“范圍”,以明確圖片插入位置,Range wrdRng = doc.Bookmarks.get_Item(ref doc_bookmark).Range;
定義兩個對象類型用以表示圖片插入起止位置,object start;object end;
指定圖片指定的起止位置為書簽的起止位置,start = doc_bookmark.Start;end = doc_bookmark.End;
根據一定的路徑和指定的起止位置插入圖片,InlineShape li = doc.Range(ref start, ref end).InlineShapes.AddPicture(imgPath, ref oMissing, ref oMissing, ref oMissing);
④生成并根據指定路徑保存word文檔:
選取word文檔內容,doc.Content.Select();
更新內容域,doc.Content.Fields.Update();
指定文檔保存路徑,注意路徑格式和轉義字符的處理,object filename = Server.MapPath(\"~\") + \"path\\name.doc\";
將文檔保存到指定的路徑,doc.SaveAs(ref filename, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing);
object doNotSaveChanges1 = WdSaveOptions.wdDoNotSaveChanges;
關閉保存完畢的word文檔,doc.Close(ref doNotSaveChanges1, ref oMissing, ref oMissing);
⑤退出word應用程序,處理未能退出的進程:
退出word應用程序,appWord.Quit(ref oMissing, ref oMissing, ref oMissing);
將文檔對象引用指定為空,doc = 1;
將引用程序對象引用指定為空,appWord = 1;
以下代碼段是調用c#的垃圾回收函數清理系統內存資源,強行關閉未退出的word進程的操作:
GC.Collect();
GC.WaitForPendingFinalizers();
Process myProcess = new Process();
Process[] wordProcess = Process.GetProcessesByName(\"winword\");
try
{
foreach (Process pro in wordProcess)
{
IntPtr ip = pro.MainWindowHandle;
string str = pro.MainWindowTitle;
if (string.IsNullOrEmpty(str))
{
pro.Kill();
}
}
}
catch (Exception ex)
{
ex.ToString();
}
四、體會
C#.net下對word文檔的處理和控制技術是微軟VBA技術適用C#語言的一種變化,開發人員只要基于VBA宏語言結合c#語言特點和包即可展開開發。該技術本身并不新建,但其在程序中根據用戶需求自動生成符合格式規范和要求的word文檔確是一項非常實用、能夠很好提高用戶體驗、降低用戶操作強度、提高用戶滿意度的技術,能夠為軟件項目的順利實施和應用提供意想不到的便利和良好的用戶反饋。