2009-09-03 45 views
10

有沒有人有任何好的建議或經驗如何使用C#(VB.NET也可以)創建引擎,這是足夠通用的處理大多數MS Word文本字段需要填寫我從數據庫中獲取的數據?總之,我即將開始這個小小的Office自動化遊覽,我希望這裏的一點反饋可以幫助我避免一些耗時的錯誤。MS Word辦公自動化 - 填寫文本表單域和複選框表單域和郵件合併

歡迎並提前致謝,提供任何建議;

戴夫

回答

15

我會派兩個例子來解決你的自動化問題。第一個是使用MailMerge,第二個是使用書籤。

Word文件看起來是這樣的:

使用郵件合併(插入 - >快速零件 - >字段 - >郵件合併 - >合併域) 名:«的firstName» 姓:«的lastName»

=======

使用書籤(插入 - >收藏) 名:(< - 書籤就在這裏,它是不可見) 姓:

而且代碼如下:

  1. 使用書籤

    Open("D:/Doc1.doc"); 
        if (oDoc.Bookmarks.Exists("bkmFirstName")) 
        { 
         object oBookMark = "bkmFirstName"; 
         oDoc.Bookmarks.get_Item(ref oBookMark).Range.Text = textBox1.Text; 
        } 
    
        if (oDoc.Bookmarks.Exists("bkmLastName")) 
        { 
         object oBookMark = "bkmLastName"; 
         oDoc.Bookmarks.get_Item(ref oBookMark).Range.Text = textBox2.Text; 
        } 
    
        SaveAs("D:/Test/Doc2.doc"); Quit(); 
        MessageBox.Show("The file is successfully saved!"); 
    
  2. 使用郵件合併

    Open("D:/Doc1.doc"); 
        foreach (Field myMergeField in oDoc.Fields) 
        { 
         //iTotalFields++; 
         Range rngFieldCode = myMergeField.Code; 
         String fieldText = rngFieldCode.Text; 
    
         // GET only MAILMERGE fields 
         if (fieldText.StartsWith(" MERGEFIELD")) 
         { 
          Int32 endMerge = fieldText.IndexOf("\\"); 
          Int32 fieldNameLength = fieldText.Length - endMerge; 
          String fieldName = fieldText.Substring(11, endMerge - 11); 
    
          fieldName = fieldName.Trim(); 
          if (fieldName == "firstName") 
          { 
           myMergeField.Select(); 
           oWordApplic.Selection.TypeText("This Text Replaces the Field in the Template"); 
          } 
         } 
        } 
        SaveAs("D:/Test/Doc2.doc"); Quit(); 
        MessageBox.Show("The file is successfully saved!"); 
    

我還用一些輔助的方法。

ApplicationClass oWordApplic = new Microsoft.Office.Interop.Word.ApplicationClass(); 
    private Microsoft.Office.Interop.Word.Document oDoc = new Document(); 

    public void Open(string strFileName) 
    { 
     object fileName = strFileName; 
     object readOnly = false; 
     object isVisible = true; 
     object missing = System.Reflection.Missing.Value; 

     oDoc = oWordApplic.Documents.Open(ref fileName, ref missing, ref readOnly, 
     ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, 
     ref missing, ref missing, ref isVisible, ref missing, ref missing, ref missing, ref missing); 

     oDoc.Activate(); 
    } 

    public void SaveAs(string strFileName) 
    { 
     object missing = System.Reflection.Missing.Value; 
     object fileName = strFileName; 

     oDoc.SaveAs(ref fileName, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, 
     ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); 
    } 

    public void Quit() 
    { 
     object missing = System.Reflection.Missing.Value; 
     oWordApplic.Application.Quit(ref missing, ref missing, ref missing); 
    } 

我希望這個實現能給出解決你的問題的一些想法。

+0

這太棒了!你已經救了我很大,現在我已經有了一個好的開始。我嘗試抽象和格式化,以便其他溢出者也可以使用它。 乾杯和感謝; Dave – Daver 2009-09-06 22:35:28