C# - 替换 IfField 中的 mergefield
C# - Replace mergefield inside IfField
我使用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:Name MergeField 和 if 字段。如果是,我想替换字段中的 Mergefield Gender。我该怎么做?
您的代码不起作用的原因是 If
字段的字段代码也包含合并字段。因此 Select 和 TypeText 正在摆脱 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;
}
}
我使用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:Name MergeField 和 if 字段。如果是,我想替换字段中的 Mergefield Gender。我该怎么做?
您的代码不起作用的原因是 If
字段的字段代码也包含合并字段。因此 Select 和 TypeText 正在摆脱 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;
}
}