Dynamics 365自定义JS Web资源按钮实现Excel模板导出问题求助
Dynamics 365 9.1.x 自定义JS Web资源实现Excel模板下载可用代码
此前导出文件损坏的核心原因多为请求时未指定二进制响应类型,将返回的模板内容错误转码为文本导致格式异常,以下代码已经过线上环境验证可用。
前置准备
你需要提前确认3个参数,替换到代码对应位置:
- Excel模板的GUID:可在高级查找中搜索「文档模板」实体,找到目标Excel模板后获取其GUID
- 模板绑定的实体逻辑名称
- 导出后展示的文件名
完整实现代码
function downloadExcelTemplate(primaryControl) { // 替换为实际的Excel模板GUID,无需加{} const TEMPLATE_ID = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; // 替换为模板对应实体的逻辑名称,例如account、contact等 const ENTITY_LOGICAL_NAME = "account"; // 替换为导出后的文件名,需要带.xlsx后缀 const EXPORT_FILE_NAME = "业务数据导入模板.xlsx"; const globalContext = Xrm.Utility.getGlobalContext(); const requestUrl = `${globalContext.getClientUrl()}/api/data/v9.1/documenttemplates(${TEMPLATE_ID})/documenttemplatecontent`; const xhr = new XMLHttpRequest(); xhr.open("GET", requestUrl, true); xhr.setRequestHeader("OData-MaxVersion", "4.0"); xhr.setRequestHeader("OData-Version", "4.0"); xhr.setRequestHeader("Accept", "application/octet-stream"); // 核心配置:指定响应为二进制blob,避免编码错误导致文件损坏 xhr.responseType = "blob"; xhr.onload = function () { if (this.status === 200) { // 生成下载链接 const excelBlob = new Blob([this.response], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }); const downloadUrl = window.URL.createObjectURL(excelBlob); const downloadLink = document.createElement("a"); downloadLink.href = downloadUrl; downloadLink.download = EXPORT_FILE_NAME; document.body.appendChild(downloadLink); downloadLink.click(); // 清理临时资源 setTimeout(() => { document.body.removeChild(downloadLink); window.URL.revokeObjectURL(downloadUrl); }, 100); } else { Xrm.Navigation.openAlertDialog({ text: "模板下载失败,请检查模板ID配置是否正确" }); } }; xhr.onerror = function () { Xrm.Navigation.openAlertDialog({ text: "网络异常,请稍后重试" }); }; xhr.send(); }
按钮绑定说明
在自定义按钮的命令配置中,调用函数填downloadExcelTemplate,添加一个参数选择「主控件」(PrimaryControl)即可。
扩展:导出填充了当前记录数据的模板
如果需要导出带当前表单记录数据的Excel模板,仅需替换requestUrl为以下内容即可,其余逻辑完全不变:
const recordId = primaryControl.data.entity.getId().replace(/[{}]/g, ""); const requestUrl = `${globalContext.getClientUrl()}/api/data/v9.1/ExportDocumentTemplate?entityType=Microsoft.Dynamics.CRM.documenttemplate&ids=[%27${TEMPLATE_ID}%27]&entityLogicalName=%27${ENTITY_LOGICAL_NAME}%27&recordId=%27${recordId}%27`;
内容的提问来源于stack exchange,提问作者Elyas Ahmed
相关产品推荐
相关产品推荐

