C#word自动查找并替换长文本字段

时间:2013-01-08 12:48:58

标签: c# ms-word

我有一个函数来查找和替换word文档中的文本占位符。哪个适用于短文本字符串。但是,在尝试替换较大的文本字符串(即一段文本)时,什么都不做。

DocReplaceField(ref Word.Document objDoc, string Field, string Value)
{
   object missing = System.Reflection.Missing.Value;

   Word.Range range = objDoc.Content;

   object findtext = Field;
   object f = false;
   object findreplacement = Value;
   object findforward = false;
   object findformat = true;
   object findwrap = WdFindWrap.wdFindContinue;
   object findmatchcase = false;
   object findmatchwholeword = false;
   object findmatchwildcards = false;
   object findmatchsoundslike = false;
   object findmatchallwordforms = false;
   object findreplace = WdReplace.wdReplaceAll;

   range.Find.Execute(
       findtext,
       findmatchcase,
       findmatchwholeword,
       findmatchwildcards,
       findmatchsoundslike,
       findmatchallwordforms,
       findforward,
       findwrap,
       findformat,
       findreplacement,
       findreplace,
       missing,
       missing,
       missing,
       missing);
}

如果我尝试用“Something”替换“[placeholder]”但是如何用“

“Nullam non lorem sapien,et imperdiet sapien.Curabitur vestibulum justo eu enim bibendum vulputate。整数vel velit non elit molestie auctor non ut nisi。Suspendisse potential.Donec augue nulla,vestibulum a pulvinar id,scelerisque quis mauris。整数eget ullamcorper velit。在purus的sed坐在非neque的amet felis pulvinar dictum.Praesent laoreet mauris id sem venenatis pellentesque。“

例如

更新:

问题似乎是单词的查找和替换不能替换超过255个字符。搜索与占位符匹配,但实际上无法替换文本。有没有人有一个调用find找到占位符但然后手动选择文本并插入新文本的示例。而不是使用单词find和replace。

6 个答案:

答案 0 :(得分:3)

替换文本非常简单:一旦找到它,范围对象将包含文档的找到部分。您需要先删除找到的文本,然后插入新文本:

range.Find.Execute(findtext, findmatchcase, findmatchwholeword, 
    findmatchwildcards, findmatchsoundslike, findmatchallwordforms, findforward, 
    findwrap, findformat, findreplacement, findreplace, missing, 
    missing, missing, missing);

range.Delete();
range.Text = "This is the new content.";

答案 1 :(得分:1)

您可以尝试使用Word书签而不是查找和替换吗?

一个示例片段 -

object oBookMark = "MyBookmark";
oDoc.Bookmarks.Item(ref oBookMark).Range.Text = "Some Text Here";

答案 2 :(得分:1)

我所做的是将替换字符串分解为更小的片段,并在每个字符串的末尾添加占位符(除了最后一个字符串),然后将重复命令重复多次作为字符串片段。它也适用于较小的字符串,因此您不必使用其他方法:

string acierto; // where acierto is my placeholder
string[] cadenas;
cadenas = BSV.Funciones.ParteCadenas(valor, 170); // function to split a string into 170 character pieces

for (int xx = 0; xx < cadenas.Length; xx++)
{
    if (xx < cadenas.Length - 1) cadenas[xx] += acierto;
    parrafo.Range.Find.Execute(acierto, nulo, nulo, nulo, nulo, nulo, nulo, nulo, nulo, cadenas[xx], WdReplace.wdReplaceAll, nulo, nulo, nulo, nulo);
}

答案 3 :(得分:1)

这是您的问题的快速而简短的解决方案。如果range.Find.Execute方法的工作时间不超过255个字符,则只需手动扫描文档并搜索文本,而不是从文本字符串发出替换。

要使用以下代码,您必须包含以下内容:

Using Word = Microsoft.Office.Interop.Word;
Using System.Text.RegularExpressions;   //This is used for Regex

您需要添加Microsoft Word对象库。以下是从头到尾的代码。

string filePath = @"C:\YourfilePathHere";
string findText = "Your text to locate goes here";
string replaceText = "The replacement text longer than 255 characters";
Word.Application fileOpen = new Word.Application;
Word.Document doc = fileOpen.Documents.Open(filePath, ReadOnly: false);
foreach (Word.Paragraph para in doc.Paragraphs) {
   Word.Range paraRange = para.Range;
   string text = paraRange.Text;
   Regex regex = new Regex(findText);
   string final = regex.Replace(text, replaceText);
   paraRange.Text = final;
}

现在,上面的内容将替换为无限大小的文本。

答案 4 :(得分:0)

您的问题可能是搜索多行文字。

每次越过一行时尝试添加“\ r \ n”,也不能只创建这样的多行字符串,你需要在开头使用@:

@"firstLine\r\n
second";

除此之外,我在execute方法中没有看到任何多行选项。请注意,execute方法中的参数都有一个默认值,您可以使用命名参数并省略您不使用的参数。

另外请编辑你的问题多行确实导致问题。

编辑: 您应该在之后设置替换文本,而不是将替换文本作为参数。 http://social.msdn.microsoft.com/forums/en-US/vsto/thread/9c50450e-9579-4e89-8e9c-8c84c8319d0b

range.Execute(... arguments ...);
range.Text = "Replacement text more than 255 characters";

另一种选择是使用^ c作为替换文本,它将提示Word使用放在剪贴板上的任何文本作为替换文本。 http://word.tips.net/T000021_Replacing_Long_Blocks_of_Text.html

System.Windows.Forms.Clipboard.SetText("Replacement text longer than 255 chars");
range.Execute(... replacementText: "^c ...); // don't actually know where you enter your replacement text :P

答案 5 :(得分:0)

Word.Application.Selection.Find.Execute在替换文本中不支持超过255个字符。

因此,我们需要首先选择要替换的单词,而不是将所选文本替换为所需文本。

object missing = System.Reflection.Missing.Value;

  wordApp.Application.Selection.Find.Execute(findText, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing,
                                 missing, missing, missing);


            wordApp.Application.Selection.Text = (String)(replaceText);
            wordApp.Application.Selection.Collapse();