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>
评论