【问题标题】:Mail Merge Word 2003 Header Fields C#邮件合并 Word 2003 标题字段 C#
【发布时间】:2019-06-27 11:12:03
【问题描述】:

我正在编写一个小型库,它将在 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”,即使字段实际存在。

有没有办法让我也可以对页眉和页脚字段产生预期的影响?

【问题讨论】:

    标签: c# interop ms-word mailmerge


    【解决方案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);
    }
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 感谢您的意见。我已经在文档的 VBA 编辑器中尝试了这个脚本,但仍然返回 0 的计数,所以这可能只是我正在使用的确切文档的工件。我想我会重新创建文档,看看我是否可以通过这种方式解决问题。
      • 在这种情况下这总是一个好方法(如果代码看起来正确,文档可能是罪魁祸首)。
      猜你喜欢
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多