<!DOCTYPE html>
<html>
<head>
<title>SheetJS JS-XLSX</title>
<meta charset="utf-8" />
</head>
<body>
<script type="text/javascript" src="./xlsx.full.min.js"></script>
<script type="text/javascript" src="./xlsxStyle.core.min.js"></script>
<script type="text/javascript" src="./xlsxStyle.utils.js"></script>
<script>
function saveAs(obj, fileName) {
var tmpA = document.createElement("a");
tmpA.download = fileName || "下载";
tmpA.href = URL.createObjectURL(obj);
tmpA.click();
setTimeout(function () {
URL.revokeObjectURL(obj);
}, 50);
};
const serveHead = [
{
'startTime': '报警开始时间'
},
{
'endTime': '报警结束时间'
},
{
'eventLevel': '报警等级'
},
{
'mmsi': 'MMSI'
},
{
'name': '船名'
},
{
'alarmTime': '报警时间'
},
{
'nearestCable': '海域'
},
{
'sog': '船速(节)'
},
{
'minDistance': '距离(米)'
},
{
'alarmDescription': '描述'
}
];
const serveData = [
{
"mmsi": 413770025,
"name": "WANXUANCHENGHUO0859",
"startTime": "2022-11-05 11:54:15",
"endTime": "2022-11-05 12:00:15",
"eventLevel": "预警",
"details": [
{
"startTime": "2022-11-05 11:54:15",
"endTime": "2022-11-05 12:00:15",
"eventLevel": "预警",
"eventType": null,
"mmsi": 413770025,
"name": "WANXUANCHENGHUO0859",
"nearestCable": null,
"alarmDescription": null,
"sog": null,
"cog": null,
"minDistance": null,
"lon": null,
"lat": null,
"alarmTime": "2022-11-05 11:54:15",
"beginTime": null,
"finishTime": null,
"reportTime": null,
"groupByStr": "413770025_2022-11-05 11:54:15_2022-11-05 12:00:15_预警_WANXUANCHENGHUO0859"
},
{
"startTime": "2022-11-05 11:54:15",
"endTime": "2022-11-05 12:00:15",
"eventLevel": "预警",
"eventType": null,
"mmsi": 413770025,
"name": "WANXUANCHENGHUO0859",
"nearestCable": null,
"alarmDescription": null,
"sog": null,
"cog": null,
"minDistance": null,
"lon": null,
"lat": null,
"alarmTime": "2022-11-05 12:00:15",
"beginTime": null,
"finishTime": null,
"reportTime": null,
"groupByStr": "413770025_2022-11-05 11:54:15_2022-11-05 12:00:15_预警_WANXUANCHENGHUO0859"
}
]
},
{
"mmsi": 413989743,
"name": "LUZAOZHUANGHUO2216",
"startTime": "2022-11-05 09:32:41",
"endTime": "2022-11-05 09:41:41",
"eventLevel": "预警",
"details": [
{
"startTime": "2022-11-05 09:32:41",
"endTime": "2022-11-05 09:41:41",
"eventLevel": "预警",
"eventType": null,
"mmsi": 413989743,
"name": "LUZAOZHUANGHUO2216",
"nearestCable": null,
"alarmDescription": null,
"sog": null,
"cog": null,
"minDistance": null,
"lon": null,
"lat": null,
"alarmTime": "2022-11-05 09:38:41",
"beginTime": null,
"finishTime": null,
"reportTime": null,
"groupByStr": "413989743_2022-11-05 09:32:41_2022-11-05 09:41:41_预警_LUZAOZHUANGHUO2216"
},
{
"startTime": "2022-11-05 09:32:41",
"endTime": "2022-11-05 09:41:41",
"eventLevel": "预警",
"eventType": null,
"mmsi": 413989743,
"name": "LUZAOZHUANGHUO2216",
"nearestCable": null,
"alarmDescription": null,
"sog": null,
"cog": null,
"minDistance": null,
"lon": null,
"lat": null,
"alarmTime": "2022-11-05 09:41:41",
"beginTime": null,
"finishTime": null,
"reportTime": null,
"groupByStr": "413989743_2022-11-05 09:32:41_2022-11-05 09:41:41_预警_LUZAOZHUANGHUO2216"
},
{
"startTime": "2022-11-05 09:32:41",
"endTime": "2022-11-05 09:41:41",
"eventLevel": "预警",
"eventType": null,
"mmsi": 413989743,
"name": "LUZAOZHUANGHUO2216",
"nearestCable": null,
"alarmDescription": null,
"sog": null,
"cog": null,
"minDistance": null,
"lon": null,
"lat": null,
"alarmTime": "2022-11-05 09:35:41",
"beginTime": null,
"finishTime": null,
"reportTime": null,
"groupByStr": "413989743_2022-11-05 09:32:41_2022-11-05 09:41:41_预警_LUZAOZHUANGHUO2216"
},
{
"startTime": "2022-11-05 09:32:41",
"endTime": "2022-11-05 09:41:41",
"eventLevel": "预警",
"eventType": null,
"mmsi": 413989743,
"name": "LUZAOZHUANGHUO2216",
"nearestCable": null,
"alarmDescription": null,
"sog": null,
"cog": null,
"minDistance": null,
"lon": null,
"lat": null,
"alarmTime": "2022-11-05 09:32:41",
"beginTime": null,
"finishTime": null,
"reportTime": null,
"groupByStr": "413989743_2022-11-05 09:32:41_2022-11-05 09:41:41_预警_LUZAOZHUANGHUO2216"
}
]
},
{
"mmsi": 413865686,
"name": "未知",
"startTime": "2022-11-05 11:09:46",
"endTime": "2022-11-05 11:09:46",
"eventLevel": "预警",
"details": [
{
"startTime": "2022-11-05 11:09:46",
"endTime": "2022-11-05 11:09:46",
"eventLevel": "预警",
"eventType": null,
"mmsi": 413865686,
"name": "未知",
"nearestCable": null,
"alarmDescription": null,
"sog": null,
"cog": null,
"minDistance": null,
"lon": null,
"lat": null,
"alarmTime": "2022-11-05 11:09:46",
"beginTime": null,
"finishTime": null,
"reportTime": null,
"groupByStr": "413865686_2022-11-05 11:09:46_2022-11-05 11:09:46_预警_未知"
},
{
"startTime": "2022-11-05 11:09:46",
"endTime": "2022-11-05 11:09:46",
"eventLevel": "预警",
"eventType": null,
"mmsi": 413865686,
"name": "未知",
"nearestCable": null,
"alarmDescription": null,
"sog": null,
"cog": null,
"minDistance": null,
"lon": null,
"lat": null,
"alarmTime": "2022-11-05 11:09:46",
"beginTime": null,
"finishTime": null,
"reportTime": null,
"groupByStr": "413865686_2022-11-05 11:09:46_2022-11-05 11:09:46_预警_未知"
}
]
},
{
"mmsi": 413996871,
"name": "未知",
"startTime": "2022-11-05 09:21:16",
"endTime": "2022-11-05 09:28:55",
"eventLevel": "预警",
"details": [
{
"startTime": "2022-11-05 09:21:16",
"endTime": "2022-11-05 09:28:55",
"eventLevel": "预警",
"eventType": null,
"mmsi": 413996871,
"name": "未知",
"nearestCable": null,
"alarmDescription": null,
"sog": null,
"cog": null,
"minDistance": null,
"lon": null,
"lat": null,
"alarmTime": "2022-11-05 09:24:05",
"beginTime": null,
"finishTime": null,
"reportTime": null,
"groupByStr": "413996871_2022-11-05 09:21:16_2022-11-05 09:28:55_预警_未知"
},
{
"startTime": "2022-11-05 09:21:16",
"endTime": "2022-11-05 09:28:55",
"eventLevel": "预警",
"eventType": null,
"mmsi": 413996871,
"name": "未知",
"nearestCable": null,
"alarmDescription": null,
"sog": null,
"cog": null,
"minDistance": null,
"lon": null,
"lat": null,
"alarmTime": "2022-11-05 09:28:55",
"beginTime": null,
"finishTime": null,
"reportTime": null,
"groupByStr": "413996871_2022-11-05 09:21:16_2022-11-05 09:28:55_预警_未知"
},
{
"startTime": "2022-11-05 09:21:16",
"endTime": "2022-11-05 09:28:55",
"eventLevel": "预警",
"eventType": null,
"mmsi": 413996871,
"name": "未知",
"nearestCable": null,
"alarmDescription": null,
"sog": null,
"cog": null,
"minDistance": null,
"lon": null,
"lat": null,
"alarmTime": "2022-11-05 09:27:19",
"beginTime": null,
"finishTime": null,
"reportTime": null,
"groupByStr": "413996871_2022-11-05 09:21:16_2022-11-05 09:28:55_预警_未知"
},
{
"startTime": "2022-11-05 09:21:16",
"endTime": "2022-11-05 09:28:55",
"eventLevel": "预警",
"eventType": null,
"mmsi": 413996871,
"name": "未知",
"nearestCable": null,
"alarmDescription": null,
"sog": null,
"cog": null,
"minDistance": null,
"lon": null,
"lat": null,
"alarmTime": "2022-11-05 09:25:17",
"beginTime": null,
"finishTime": null,
"reportTime": null,
"groupByStr": "413996871_2022-11-05 09:21:16_2022-11-05 09:28:55_预警_未知"
},
{
"startTime": "2022-11-05 09:21:16",
"endTime": "2022-11-05 09:28:55",
"eventLevel": "预警",
"eventType": null,
"mmsi": 413996871,
"name": "未知",
"nearestCable": null,
"alarmDescription": null,
"sog": null,
"cog": null,
"minDistance": null,
"lon": null,
"lat": null,
"alarmTime": "2022-11-05 09:26:17",
"beginTime": null,
"finishTime": null,
"reportTime": null,
"groupByStr": "413996871_2022-11-05 09:21:16_2022-11-05 09:28:55_预警_未知"
},
{
"startTime": "2022-11-05 09:21:16",
"endTime": "2022-11-05 09:28:55",
"eventLevel": "预警",
"eventType": null,
"mmsi": 413996871,
"name": "未知",
"nearestCable": null,
"alarmDescription": null,
"sog": null,
"cog": null,
"minDistance": null,
"lon": null,
"lat": null,
"alarmTime": "2022-11-05 09:26:47",
"beginTime": null,
"finishTime": null,
"reportTime": null,
"groupByStr": "413996871_2022-11-05 09:21:16_2022-11-05 09:28:55_预警_未知"
},
{
"startTime": "2022-11-05 09:21:16",
"endTime": "2022-11-05 09:28:55",
"eventLevel": "预警",
"eventType": null,
"mmsi": 413996871,
"name": "未知",
"nearestCable": null,
"alarmDescription": null,
"sog": null,
"cog": null,
"minDistance": null,
"lon": null,
"lat": null,
"alarmTime": "2022-11-05 09:24:45",
"beginTime": null,
"finishTime": null,
"reportTime": null,
"groupByStr": "413996871_2022-11-05 09:21:16_2022-11-05 09:28:55_预警_未知"
},
{
"startTime": "2022-11-05 09:21:16",
"endTime": "2022-11-05 09:28:55",
"eventLevel": "预警",
"eventType": null,
"mmsi": 413996871,
"name": "未知",
"nearestCable": null,
"alarmDescription": null,
"sog": null,
"cog": null,
"minDistance": null,
"lon": null,
"lat": null,
"alarmTime": "2022-11-05 09:21:16",
"beginTime": null,
"finishTime": null,
"reportTime": null,
"groupByStr": "413996871_2022-11-05 09:21:16_2022-11-05 09:28:55_预警_未知"
},
{
"startTime": "2022-11-05 09:21:16",
"endTime": "2022-11-05 09:28:55",
"eventLevel": "预警",
"eventType": null,
"mmsi": 413996871,
"name": "未知",
"nearestCable": null,
"alarmDescription": null,
"sog": null,
"cog": null,
"minDistance": null,
"lon": null,
"lat": null,
"alarmTime": "2022-11-05 09:25:47",
"beginTime": null,
"finishTime": null,
"reportTime": null,
"groupByStr": "413996871_2022-11-05 09:21:16_2022-11-05 09:28:55_预警_未知"
},
{
"startTime": "2022-11-05 09:21:16",
"endTime": "2022-11-05 09:28:55",
"eventLevel": "预警",
"eventType": null,
"mmsi": 413996871,
"name": "未知",
"nearestCable": null,
"alarmDescription": null,
"sog": null,
"cog": null,
"minDistance": null,
"lon": null,
"lat": null,
"alarmTime": "2022-11-05 09:23:28",
"beginTime": null,
"finishTime": null,
"reportTime": null,
"groupByStr": "413996871_2022-11-05 09:21:16_2022-11-05 09:28:55_预警_未知"
},
{
"startTime": "2022-11-05 09:21:16",
"endTime": "2022-11-05 09:28:55",
"eventLevel": "预警",
"eventType": null,
"mmsi": 413996871,
"name": "未知",
"nearestCable": null,
"alarmDescription": null,
"sog": null,
"cog": null,
"minDistance": null,
"lon": null,
"lat": null,
"alarmTime": "2022-11-05 09:28:24",
"beginTime": null,
"finishTime": null,
"reportTime": null,
"groupByStr": "413996871_2022-11-05 09:21:16_2022-11-05 09:28:55_预警_未知"
},
{
"startTime": "2022-11-05 09:21:16",
"endTime": "2022-11-05 09:28:55",
"eventLevel": "预警",
"eventType": null,
"mmsi": 413996871,
"name": "未知",
"nearestCable": null,
"alarmDescription": null,
"sog": null,
"cog": null,
"minDistance": null,
"lon": null,
"lat": null,
"alarmTime": "2022-11-05 09:21:46",
"beginTime": null,
"finishTime": null,
"reportTime": null,
"groupByStr": "413996871_2022-11-05 09:21:16_2022-11-05 09:28:55_预警_未知"
},
{
"startTime": "2022-11-05 09:21:16",
"endTime": "2022-11-05 09:28:55",
"eventLevel": "预警",
"eventType": null,
"mmsi": 413996871,
"name": "未知",
"nearestCable": null,
"alarmDescription": null,
"sog": null,
"cog": null,
"minDistance": null,
"lon": null,
"lat": null,
"alarmTime": "2022-11-05 09:22:53",
"beginTime": null,
"finishTime": null,
"reportTime": null,
"groupByStr": "413996871_2022-11-05 09:21:16_2022-11-05 09:28:55_预警_未知"
},
{
"startTime": "2022-11-05 09:21:16",
"endTime": "2022-11-05 09:28:55",
"eventLevel": "预警",
"eventType": null,
"mmsi": 413996871,
"name": "未知",
"nearestCable": null,
"alarmDescription": null,
"sog": null,
"cog": null,
"minDistance": null,
"lon": null,
"lat": null,
"alarmTime": "2022-11-05 09:27:52",
"beginTime": null,
"finishTime": null,
"reportTime": null,
"groupByStr": "413996871_2022-11-05 09:21:16_2022-11-05 09:28:55_预警_未知"
},
{
"startTime": "2022-11-05 09:21:16",
"endTime": "2022-11-05 09:28:55",
"eventLevel": "预警",
"eventType": null,
"mmsi": 413996871,
"name": "未知",
"nearestCable": null,
"alarmDescription": null,
"sog": null,
"cog": null,
"minDistance": null,
"lon": null,
"lat": null,
"alarmTime": "2022-11-05 09:22:18",
"beginTime": null,
"finishTime": null,
"reportTime": null,
"groupByStr": "413996871_2022-11-05 09:21:16_2022-11-05 09:28:55_预警_未知"
}
]
},
{
"mmsi": 413842719,
"name": "WANTIANYU1689",
"startTime": "2022-11-05 11:18:48",
"endTime": "2022-11-05 11:18:48",
"eventLevel": "预警",
"details": [
{
"startTime": "2022-11-05 11:18:48",
"endTime": "2022-11-05 11:18:48",
"eventLevel": "预警",
"eventType": null,
"mmsi": 413842719,
"name": "WANTIANYU1689",
"nearestCable": null,
"alarmDescription": null,
"sog": null,
"cog": null,
"minDistance": null,
"lon": null,
"lat": null,
"alarmTime": "2022-11-05 11:18:48",
"beginTime": null,
"finishTime": null,
"reportTime": null,
"groupByStr": "413842719_2022-11-05 11:18:48_2022-11-05 11:18:48_预警_WANTIANYU1689"
},
{
"startTime": "2022-11-05 11:18:48",
"endTime": "2022-11-05 11:18:48",
"eventLevel": "预警",
"eventType": null,
"mmsi": 413842719,
"name": "WANTIANYU1689",
"nearestCable": null,
"alarmDescription": null,
"sog": null,
"cog": null,
"minDistance": null,
"lon": null,
"lat": null,
"alarmTime": "2022-11-05 11:18:48",
"beginTime": null,
"finishTime": null,
"reportTime": null,
"groupByStr": "413842719_2022-11-05 11:18:48_2022-11-05 11:18:48_预警_WANTIANYU1689"
}
]
}
];
// 数据整理
let serveTransData = [];
let merges = []; //合并规律
let cow = 5; // 前五列合并
let startRow = 0;
let endRow = 0;
serveData.forEach(({ details = [] }) => {
const mapData = details.map(item => {
let tempData = {}
serveHead.forEach(v => {
const [code, name] = Object.entries(v)[0];
tempData[name] = item[code];
});
return tempData;
});
serveTransData.push(...mapData);
endRow += details.length;
for (let i = 0; i < cow; i++) {
merges.push({
// c => 列 r => 行
s: { c: i, r: startRow + 1 }, e: { c: i, r: endRow }
})
};
startRow = endRow;
});
function doit(type) {
var sheetName = 'Sheet1';
var wb = {
SheetNames: [sheetName],
Sheets: {},
Props: {}
};
var data = XLSX.utils.json_to_sheet(serveTransData);
wb.Sheets[sheetName] = data;
XSU.mergeCellsByObj(wb, sheetName, merges); // merges单元合并规则
XSU.setAlignmentHorizontalAll(wb, sheetName, 'center');//垂直居中
XSU.setAlignmentVerticalAll(wb, sheetName, 'center');//水平居中
XSU.setFontBoldOfRows(wb, sheetName, true, '1');//设置第二行标题行加粗
//列宽设置 1wch为1英文字符宽度
var width = new Array(serveHead.length).fill({ wch: 20 });
XSU.setColWidth(wb, sheetName, width);
//转换成二进制 使用xlsx-style(XS)进行转换才能得到带样式Excel
var wBout = xlsxStyle.write(wb, { bookType: 'xlsx', bookSST: false, type: 'binary' });
saveAs(new Blob([XSU.s2ab(wBout)]), "test.xlsx");
}
</script>
<input type="submit" value="Export!" onclick="doit();">
</body>
</html>
合并规则
data["!merges"] = [
// // c => 列
// // r => 行
// 纵向合并,范围是第1列的行1到行2
// { s: { c: 1, r: 1 }, e: { c: 1, r: 2 } }, // 纵向合并,范围是第2列的行1到行2
// { s: { c: 2, r: 1 }, e: { c: 2, r: 2 } }, // 纵向合并,范围是第3列的行1到行2
// { s: { c: 3, r: 1 }, e: { c: 3, r: 2 } }, // 纵向合并,范围是第4列的行1到行2
// { s: { c: 4, r: 1 }, e: { c: 4, r: 2 } }, // 纵向合并,范围是第5列的行1到行2
// // 第二组
// { s: { c: 0, r: 3 }, e: { c: 0, r: 4 } }, // 纵向合并,范围是第1列的行3到行4
// { s: { c: 1, r: 3 }, e: { c: 1, r: 4 } }, // 纵向合并,范围是第2列的行3到行4
// { s: { c: 2, r: 3 }, e: { c: 2, r: 4 } }, // 纵向合并,范围是第3列的行3到行4
// { s: { c: 3, r: 3 }, e: { c: 3, r: 4 } }, // 纵向合并,范围是第4列的行3到行4
// { s: { c: 4, r: 3 }, e: { c: 4, r: 4 } }, // 纵向合并,范围是第5列的行3到行4
// ];
文档地址: GitHub - Ctrl-Ling/XLSX-Style-Utils: 基于SheetJS以及XLSX-Style的纯前端带样式导出表格为Excel的工具包