1

我正在编写一个小型库,它将在 C# 中对 word 2003 .DOT 文档执行 MailMerge。我能够检索和替换所有文档正文字段,如下所示:

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”,即使字段物理存在。

有没有一种方法可以实现对页眉和页脚字段的预期影响?

4

2 回答 2

1

您需要与主文档分开显式搜索页眉和页脚。这对我有用...

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);
}
于 2019-06-27T03:12:03.063 回答
0

您的代码是正确的,通常您可以用它来计算标题中的字段。我猜您正在使用的测试文档的布局略有不同,例如页眉或首页页眉。如果在该部分中激活了“不同的首页”,则使用“wdHeaderFooterPrimary”访问的不是首页。在 Word 中打开您的测试文档,启动 VBA 编辑器 (Alt+F11),转到即时窗口并键入

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

访问第一页标题中的字段。

于 2011-04-19T06:37:32.277 回答