所以,首先这是我打开 dotx 并创建一个新的 docx 副本(然后修改副本)的代码。为简洁起见,但本质上需要 3 个参数一个数据表(以使其可供遗留系统使用),UNC 路径作为模板的字符串和 UNC 路径作为输出文档的字符串:
using (WordprocessingDocument docGenerated = WordprocessingDocument.Open(outputPath, true))
{
docGenerated.ChangeDocumentType(WordprocessingDocumentType.Document);
foreach (SimpleField field in docGenerated.MainDocumentPart.Document.Descendants<SimpleField>())
{
string mergeFieldName = GetFieldName(field).Trim();
DataRow[] dr = dtSchema.Select("FieldName = '" + mergeFieldName + "'");
if (dr.Length > 0)
{
string runProperties = string.Empty;
foreach (RunProperties property in field.Descendants<RunProperties>())
{
runProperties = property.OuterXml;
break;
}
Run run = new Run();
run.Append(new RunProperties(runProperties));
run.Append(new Text(dr[0]["FieldDataValue"].ToString()));
field.Parent.ReplaceChild<SimpleField>(run, field);
}
}
docGenerated.MainDocumentPart.Document.Save();
}
我最初所做的是采用 .dot 模板并将其重新保存为 .dotx 并交叉手指,但没有用。因此,我尝试删除 .dotx 中的所有合并字段并再次添加它们。这有效 - 但它只会找到一个合并字段(作为 SimpleField),特别是在保存 .dotx 之前添加的最后一个。使用开放的 XML 生产力工具进一步查看模板,我可以看到所有其他合并字段的类型均为 w:instrText,这就是它们被忽略的原因。
我实际上只是从 OpenXML 开始,因为我们正在寻找用它来替换我们当前的办公自动化,所以我目前知之甚少。有人可以进一步指导我或指出一个好的资源吗?我用谷歌搜索了一下,但找不到我的具体问题。我试图推迟阅读整个 SDK 文档(我知道,我知道!),因为我需要快速组合解决方案,所以我专注于一项任务,即采用我们现有的 .dot 模板,将它们转换为.dotx,只需将合并字段替换为数据即可派生 .docx。
提前致谢!