2

我有一个功能可以在 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]”,这可以找到,但是如何用“Something”替换“[placeholder]”

“Nullam non lorem sapien, et imperdiet sapien. Curabitur vestibulum justo eu enim bibendum vulputate. Integer vel velit non elit molestie auctor non ut nisi. Suspendisse potenti. Donec augue nulla, vestibulum a pulvinar id, scelerisque quis mauris. Integer eget ullamcorper velit。 Sed at purus sit amet felis pulvinar dictum at non neque. Praesent laoreet mauris id sem venenatis pellentesque。

例如

更新:

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

4

6 回答 6

2

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

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.";
于 2013-01-08T13:31:26.200 回答
2

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

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);
}
于 2015-11-09T12:45:42.580 回答
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;
}

现在上面将用无限大小的替换替换您的文本。

于 2017-07-05T15:57:59.040 回答
0

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

一个示例狙击手 -

object oBookMark = "MyBookmark";
oDoc.Bookmarks.Item(ref oBookMark).Range.Text = "Some Text Here";
于 2013-01-08T12:54:56.623 回答
0

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

每次越线时尝试添加“\r\n”,也不能只制作这样的多行字符串,您需要在开头使用@:

@"firstLine\r\n
second";

除此之外,我在执行方法中看不到任何多行选项。请注意,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
于 2013-01-08T13:02:38.807 回答
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();
于 2018-08-02T11:33:09.873 回答