Files
TLE2ToCZML/xlsx.js
2024-02-22 11:07:01 +08:00

178 lines
6.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const fs = require('fs')
const xlsx = require("node-xlsx")
/**
* 缺位补0
*/
const padding2 = (part) => {
if (part.length === 1) {
return "0" + part
} else {
return part;
}
}
/**
* 日期格式转换
*
* @param {date|number} date 日期
* @param {string} fmt 要转换为的格式,默认 yyy-MM-dd HH:mm:ss
*/
const formatDate = (date, fmt) => {
date = date == undefined ? new Date() : date;
date = typeof date == 'number' ? new Date(date) : date;
fmt = fmt || 'yyyy-MM-dd HH:mm:ss';
let obj =
{
'y': date.getFullYear(), // 年份,注意必须用getFullYear
'M': date.getMonth() + 1, // 月份,注意是从0-11
'd': date.getDate(), // 日期
'q': Math.floor((date.getMonth() + 3) / 3), // 季度
'w': date.getDay(), // 星期,注意是0-6
'H': date.getHours(), // 24小时制
'h': date.getHours() % 12 == 0 ? 12 : date.getHours() % 12, // 12小时制
'm': date.getMinutes(), // 分钟
's': date.getSeconds(), // 秒
'S': date.getMilliseconds() // 毫秒
};
let week = ['天', '一', '二', '三', '四', '五', '六'];
for (let i in obj) {
fmt = fmt.replace(new RegExp(i + '+', 'g'), function (m) {
let val = obj[i] + '';
if (i == 'w') return (m.length > 2 ? '星期' : '周') + week[val];
for (let j = 0, len = val.length; j < m.length - len; j++) val = '0' + val;
return m.length == 1 ? val : val.substring(val.length - m.length);
});
}
return fmt;
}
/**
* 解析Excel表达的日期数字,并转换为指定格式的日期字符串
*
* @param {number} numb Excel解析出的数字形式的日期
* @param {string} format 要转换为的格式,默认 yyy-MM-dd HH:mm:ss
*/
const formatExcelDate = (numb, format) => {
const time = new Date((numb - 2) * 24 * 3600000 + 1);
time.setYear(time.getFullYear() - 70);
time.setHours(time.getHours() - 8);
return formatDate(time, format);
}
const handleDate = (date, fmt) => {
if (!date) {
return date;
}
date = date.trim ? date.trim() : date;
if (/^[\d.]+$/.test(date)) {
let dateNum = parseFloat(date);
// 大于 1000 万说明是一个毫秒数,直接解析并转换为指定格式即可
if (dateNum > 10000000) {
return formatDate(dateNum, fmt);
}
// 否则认为这个是一个 Excel 格式的日期
date = formatExcelDate(dateNum, fmt);
console.log(date, typeof (date), dateNum)
} else {
// 处理中文冒号,和 yyyy/MM/dd 格式的问题
date = date.replace(/:/g, ":").replace(/\//g, "-");
}
// 将不规则的格式,例如 "2020-1-1 1:3:3" 转换成 yyyy-MM-dd HH:mm:ss
// 再转为 Date 对象进行指定的格式化
console.log(date);
let dtPars = date.split(/\s+/g)
let dPars = dtPars[0].split("-");
dPars[1] = padding2(dPars[1])
dPars[2] = padding2(dPars[2])
dtPars[0] = dPars.join("-");
if (!dtPars[1]) {
dtPars[1] = '00:00:00';
} else {
let tPars = dtPars[1].split(':');
tPars[0] = padding2(tPars[0]);
// 支持分缺失
tPars[1] = padding2(tPars[1] || '00');
// 支持秒缺失
tPars[2] = padding2(tPars[2] || '00');
dtPars[1] = tPars.join(':');
}
return formatDate(new Date(dtPars.join(" ")), fmt);
}
const loadData = ()=>{
// 以 buffer 形式导入
const workSheetsFromBuffer = xlsx.parse(fs.readFileSync(`./public/excel/卫星数据匹配.xlsx`))
// console.log(JSON.stringify(workSheetsFromBuffer, null, 2))
// 以文件形式导入
// const workSheetsFromFile = xlsx.parse(`./public/excel/卫星数据匹配.xlsx`)
// console.log(JSON.stringify(workSheetsFromFile, null, 2))
let arr = {
BEIDOU:[],
GALILEO:[],
GLONASS:[],
GPS:[]
}; // 全部表中的数据
workSheetsFromBuffer.forEach((sheet) => {
if(sheet['name'] == '北斗(最终)' || sheet['name'] == 'GPS(最终)' || sheet['name'] == 'GLONASS(最终)' || sheet['name'] == 'GALILEO(最终)') {
let satellite
switch(sheet['name']){
case('北斗(最终)'):
satellite = 'BEIDOU'
break;
case('GPS(最终)'):
satellite = 'GPS'
break;
case('GLONASS(最终)'):
satellite = 'GLONASS'
break;
case('GALILEO(最终)'):
satellite = 'GALILEO'
break;
default:
break;
}
for (let i = 1; i < sheet['data'].length; i++) {
// excel第一行是是表头,所以从1开始循环
let row = sheet['data'][i] // 获取行数据
if (row && row.length > 0) {
// moment处理 ISO 8601格式的时间,
if(sheet['name'] == '北斗(最终)'){
arr[`${satellite}`].push({
rawname: row[0].trim(), // row[0]对应表格里A列
showname: row[1], // row[1]对应表格里B列
airDefenseNumber: row[2], // row[2]对应表格里C列
PRN: row[3], // row[3]对应表格里D列
type: row[4], // row[4]对应表格里E列
launchDate: handleDate(row[5], 'yyyy-MM-dd'), // row[5]对应表格里F列
runningCycle: row[6], // row[6]对应表格里G列
orbitalInclination: row[7], // row[7]对应表格里H列
apogeeAltitude: row[8], // row[8]对应表格里I列
perigeeAltitude: row[9], // row[9]对应表格里J列
atomicClockType: row[10], // row[10]对应表格里K列
beidouType: row[11] // row[11]对应表格里L列
})
}else{
arr[`${satellite}`].push({
rawname: row[0].trim(), // row[0]对应表格里A列
showname: row[1], // row[1]对应表格里B列
airDefenseNumber: row[2], // row[2]对应表格里C列
PRN: row[3], // row[3]对应表格里D列
type: row[4], // row[4]对应表格里E列
launchDate: handleDate(row[5], 'yyyy-MM-dd'), // row[5]对应表格里F列
runningCycle: row[6], // row[6]对应表格里G列
orbitalInclination: row[7], // row[7]对应表格里H列
apogeeAltitude: row[8], // row[8]对应表格里I列
perigeeAltitude: row[9] // row[9]对应表格里J列
})
}
}
}
}
})
return arr
}
module.exports = { loadData }