替换 Word 文档中的文本
Replace Text in Word Document
我正在使用 NetOffice 库编辑 Word 文档。在我的文档中,我有一个字段 "{NAME}"
,我想将其替换为值 "John Smith"
。但是,执行以下代码不起作用。 Find.Execute
returns false,表示失败,document.Content.Text
没有体现变化。
// Open the template
Application word = new Application();
Document document = word.Documents.Open(fileName, false, true);
// Set up initial behavior in word
word.Visible = false;
// Replace template with final values
foreach (LetterField field in fields)
{
document.Content.Find.ClearFormatting();
document.Content.Find.Text = "{" + field.Key + "}";
document.Content.Find.Replacement.ClearFormatting();
document.Content.Find.Replacement.Text = field.Value;
document.Content.Find.Execute(null, null, null, null, null, null, null, null, null, null, WdReplace.wdReplaceAll);
}
我也尝试手动替换 document.Content.Text
,但这会从页面中删除所有格式,这也是不可取的。如何在 NetOffice 中替换文档中的文本?
我注意到设置 document.Content.Find.Text
似乎没有任何作用,因为检查该值仍然会产生 ""
,即使在将其设置为其他值之后也是如此。这是预期的行为,还是我遗漏了什么?
文档包含以下内容(复制粘贴):
Date: {DATE}
{NAME}
{ADDRESSLINE}
{ADDRESSCITY}, {ADDRESSSTATE} {ADDRESSCODE}
部分字段如下:
<"NAME", "John Smith">
<"DATE", "10/28/2021">
您在此处尝试执行的操作看起来可以通过使用 word 内置的邮件合并功能来实现。该功能旨在接收联系人信息列表并替换占位符文本以生成发送给列表中每个人的文档。
Microsoft 有一些关于如何实现这一点的很好的文档,我建议您查看 https://support.microsoft.com/en-us/office/use-mail-merge-for-bulk-email-letters-labels-and-envelopes-f488ed5b-b849-4c11-9cff-932c49474705
我从您的示例开始,但是尝试了 Execute 方法的变体,它对我来说效果很好。
const string TemplateFileName = @"D:\Dev\SO\MyWordDoc.docx";
const string ResultFileName = @"D:\Dev\SO\MyWordDoc_new.docx";
var wordApp = new Application();
var doc = wordApp.Documents.Open(TemplateFileName, false, true);
var status = doc.Content.Find.Execute(findText: "{NAME}",
matchCase: false,
matchWholeWord: false,
matchWildcards: false,
matchSoundsLike: false,
matchAllWordForms: false,
forward: true, //this may be the one
wrap: false,
format: false,
replaceWith: "My Name Value",
replace: WdReplace.wdReplaceAll
);
doc.SaveAs(ResultFileName);
doc.Close();
我使用的语法来自:
https://docs.microsoft.com/en-us/office/vba/api/Word.Find.Execute
对于不同的参数。
可能需要Execute
带forward
个参数为"True"
,即第7个参数
结果文档:
我正在使用 NetOffice 库编辑 Word 文档。在我的文档中,我有一个字段 "{NAME}"
,我想将其替换为值 "John Smith"
。但是,执行以下代码不起作用。 Find.Execute
returns false,表示失败,document.Content.Text
没有体现变化。
// Open the template
Application word = new Application();
Document document = word.Documents.Open(fileName, false, true);
// Set up initial behavior in word
word.Visible = false;
// Replace template with final values
foreach (LetterField field in fields)
{
document.Content.Find.ClearFormatting();
document.Content.Find.Text = "{" + field.Key + "}";
document.Content.Find.Replacement.ClearFormatting();
document.Content.Find.Replacement.Text = field.Value;
document.Content.Find.Execute(null, null, null, null, null, null, null, null, null, null, WdReplace.wdReplaceAll);
}
我也尝试手动替换 document.Content.Text
,但这会从页面中删除所有格式,这也是不可取的。如何在 NetOffice 中替换文档中的文本?
我注意到设置 document.Content.Find.Text
似乎没有任何作用,因为检查该值仍然会产生 ""
,即使在将其设置为其他值之后也是如此。这是预期的行为,还是我遗漏了什么?
文档包含以下内容(复制粘贴):
Date: {DATE}
{NAME}
{ADDRESSLINE}
{ADDRESSCITY}, {ADDRESSSTATE} {ADDRESSCODE}
部分字段如下:
<"NAME", "John Smith">
<"DATE", "10/28/2021">
您在此处尝试执行的操作看起来可以通过使用 word 内置的邮件合并功能来实现。该功能旨在接收联系人信息列表并替换占位符文本以生成发送给列表中每个人的文档。
Microsoft 有一些关于如何实现这一点的很好的文档,我建议您查看 https://support.microsoft.com/en-us/office/use-mail-merge-for-bulk-email-letters-labels-and-envelopes-f488ed5b-b849-4c11-9cff-932c49474705
我从您的示例开始,但是尝试了 Execute 方法的变体,它对我来说效果很好。
const string TemplateFileName = @"D:\Dev\SO\MyWordDoc.docx";
const string ResultFileName = @"D:\Dev\SO\MyWordDoc_new.docx";
var wordApp = new Application();
var doc = wordApp.Documents.Open(TemplateFileName, false, true);
var status = doc.Content.Find.Execute(findText: "{NAME}",
matchCase: false,
matchWholeWord: false,
matchWildcards: false,
matchSoundsLike: false,
matchAllWordForms: false,
forward: true, //this may be the one
wrap: false,
format: false,
replaceWith: "My Name Value",
replace: WdReplace.wdReplaceAll
);
doc.SaveAs(ResultFileName);
doc.Close();
我使用的语法来自: https://docs.microsoft.com/en-us/office/vba/api/Word.Find.Execute
对于不同的参数。
可能需要Execute
带forward
个参数为"True"
,即第7个参数
结果文档: