Почтовые слияния Word 2003 Поля заголовка C # - PullRequest
0 голосов
/ 18 апреля 2011

Я нахожусь в процессе написания небольшой библиотеки, которая будет выполнять MailMerge для документа Word 2003.DOT в C #.Я могу получить и заменить все поля тела документа следующим образом:

foreach (Field mergeField in document.Fields)
    {
       if (mergeField.Type == WdFieldType.wdFieldMergeField)
       {
          string fieldText = mergeField.Code.Text;
          string fieldName = Extensions.GetFieldName(fieldText);

          if (values.ContainsKey(fieldName))
          {
             mergeField.Select();
             application.Selection.TypeText(values[fieldName]);
          }
       }
    }

Но это не приводит к извлечению полей верхнего или нижнего колонтитула из документа ..

Я пробовал это:

   subscriptionDocument.Sections[1].Headers[WdHeaderFooterIndex.wdHeaderFooterPrimary].Range.Fields.Count;

Для запроса полей заголовка, но получаю счетчик, возвращаемый "0", хотя поля физически существуют.

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

Ответы [ 2 ]

1 голос
/ 19 апреля 2011

Ваш код правильный, и обычно вы можете посчитать поля в заголовке с ним. Я полагаю, что тестовый документ, с которым вы работаете, имеет немного другую структуру, например, даже заголовки или заголовок первой страницы. С помощью «wdHeaderFooterPrimary» вы получаете доступ не к первой странице, если в разделе активирована «Другая первая страница». Откройте тестовый документ в Word, запустите редактор VBA (Alt + F11), перейдите в «Немедленную Windows» и введите

?activedocument.Sections(1).Headers(wdHeaderFooterFirstPage).Range.Fields.Count

для доступа к полям в заголовке первой страницы.

0 голосов
/ 27 июня 2019

Вам нужно явно искать в верхних и нижних колонтитулах отдельно от основного документа. Это работает для меня ...

putField("First_Name", "Fred");
putField("Last_Name", "Bloggs");

private void putField(string search, string replace) {
    foreach (Section section in doc.Sections) {
        doReplace(section.Range.Find, search, replace);
    foreach (HeaderFooter h in section.Headers) {
        doReplace(h.Range.Find, search, replace);
    }
     foreach (HeaderFooter f in section.Footers) {
        doReplace(f.Range.Find, search, replace);
    }
    }
}

private void doReplace(Find fnd, string search, string replace){
        fnd.ClearFormatting();
        fnd.Replacement.ClearFormatting();
        fnd.Forward = true;
        fnd.Wrap = WdFindWrap.wdFindContinue;
        fnd.Text = "«" + search + "»";
        fnd.Replacement.Text = replace;
        fnd.Execute(Replace: WdReplace.wdReplaceAll);
}
...