You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 07:45:04