Dynamics 365 Word Templates 跨环境同步指南

问题背景

在 Dynamics 365 Customer Engagement 项目中,经常需要在开发、测试、生产等不同环境之间同步 Word Templates(文档模板)。

一个常见的问题是:同一实体在不同环境中的 ObjectTypeCode 可能不同。Word Template 内部通过 ObjectTypeCode 来关联实体,如果直接导出导入,模板会因找不到对应的实体而失效。

解决流程

步骤一:查询实体的 ObjectTypeCode

首先确认当前环境中目标实体的 ObjectTypeCode:

SELECT [ObjectTypeCode]
FROM Entity WITH(NOLOCK)
WHERE name = 'EntityName'

EntityName 替换为实际实体名称,如 accountcontactnew_customentity 等。

分别在不同环境中执行此查询,记录各自的 ObjectTypeCode 值。

步骤二:导出 Word 模板

在源环境中,通过 设置 → 模板 → 文档模板 下载需要迁移的 Word Template(.docx 文件)。

步骤三:修改 .docx 文件

.docx 文件本质上是一个 ZIP 压缩包,内部包含多个 XML 文件。我们需要解压并修改其中的 ObjectTypeCode 引用。

# 解压 docx 文件
unzip template.docx -d template_extracted/

# 在 XML 文件中查找并替换 ObjectTypeCode
# 将源环境的 ObjectTypeCode 替换为目标环境的值
grep -r "ObjectTypeCode" template_extracted/

关键文件通常包括:

  • word/document.xml — 主文档内容
  • word/settings.xml — 文档设置

使用文本编辑器打开这些 XML 文件,找到所有引用了源环境 ObjectTypeCode 的地方,替换为目标环境的值。

<!-- 示例:将 10285 替换为目标环境的 ObjectTypeCode -->
<ObjectTypeCode>10285</ObjectTypeCode>

步骤四:处理 customXml 引用

如果 Word Template 引用了 XML 数据源,还需要修改 customXml 文件夹中的两个文件:

  • customXml/item1.xml — 自定义 XML 数据
  • customXml/itemProps1.xml — XML 属性定义
# 查找 customXml 中的 ObjectTypeCode 引用
grep -r "ObjectTypeCode" template_extracted/customXml/

同样将 ObjectTypeCode 替换为目标环境的值。

步骤五:重新打包并导入

# 重新打包为 docx
cd template_extracted/
zip -r ../template_modified.docx *

# 或使用 PowerShell
Compress-Archive -Path template_extracted\* -DestinationPath template_modified.docx

将修改后的 .docx 文件上传到目标环境的对应实体即可。

完整流程速查

步骤操作工具
1查询 ObjectTypeCodeSQL / FetchXML
2导出 Word 模板D365 设置面板
3解压 .docx → 修改 XML解压工具 + 文本编辑器
4修改 customXml(如有)文本编辑器
5重新打包 → 导入zip 命令 / PowerShell

注意事项

  • 修改前务必备份原始 .docx 文件
  • ObjectTypeCode 可能在多处出现,建议用搜索功能全部替换
  • 如果模板中使用了复杂的数据绑定,变更后务必在目标环境测试
  • XML 文件编码建议使用 UTF-8 without BOM

总结

Word Template 跨环境同步的核心问题在于 ObjectTypeCode 的不一致。通过直接修改 .docx 内部的 XML 文件,可以在几分钟内完成模板迁移,避免重新创建模板的繁琐工作。

💬 评论区

🍌 评论系统正在配置中(Giscus)。如需交流,欢迎通过 邮件GitHub 联系我。