feat(export): 为Excel导出功能添加分组表头支持

- 修改exportVisibleColumnsToExcel函数,增加groupConfig参数
- 实现buildGroupHeaderHtml函数用于构建二级表头结构
- 当存在分组配置时自动生成合并单元格的表头
- 支持按字段分组显示标题并设置样式
- 更新函数注释文档说明新参数用途
This commit is contained in:
张名锐
2026-07-09 15:21:05 +08:00
parent 358993bedb
commit 5f27c85ae9
2 changed files with 29 additions and 4 deletions
@@ -730,7 +730,8 @@ function exportVisibleColumns() {
var dateStr = $("#DateValueDate").val() || '';
var tabName = page.tabIndex == 2 ? '框架合约' : '日终持仓';
var fileName = '日终持仓风险_互换_' + tabName + (dateStr ? '_' + dateStr : '');
main.exportVisibleColumnsToExcel(jgrid, fileName);
var groupConfig = page.tabIndex == 2 ? eodSwapGroupConfig : null;
main.exportVisibleColumnsToExcel(jgrid, fileName, groupConfig);
}
//---------------------------Formatter---------------------------------
+27 -3
View File
@@ -1209,8 +1209,9 @@ main.refreshCollapsibleGroupHeaders = function (jgrid) {
*
* @param {jQuery} jgrid jqGrid 容器
* @param {string} fileName 导出文件名(不含扩展名)
* @param {Array} groupConfig 可选,分组表头配置,每项 { title: string, columns: string[] }
*/
main.exportVisibleColumnsToExcel = function (jgrid, fileName) {
main.exportVisibleColumnsToExcel = function (jgrid, fileName, groupConfig) {
var colModel = jgrid.jqGrid('getGridParam', 'colModel');
// 只导出可见列(hidden !== true),与折叠状态联动:收起的列自动不可见
var visibleCols = colModel.filter(function (c) { return c.hidden !== true && c.name !== 'cb' && c.name !== 'rn'; });
@@ -1223,7 +1224,10 @@ main.exportVisibleColumnsToExcel = function (jgrid, fileName) {
var html = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40">';
html += '<head><meta charset="UTF-8"><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>Sheet1</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head>';
html += '<body><table border="1">';
//表头
//表头:有分组配置时导出两级表头(分类 + 字段),否则保持原单级表头。
if (groupConfig && groupConfig.length) {
html += buildGroupHeaderHtml(visibleCols, groupConfig);
}
html += '<tr>' + headerLabels.map(function (l) {
return '<th style="background:#f0f0f0;font-weight:bold;">' + escapeXml(l) + '</th>';
}).join('') + '</tr>';
@@ -1252,5 +1256,25 @@ main.exportVisibleColumnsToExcel = function (jgrid, fileName) {
function escapeXml(s) {
return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
}
function buildGroupHeaderHtml(cols, config) {
var titleByColumn = {};
config.forEach(function (group) {
(group.columns || []).forEach(function (name) {
titleByColumn[name] = group.title || '';
});
});
var cells = [];
for (var i = 0; i < cols.length; i++) {
var title = titleByColumn[cols[i].name] || '';
var colspan = 1;
while (i + colspan < cols.length && (titleByColumn[cols[i + colspan].name] || '') === title) {
colspan++;
}
cells.push('<th colspan="' + colspan + '" style="background:#d9edf7;font-weight:bold;text-align:center;">' + escapeXml(title) + '</th>');
i += colspan - 1;
}
return '<tr>' + cells.join('') + '</tr>';
}
};