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;
        }
}