Заполнение полей шаблона 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";