我使用Word文档作为模板,如下所示:
Hello my name is {MERGEFIELD Name /*MERGEFORMAT}
{IF {MERGEFIELD Gender /*MERGEFORMAT} = "M"
"Your gender is {MERGEFIELD Gender /*MERGEFORMAT}" ""}我的C#程序看起来像:
Microsoft.Office.Interop.Word.Document documentWord = application.Documents.Open(myWordTemplate);
//Gender and Name are dynamic fields for the example
var myDynamicFields = dbContext.MyFields.All();
foreach (Microsoft.Office.Interop.Word.Field field in documentWord.Fields)
{
foreach (var item in myDynamicFields)
{
//Search for a "Name" or "Gender" field
if (field.Code.Text.Contains(item.Key))
{
field.Select();
text = item.Value + " ";
application.Selection.TypeText(text);
break;
}
}
}因此,我的问题是,我的代码只检测2个Mergefield :名称MergeField和字段if。如果是的话,我想替换一下Mergefield的性别。我该怎么做?
发布于 2016-05-09 17:05:50
您的代码不能工作的原因是If字段的字段代码也包含合并字段。因此,Select正在摆脱If字段及其MergeField,因此在循环重复时没有需要查找的Mergefield。
最好是检查Field.Type属性。我还冒昧地优化了您的代码,这样您就不需要实际显示字段代码了。
使用Range对象,您可以将范围的TextRetrievalMode设置为包含字段代码,这样就不需要显示它们。我的代码示例将字段的范围设置为另一个Range对象,删除该字段,然后写入该范围。
(由于我无法访问您的数据库信息,下面的代码需要修改,但我相信这对您来说没有问题。我已经将您的代码放在注释中,以及您的评论中,这样您就可以自己定位了。)
Word.Range rngDocBody = doc.Content;
Word.Range rngField = null;
rngDocBody.TextRetrievalMode.IncludeFieldCodes = true;
foreach (Word.Field field in rngDocBody.Fields)
{
//Search for a "Name" or "Gender" field
if (field.Type == Word.WdFieldType.wdFieldMergeField)
{
rngField = field.Result;
//field.Select();
//doc.Application.Selection.TypeText("X");
field.Delete();
rngField.Text = "X";
// break;
}
}https://stackoverflow.com/questions/37109476
复制相似问题