Заполнение полей шаблона Word с помощью C#

В настоящее время, если я создаю шаблон документа Word с полями, а затем заполняю их с помощью C#, я делаю это подобно этому...

object missing = Type.Missing;
Word.Application app = new Word.Application();
Word.Document doc = app.Documents.Open("file.doc", ref missing, true);
Word.FormFields fields = doc.FormFields;
fields[2].Result = "foo"
fields[3].Result = "bar"

Есть ли лучший способ ссылки на поля?

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

2 ответа

Решение

Вы используете устаревшие формы? Когда вы добавляете устаревшее поле формы в документ Word, в разделе "Свойства"> "Настройки поля" появляется закладка, которая в основном является именем поля. По умолчанию унаследованное текстовое поле будет иметь закладку "Текст1", "Текст2" и т. Д.

Итак, в VBA:

ActiveDocument.FormFields("Text1").Result = "asdf"

В вашем случае это может быть (C#):

doc.FormFields["Text1"].Result = "asdf"

Или вы можете просто написать цикл, который просматривает список полей и ищет заданное имя (псевдо-VB):

Function GetFieldByName(name As String) As Field
    Dim i
    For i = 0 to fields.count - 1
        If fields(i).Name = name Then Return fields(i)
    Next
    Return Nothing
End Function

Если вы используете более новые элементы управления полем формы, где вы можете установить тег и автоматизировать с помощью VSTO (C#):

doc.SelectContentControlsByTag("Address")[1].Range.Text = "asdf"

Узнайте больше о Контент Контролс здесь.

Один хороший способ сделать это, чтобы в каждом месте шаблона, который вы хотели бы добавить позже, поместить закладку (Вставка -> Ссылки -> Закладка). Чтобы использовать их из своего кода, вы должны получить доступ к каждой закладке по ее имени, см. Этот пример:

Word._Application wApp = new Word.Application();
Word.Documents wDocs = wApp.Documents;
Word._Document wDoc = wDocs.Open(ref "file_path_here", ReadOnly:false);
wDoc.Activate();

Word.Bookmarks wBookmarks = wDoc.Bookmarks;
Word.Bookmark wBookmark = wBookmarks["Bookmark_name"];
Word.Range wRange = wBookmark.Range;
wRange.Text = valueToSetInTemplate;

Для моего конкретного документа нам пришлось обратиться к нему по-другому, потому что элементы были переменными.

object missing = Type.Missing;
Word.Application app = new Word.Application();
Word.Document doc = app.Documents.Open(@"C:\\test1.dot", ref missing, true);
doc.Activate(); 
doc.Variables["CASE PLAN_PLAN_STATUS"].Value = "asdf1";
Другие вопросы по тегам