从合并字段C#字VSTO获取值

从合并字段C#字VSTO获取值,c#,ms-word,vsto,mergefield,C#,Ms Word,Vsto,Mergefield,标题说明了一切,但我会详细解释。事情是这样的 我目前正在开发Word VSTO插件中的额外代码,该插件在模板中使用合并字段。模板中的合并字段使用外部文件中的数据填充。我需要的是从合并字段中读取值,但我完全不知道如何实现这一点。我已经搜索了几天了,但是我读的文章没有一篇对我有用 因此,问题是: 如何使用VSTO从Word中的特定合并字段中获取值?Mailmerge在VSTO中非常简单,下面是两条神奇的线 //Pass in the path of external file documen

标题说明了一切,但我会详细解释。事情是这样的

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

因此,问题是:


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

Mailmerge在VSTO中非常简单,下面是两条神奇的线

//Pass in the path of external file    
document.MailMerge.OpenDataSource(Name: vm.FilePath.FullName);
document.MailMerge.Destination = WdMailMergeDestination.wdSendToNewDocument;
我找到了另一个完整的例子

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

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

这仍然不能回答我的问题。。。我需要从合并字段中检索一个值,我不需要实际将字段与数据源合并。您是否也可以发布如何填写“ListallFields”?谢谢!我在提取合并字段时遇到问题,因为我只是将它们分配给
var
。我需要做的是使用正确的类型!
 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;
        }