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

时间:2017-07-11 19:11:02

标签: c# visual-studio ms-word automation primary-interop-assembly

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

这种方法很完美但是在某些文档中发生的事情是在段落之间添加了新行。经过进一步调查后发现段落格式正在被改变,即行间距从零增加到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&gt; 1”的if语句。我注意到除了一个空行之外什么都没有,它仍被视为段落,该段落中的文本长度为1。使用空白行时,即使没有进行任何替换,当插入它时,实际上会再添加一行。因此,为了解决这个问题,我只是使用它来确保段落中至少有一个字母,而不仅仅是一个空行。这样,段落之间不会添加额外的空白行。

1 个答案:

答案 0 :(得分: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) { }