C# 字互操作查找并替换所有内容
本文关键字:替换 互操作 查找 | 更新日期: 2023-09-27 18:34:37
我有一些代码来替换Word 2010 docx中的文本。
object fileName = Path.Combine(System.Windows.Forms.Application.StartupPath, "document.docx");
Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application { Visible = true };
Microsoft.Office.Interop.Word.Document aDoc = wordApp.Documents.Open(ref fileName, ReadOnly: false, Visible: true);
aDoc.Activate();
Microsoft.Office.Interop.Word.Find fnd = wordApp.ActiveWindow.Selection.Find;
fnd.ClearFormatting();
fnd.Replacement.ClearFormatting();
fnd.Forward = true;
fnd.Wrap = Microsoft.Office.Interop.Word.WdFindWrap.wdFindContinue;
fnd.Text = "{id}";
fnd.Replacement.Text = "123456";
fnd.Execute(Replace: WdReplace.wdReplaceAll);
这无需格式化即可工作。但是当 {id} 格式化时,它不会替换文本。
如何使此代码忽略格式?
我使用这个函数来查找和替换。 您可以指定任何选项。
private void FindAndReplace(Microsoft.Office.Interop.Word.Application doc, object findText, object replaceWithText)
{
//options
object matchCase = false;
object matchWholeWord = true;
object matchWildCards = false;
object matchSoundsLike = false;
object matchAllWordForms = false;
object forward = true;
object format = false;
object matchKashida = false;
object matchDiacritics = false;
object matchAlefHamza = false;
object matchControl = false;
object read_only = false;
object visible = true;
object replace = 2;
object wrap = 1;
//execute find and replace
doc.Selection.Find.Execute(ref findText, ref matchCase, ref matchWholeWord,
ref matchWildCards, ref matchSoundsLike, ref matchAllWordForms, ref forward, ref wrap, ref format, ref replaceWithText, ref replace,
ref matchKashida ,ref matchDiacritics, ref matchAlefHamza, ref matchControl);
}
用法将是:
object fileName = Path.Combine(System.Windows.Forms.Application.StartupPath, "document.docx");
Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application { Visible = true };
Microsoft.Office.Interop.Word.Document aDoc = wordApp.Documents.Open(fileName, ReadOnly: false, Visible: true);
aDoc.Activate();
FindAndReplace(wordApp, "{id}", "12345");
你可以一遍又一遍地使用FindAndReplace 功能。
希望这有帮助。
从Visual Studio 2013中,您可以执行以下操作:
Microsoft.Office.Interop.Word.Range range = this.Application.ActiveDocument.Content;
range.Find.ClearFormatting();
range.Find.Execute(FindText: "find text", ReplaceWith: "replace text", Replace: Word.WdReplace.wdReplaceAll);
(发布是为了像我这样的任何人的利益,他们遇到了这个问题,但不一定使用与OP相同版本的工具。
一种在字符串包含超过 255 个字符时除以字符串的方法。
void FindAndReplace(Microsoft.Office.Interop.Word.Application doc, string findText, string replaceWithText)
{
if (replaceWithText.Length > 255)
{
FindAndReplace(doc, findText, findText + replaceWithText.Substring(255));
replaceWithText = replaceWithText.Substring(0, 255);
}
//options
object matchCase = false;
object matchWholeWord = true;
object matchWildCards = false;
object matchSoundsLike = false;
object matchAllWordForms = false;
object forward = true;
object format = false;
object matchKashida = false;
object matchDiacritics = false;
object matchAlefHamza = false;
object matchControl = false;
object read_only = false;
object visible = true;
object replace = 2;
object wrap = 1;
//execute find and replace
doc.Selection.Find.Execute(findText, ref matchCase, ref matchWholeWord,
ref matchWildCards, ref matchSoundsLike, ref matchAllWordForms, ref forward, ref wrap, ref format, replaceWithText, ref replace,
ref matchKashida, ref matchDiacritics, ref matchAlefHamza, ref matchControl);
}
如果有人在 2021 年寻找答案并使用 VS2019,您可以休耕此方法,包括替换文本框等形状中的文本。
private void FindAndReplace(Application app,Document doc, string findText, string replaceWithText)
{
Find findObject = app.Selection.Find;
findObject.ClearFormatting();
findObject.Text = findText;
findObject.Replacement.ClearFormatting();
findObject.Replacement.Text = replaceWithText;
object missing = System.Reflection.Missing.Value;
object replaceAll = WdReplace.wdReplaceAll;
findObject.Execute(ref missing, ref missing, ref missing, ref missing, ref missing,ref missing, ref missing, ref missing, ref missing, ref missing, ref replaceAll, ref missing, ref missing, ref missing, ref missing);
var shapes = doc.Shapes;
foreach (Shape shape in shapes)
{
if (shape.TextFrame.HasText != 0)
{
var initialText = shape.TextFrame.TextRange.Text;
var resultingText = initialText.Replace(findText, replaceWithText);
if (initialText != resultingText)
{
shape.TextFrame.TextRange.Text = resultingText;
}
}
}
}
你可以试试这个:
var doc = new Microsoft.Office.Interop.Word.Application().Documents.Open("document.docx");
doc.Content.Find.Execute( "{id}", false, true, false, false, false, true, 1, false, "12345", 2,
false, false, false, false);
doc.Save();