Как обновить поля в верхних и нижних колонтитулах, а не только в главном документе?
В C#, используя wordDocument.Fields.Update()
отлично работает на всем в основном корпусе.
Есть ли предложения по лаконичному и элегантному способу обновления полей в верхних и нижних колонтитулах?
3 ответа:
Это заняло у меня немного времени. Пришлось немного покопаться в Итеропе.Словом документации. Тонны примеров этого в VB, но я думаю, что мой код ниже-хороший пример этого в C#.
using System; using System.Collections.Generic; using System.IO; using Microsoft.Office.Interop.Word; class Program { static void Main(string[] args) { List<string> path = new List<string>(args); string filePathstr = string.Join(" ", path.ToArray()); //System.Windows.Forms.MessageBox.Show("filepathstr: " + filePathstr); string folderPathstr = Path.GetDirectoryName(filePathstr); //System.Windows.Forms.MessageBox.Show("folderPathstr: " + folderPathstr); try { Application ap = new Application(); Document document = ap.Documents.Open(filePathstr); document.Fields.Update(); foreach (Section section in document.Sections) { document.Fields.Update(); // update each section HeadersFooters headers = section.Headers; //Get all headers foreach (HeaderFooter header in headers) { Fields fields = header.Range.Fields; foreach (Field field in fields) { field.Update(); // update all fields in headers } } HeadersFooters footers = section.Footers; //Get all footers foreach (HeaderFooter footer in footers) { Fields fields = footer.Range.Fields; foreach (Field field in fields) { field.Update(); //update all fields in footers } } } document.Save(); document.Close(); } catch (NullReferenceException) { System.Windows.Forms.MessageBox.Show("A valid file was not selected."); } } }
Мне нужно было выполнять более сложные операции с каждым полем в документе Word, поэтому я создал более общий метод расширения итератора:
public static class WordDocument { public static IEnumerable<Field> GetAllFields(this Document _document) { // Main text story fields (doesn't include fields in headers and footers) foreach (Field field in _document.Fields) { yield return field; } foreach (Section section in _document.Sections) { // Header fields foreach (HeaderFooter header in section.Headers) { foreach (Field field in header.Range.Fields) { yield return field; } } // Footer fields foreach (HeaderFooter footer in section.Footers) { foreach (Field field in footer.Range.Fields) { yield return field; } } } } }
Исходный код примера теперь можно изменить на следующий:
using System; using System.Collections.Generic; using System.IO; using Microsoft.Office.Interop.Word; class Program { static void Main(string[] args) { List<string> path = new List<string>(args); string filePathstr = string.Join(" ", path.ToArray()); string folderPathstr = Path.GetDirectoryName(filePathstr); try { Application ap = new Application(); Document document = ap.Documents.Open(filePathstr); foreach (Field field in document.GetAllFields()) { field.Update(); // Other stuff with field can be done here as well } document.Save(); document.Close(); } catch (NullReferenceException) { System.Windows.Forms.MessageBox.Show("A valid file was not selected."); } } }
Ну, использовал это: http://blog.vanmeeuwen-online.nl/2009/09/update-all-fields-in-word-including.html , адаптируясь к C#, просто пропустил условие
If aField.Type = Word.WdFieldType.wdFieldDocProperty
.Работал отлично.