分节符后 Word Interop 缺少页眉和页脚

Word Interop Missing Headers and Footers After Section Break

我正在使用 Word Interop 根据模板和 UI 我公司的输入生成一堆文档(实质上是用用户提供的值替换文档的某些区域)。这一切似乎在每个 Range in Document.StoryRanges 上使用 Find.Execute() 方法都可以正常工作,但是,它似乎没有在分节符后处理页眉和页脚(它在处理之前完全没问题)。

我将如何确保捕获 整个 文档,包括页眉、页脚和正文?

下面是我的代码的相关部分,使用的 KVP 本质上是在实例化时传递给我的引擎 class 的查找替换对。

    private void ReplaceFieldsWithValues(string tempFile)
    {
        object missing = Missing.Value;
        Application wordApp = new ApplicationClass();
        wordApp.Documents.Open(tempFile);
        Document doc = wordApp.ActiveDocument;
        object replaceAll = WdReplace.wdReplaceAll;
        foreach (Range range in doc.StoryRanges)
        {
            foreach (KeyValuePair<string, string> referenceValue in _referenceValuePair)
            {
                Find findObject = range.Find;
                findObject.ClearFormatting();
                findObject.Text = $"&{{{referenceValue.Key}}}&";
                findObject.Replacement.ClearFormatting();
                findObject.Replacement.Text = referenceValue.Value;
                findObject.Execute(ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing,
                    ref missing, ref replaceAll, ref missing, ref missing, ref missing, ref missing);
            }
        }
        doc.Save();
        doc.Close();
    }

Word Interop 的文档不是最好的,但我找到了一个解决方案,本质上是按部分而不是 StoryRanges 获取 headerfooter range 对象,然后分别处理它们.我将我的查找和替换代码提取到一个单独的方法中,现在我的方法如下所示:

    private void ReplaceFieldsWithValues(string tempFile)
    {

        Application wordApp = new ApplicationClass();
        wordApp.Documents.Open(tempFile);
        Document doc = wordApp.ActiveDocument;
        foreach (Range range in doc.StoryRanges)
        {
            foreach (KeyValuePair<string, string> referenceValue in _referenceValuePair)
            {
                FindReplaceInRange(referenceValue.Key,referenceValue.Value,range,true);
            }
        }
        foreach (Section section in doc.Sections)
        {
            foreach (HeaderFooter header in section.Headers)
            {
                foreach (KeyValuePair<string, string> referenceValue in _referenceValuePair)
                {
                    FindReplaceInRange(referenceValue.Key, referenceValue.Value, header.Range, true);
                }
            }
            foreach (HeaderFooter footer in section.Footers)
            {
                foreach (KeyValuePair<string, string> referenceValue in _referenceValuePair)
                {
                    FindReplaceInRange(referenceValue.Key, referenceValue.Value, footer.Range, true);
                }
            }
        }
        doc.Save();
        doc.Close();
    }

这现在看起来工作正常。