标题说明了一切,但我会更详细地解释。事情就是这样。
我目前正在 Word VSTO 加载项中开发额外代码,该加载项在模板中使用合并字段。模板中的合并字段使用来自外部文件的数据填充。我需要的是从合并字段中读取值,但我完全不知道如何实现这一点。我已经搜索了几天,但我读过的文章都没有为我工作......
所以问题:
如何使用 VSTO 从 Word 中的特定合并字段中获取值?
标题说明了一切,但我会更详细地解释。事情就是这样。
我目前正在 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;
}
从上面返回的字段列表中获取 MergeField 名称GetFieldsUsedInDocument
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;
}