【问题标题】:Word Interop Missing Headers and Footers After Section Break分节符后 Word 互操作缺少页眉和页脚
【发布时间】:2017-10-06 18:58:07
【问题描述】:

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

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

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

    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();
    }

【问题讨论】:

    标签: c# ms-word office-interop


    【解决方案1】:

    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();
        }
    

    现在看来工作正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-19
      • 2015-12-05
      • 2011-04-07
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      相关资源
      最近更新 更多