我有一个函数来查找和替换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。
答案 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();