Как обновить поля в верхних и нижних колонтитулах, а не только в главном документе?


В C#, используя wordDocument.Fields.Update() отлично работает на всем в основном корпусе.

Есть ли предложения по лаконичному и элегантному способу обновления полей в верхних и нижних колонтитулах?

3 5

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.

Работал отлично.