MS Word Office Automation - заполнение полей текстовой формы и полей формы поля и слияние писем

Есть ли у кого-нибудь хорошие советы или опыт о том, как создать движок с помощью С# (VB.NET тоже в порядке), который является достаточно общим для обработки большинства текстовых полей MS Word, мне нужно заполнить данные, которые я получаю из базы данных? Короче говоря, я собираюсь начать эту небольшую экскурсию по автоматизации Office, и я надеюсь, что немного обратной связи здесь поможет мне избежать некоторых трудоемких ошибок.

Приветствия и благодарности за любые советы;

Dave

Ответ 1

Я приведу два примера для решения проблемы автоматизации. Первый использует MailMerge, а второй использует закладки.

Файл слова выглядит следующим образом:

Использование MailMerge (Insert → Quick Parts → Field → Mail merge → Merge field) Имя: "firstName" Фамилия: "lastName"

=======

Использование закладок (Insert → BookMark) Имя: (< - закладка здесь, ее не видно) Фамилия:

И код следующий:

  • Использование закладок

        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!");
    
  • Использование MailMerge

        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);
    }

Я надеюсь, что эта реализация даст некоторые идеи для решения вашей проблемы.