问题背景
在 Dynamics 365 Customer Engagement 项目中,经常需要在开发、测试、生产等不同环境之间同步 Word Templates(文档模板)。
一个常见的问题是:同一实体在不同环境中的 ObjectTypeCode 可能不同。Word Template 内部通过 ObjectTypeCode 来关联实体,如果直接导出导入,模板会因找不到对应的实体而失效。
解决流程
步骤一:查询实体的 ObjectTypeCode
首先确认当前环境中目标实体的 ObjectTypeCode:
SELECT [ObjectTypeCode]
FROM Entity WITH(NOLOCK)
WHERE name = 'EntityName'将
EntityName替换为实际实体名称,如account、contact、new_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 | 查询 ObjectTypeCode | SQL / 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 联系我。