如何在C#中调用Dynamics 365 Word模板生成文档?需CRM服务还是第三方库?
在C#中调用Dynamics 365 Word模板生成功能的实现方向
你完全不需要依赖第三方库,也不用走MS CRM的服务请求流程——Dynamics 365本身就提供了原生的API支持在C#代码里调用Word模板生成功能,下面给你具体的方向指导:
核心前置准备
- 先确认你的Word模板已经在Dynamics 365中配置完成,并且正确关联了
Invoice实体,模板状态设置为可用(界面上能手动生成文档才算正常)。 - 准备好目标
Invoice记录的ID、对应的DocumentTemplate记录的ID,以及Dynamics 365的连接信息(连接字符串或Web API端点)。
两种主流实现方式
1. 使用Organization Service(适合.NET Framework项目)
这是传统.NET框架项目常用的方式,依赖Dynamics 365的SDK包:
- 先通过NuGet安装
Microsoft.Crm.Sdk.Proxy和Microsoft.Xrm.Sdk两个包。 - 核心是调用
GenerateWordDocumentRequest这个内置消息请求,示例代码如下:
using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Client; using Microsoft.Xrm.Sdk.Messages; using System.IO; // 初始化服务连接 var service = new CrmServiceClient("你的Dynamics 365连接字符串"); if (service.IsReady) { // 构造生成请求 var generateRequest = new GenerateWordDocumentRequest { EntityId = new Guid("目标Invoice记录的GUID"), EntityName = "invoice", // Invoice实体的逻辑名称 TemplateId = new Guid("对应的DocumentTemplate记录的GUID") }; // 执行请求并获取结果 var response = (GenerateWordDocumentResponse)service.Execute(generateRequest); // 将返回的字节数组保存为Word文件 File.WriteAllBytes(@"C:\生成的发票文档.docx", response.DocumentBody); }
2. 使用Web API(适合.NET Core/.NET 5+或跨平台场景)
如果你的项目是基于.NET Core或需要跨平台,用Web API更灵活:
- 用
HttpClient发送POST请求到Dynamics 365的Web API端点:[你的组织URI]/api/data/v9.2/generateworddocument - 请求体需要包含三个关键参数,示例代码如下:
using System.Net.Http; using System.Net.Http.Headers; using System.Text; using System.Text.Json; var httpClient = new HttpClient(); httpClient.BaseAddress = new Uri("你的Dynamics 365组织URI"); // 设置身份验证(比如OAuth,具体根据你的认证方式调整) httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "你的访问令牌"); // 构造请求参数 var requestBody = new { EntityId = "目标Invoice记录的GUID字符串", EntityName = "invoice", TemplateId = "对应的DocumentTemplate记录的GUID字符串" }; var jsonContent = new StringContent(JsonSerializer.Serialize(requestBody), Encoding.UTF8, "application/json"); var response = await httpClient.PostAsync("api/data/v9.2/generateworddocument", jsonContent); if (response.IsSuccessStatusCode) { // 获取生成的文档字节流并保存 var documentBytes = await response.Content.ReadAsByteArrayAsync(); await File.WriteAllBytesAsync(@"C:\生成的发票文档.docx", documentBytes); }
关键权限注意事项
- 确保你的应用使用的服务账号(或用户账号)拥有这些权限:
- 对
Invoice实体的读取权限 - 对
DocumentTemplate实体的读取权限 - 安全角色中启用“生成Word文档”的权限
- 对
如果遇到生成失败的情况,建议先在Dynamics 365界面手动测试生成该模板的文档,确认模板本身没有问题,再排查代码中的参数、连接或权限问题。
内容的提问来源于stack exchange,提问作者Muhammad Naderi
相关产品推荐
相关产品推荐

