从mergefield C#Word VSTO获取值

时间:2014-04-17 10:24:45

标签: c# ms-word vsto mergefield

标题说明了所有内容,但我会详细解释。事情就是这样。

我目前正在Word VSTO加载项中开发额外的代码,该加载项在模板中使用合并域。使用外部文件中的数据填充模板中的合并域。我需要的是从合并字段中读取值,但我完全不知道如何实现这一点。我现在已经搜索了几天,但我读过的文章都没有为我工作......

所以问题是:

如何使用VSTO从Word中的特定合并字段中获取值?

1 个答案:

答案 0 :(得分:1)

Mailmerge在VSTO中非常简单,这里有两条魔术线

//Pass in the path of external file    
document.MailMerge.OpenDataSource(Name: vm.FilePath.FullName);
document.MailMerge.Destination = WdMailMergeDestination.wdSendToNewDocument;

我找到了另一个完整示例here

此代码块检索文档中的所有字段

public static List<string> GetFieldsUsedInDocument(Document document)
        {
            var fields = new List<string>();

            foreach (MailMergeField fld in document.MailMerge.Fields)
            {
                if (fld.Code != null)
                {
                    fields.Add(fld.Code.Text.ToUpper());
                }
            }
            return fields;
        }

GetFieldsUsedInDocument

上方返回的字段列表中获取MergeField名称
 public static List<string> GetMergeFields(List<string> allFields)
        {
            var merges = new List<string>();

            foreach (var field in allFields)
            {
                var isNestedField = false;
                foreach (var fieldChar in field)
                {
                    int charCode = fieldChar;
                    if (charCode == 19 || charCode == 21)
                    {
                        isNestedField = true;
                        break;
                    }
                }
                if (!isNestedField)
                {
                    var fieldCode = field;
                    if (fieldCode.Contains("MERGEFIELD"))
                    {
                        var fieldName = fieldCode.Replace("MERGEFIELD", string.Empty).Replace('"', ' ').Trim();
                        var charsToGet = fieldName.IndexOf(" ");
                        if (charsToGet < 0)
                            charsToGet = fieldName.IndexOf(@"\");

                        charsToGet = charsToGet > 0 ? charsToGet : fieldName.Length;

                        fieldName = fieldName.Substring(0, charsToGet);

                        if (!merges.Contains(fieldName))
                        {
                            merges.Add(fieldName);
                        }
                    }
                }
            }
            return merges;
        }