1、首先在前台界面加入按钮和样式事件

<div class="pha-row" style="text-align:center;margin-top:15px;">
	<a href="#" id="btnPrint" class="hisui-linkbutton" data-options="iconCls:'icon-w-print'">导出</a>
</div>

前台效果展示

2、在前台界面需要引入相关前置js,保证后台js使用中不报错,extendscript必须要在export上面,不然加载顺序不一致导致报错。

	<script type="text/javascript" src="../scripts/pha/plugins/xlsx/xlsx.extendscript.js"></script>
	<script type="text/javascript" src="../scripts/pha/com/v1/js/export.js"></script>

3、在主js页面加载初始化方法,实现导出功能;

$(function() {	
	InitEvents();
});

// 初始化 - 事件绑定
function InitEvents(){
    $('#btnPrint').on("click", Print);
}

实现Print导出方法,用纯js方法

function Print() {
    PHA.Loading('Show'); 
    var reportObj = $('#report').keywords('getSelected');
    if (!reportObj || reportObj.length === 0) {
        PHA.Loading('Hide');
        alert('请选择报表类型后再导出');
        return;
    }

    var selectedItem = reportObj[0];
    var queryId = selectedItem.id;
    var queryName = queryId.replace(/_/g, ''); // 移除下划线
    var reportText = selectedItem.text; 
    var startDate = $('#startDate').datebox('getValue');
    var endDate = $('#endDate').datebox('getValue');
    if (!startDate || !endDate) {
        PHA.Loading('Hide');
        alert('请选择开始日期和结束日期');
        return;
    }
    var queryParams = {
        QUERY: queryName, 
        startDate: startDate,
        endDate: endDate
    };
    var baseUrl = 'NTSC/NTSCAntiAgentStat/NTSCAntiAgentAction.csp';
    const urlWithParams = new URL(baseUrl, window.location.href); 
    Object.keys(queryParams).forEach(key => {
        urlWithParams.searchParams.append(key, queryParams[key]);
    });

    // 发起请求
    fetch(urlWithParams.toString(), {
        method: 'GET',
        headers: { 'Accept': 'application/json' }
    })
    .then(response => {
        if (!response.ok) throw new Error(`请求失败: ${response.statusText}`);
        return response.json();
    })
    .then(data => {
        PHA.Loading('Hide');
        // 验证数据格式
        if (!data || !data.cols || !data.rows) {
            alert('导出数据格式错误,请联系管理员');
            return;
        }
        var titleObj = {};
        data.cols.forEach(col => {
            if (col.ifExport === false) return;
            var field = col.descField || col.field;
            titleObj[field] = col.title;
        });
        var datePrefix = new Date().toISOString().split('T')[0];
        var fileName = `${reportText}_${datePrefix}_${Date.now()}.xlsx`;
        if (window.PHA_EXPORT?.XLSX) {
            PHA_EXPORT.XLSX(titleObj, data.rows, fileName);
        } else {
            alert('导出组件未加载,请检查依赖');
        }
	    })
	    .catch(error => {
	        PHA.Loading('Hide');
	        console.error('导出失败:', error);
	        alert(`导出失败: ${error.message}`);
	    });
}


window.PHA_EXPORT = window.PHA_EXPORT || {};
PHA_EXPORT.XLSX = function(titleObj, rowsData, fileName, colsFormatter) {
    const cols = Object.keys(titleObj).map(field => ({
        field: field,
        title: titleObj[field]
    }));
    const ws = XLSX.utils.json_to_sheet(rowsData, {
        header: Object.keys(titleObj), // 表头字段名
        skipHeader: false // 生成 Excel 表头行
    });
    const range = XLSX.utils.decode_range(ws['!ref']); 
    for (let colIdx = 0; colIdx <= range.e.c; colIdx++) {
        const cellAddr = XLSX.utils.encode_cell({ r: 0, c: colIdx });
        ws[cellAddr].s = { 
            font: { 
                name: '微软雅黑', 
                bold: true
            } 
        };
    }
    const wb = XLSX.utils.book_new();
    XLSX.utils.book_append_sheet(wb, ws, "Sheet1");
    XLSX.writeFile(wb, fileName);
};

其中 baseUrl 地址指向 csp 页面中的 action,触发后台数据请求。并且动态获取前台传过来的参数

<csp:method name=OnPreHTTP arguments="" returntype=%Boolean>
  i ##Class(websys.SessionEvents).SessionExpired() q 1
  q 1
</csp:method>
<script language="cache" runat="server">
 s action = $Get(%request.Data("action",1))
 s QUERY = $Get(%request.Data("QUERY",1))
 
 i QUERY="NTSCMJZCFJL" d
 .s startdate=$Get(%request.Data("startDate",1))
 .s enddate=$Get(%request.Data("endDate",1))
 .w ##class(NTSC.ExterIntface.AntiAgentStat.NTSCAntiAgentStat).NTSCMJZCFJL(startdate,enddate)
</script>