C# 替换字符串中的文本会更改 Word 中的段落格式 - 互操作程序集

问题描述 投票:0回答:2

我有一个代码,我使用主互操作程序集迭代 Word 文档中的每个段落。我本质上所做的是将每个段落中的所有文本提取到一个字符串中。然后我在该字符串中搜索特定的关键词/短语。如果存在,则将其与其他东西交换。然后将该段落插入回文档中。

这很有效,但是在某些文档中,发生的情况是在段落之间添加了新行。经过进一步调查,发现段落格式正在改变,即行间距从 0 增加到 12,其他事情也发生了变化,其中包括从段落中删除左缩进等。

我想知道是否有任何方法可以执行上述任务,而不会在插入文本时更改段落属性。下面包含我的代码,以展示我如何迭代文档。

在进入主要代码之前,我确实使用以下命名空间打开了一个单词应用程序和文档:

using Word = Microsoft.Office.Interop.Word

然后是下面的代码

Word.Application app = new Word.Application();
Word.Document doc = app.Documents.Open(filePath, ReadOnly: false);

打开文档后,我做了以下操作:

try
        {
            int totalParagraphs = document.Paragraphs.Count;
            string final;
            for (int i = 1; i <= totalParagraphs; i++)
            {
                string temp = document.Paragraphs[i].Range.Text;
                if (temp.Length > 1)
                {
                    Regex regex = new Regex(findText);
                    final = regex.Replace(temp, replaceText);
                    if (final != temp)
                    {
                        document.Paragraphs[i].Range.Text = final;

                    }
                }
            }
        } catch (Exception) { }

需要注意的是,我有一个带有“temp.Length > 1”的 if 语句。我注意到除了一个空行之外什么也没有,它仍然被算作一个段落,并且该段落中存在的文本长度为一。当使用空行时,即使没有进行替换,在将其插入回时实际上也会再次添加额外的行。因此,为了解决这个问题,我只是用它来确保该段落中至少有一个字母,而不仅仅是一个空行。这样,段落之间就不会添加额外的空行。

c# visual-studio ms-word automation primary-interop-assembly
2个回答
1
投票

我已经找到了我自己问题的答案。我已在下面提供了解决方案,以防其他人遇到同样的问题或希望参考。

您要做的就是在进行任何更改之前获取提取文本的段落格式属性。然后,一旦将段落重新插入,请设置我们之前提取到插入的段落的相同属性,以应对可能已进行的任何更改。完整代码如下:

try
        {
            int totalParagraphs = document.Paragraphs.Count;
            string final;
            for (int i = 1; i <= totalParagraphs; i++)
            {
                string temp = document.Paragraphs[i].Range.Text;

                float x1 = document.Paragraphs[i].Format.LeftIndent;
                float x2 = document.Paragraphs[i].Format.RightIndent;
                float x3 = document.Paragraphs[i].Format.SpaceBefore;
                float x4 = document.Paragraphs[i].Format.SpaceAfter;

                if (temp.Length > 1)
                {
                    Regex regex = new Regex(findText);
                    final = regex.Replace(temp, replaceText);
                    if (final != temp)
                    {
                        document.Paragraphs[i].Range.Text = final;
                        document.Paragraphs[i].Format.LeftIndent = x1;
                        document.Paragraphs[i].Format.RightIndent = x2;
                        document.Paragraphs[i].Format.SpaceBefore = x3;
                        document.Paragraphs[i].Format.SpaceAfter = x4;
                    }
                }
            }
        } catch (Exception) { }

0
投票

感谢您建议的解决方案。现在,Office Word 2021 对我来说不起作用。我已经尝试了很多不同的解决方案,不仅是其他人,还有我的解决方案,但都不起作用。我仍然希望找到一种方法来做到这一点。 Word 挂起并且没有应答,因此我通过任务管理器将其终止。我担心操作会破坏文档结构中的其他内容。 至少致以最诚挚的问候和感谢。:)

© www.soinside.com 2019 - 2024. All rights reserved.