2009-09-03 118 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