147 lines
3.6 KiB
JavaScript
147 lines
3.6 KiB
JavaScript
const xlsx = require('../lib/xlsx.style.js');
|
|
//excel列转换
|
|
const convertDSTo26BS = function(num) {
|
|
var code = '';
|
|
var reg = /^\d+$/g;
|
|
if (!reg.test(num)) {
|
|
return code;
|
|
}
|
|
while (num > 0) {
|
|
m = num % 26
|
|
if (m == 0) {
|
|
m = 26;
|
|
}
|
|
code = String.fromCharCode(64 + parseInt(m)) + code;
|
|
num = (num - m) / 26;
|
|
}
|
|
return code;
|
|
}
|
|
const convert26BSToDS = function(code) {
|
|
var num = -1;
|
|
var reg = /^[A-Z]+$/g;
|
|
if (!reg.test(code)) {
|
|
return num;
|
|
}
|
|
num = 0;
|
|
for (var i = code.length - 1, j = 1; i >= 0; i--, j *= 26) {
|
|
num += (code[i].charCodeAt() - 64) * j;
|
|
}
|
|
return num;
|
|
}
|
|
//读取base64xlsx数据
|
|
const readXlsx = function(base64, options = []) {
|
|
let result = {};
|
|
let xlsxInfo = xlsx.read(base64);
|
|
const readSheetsIndex = [];
|
|
options.forEach(item => {
|
|
if (item.index === -1) {
|
|
item.index = xlsxInfo.Workbook.WBView[0].activeTab
|
|
}
|
|
readSheetsIndex.push(item.index)
|
|
})
|
|
let sheets = xlsxInfo.Sheets;
|
|
let list = [];
|
|
if (xlsxInfo.Workbook.Sheets.length > 0) {
|
|
for (var i = 0; i < xlsxInfo.Workbook.Sheets.length; i++) {
|
|
const key = xlsxInfo.Workbook.Sheets[i].name
|
|
const currentOption = options.find(item =>{
|
|
return item.autoKey && item.index === i
|
|
})
|
|
let autoKey;
|
|
if(currentOption){
|
|
autoKey = currentOption.autoKey
|
|
}
|
|
if (readSheetsIndex.indexOf(i) === -1) {
|
|
list.push({
|
|
name: key,
|
|
data: []
|
|
})
|
|
continue;
|
|
}
|
|
let sheet = [];
|
|
let item = sheets[key];
|
|
for (let k in item) {
|
|
let ritem = item[k];
|
|
let btn = true
|
|
if (k === '!ref') {
|
|
let strArr = ritem.split(':');
|
|
let startRowIndex = Number(strArr[0].replace(/[^\d]/g, '')) - 1;
|
|
let endRowIndex = Number(strArr[1].replace(/[^\d]/g, '')) - 1;
|
|
let rowsCount = endRowIndex - startRowIndex + 1;
|
|
let startColIndex = 1;
|
|
let endColIndex = 1;
|
|
startColIndex = convert26BSToDS(strArr[0].replace(/[0-9]+/g, ''));
|
|
endColIndex = convert26BSToDS(strArr[1].replace(/[0-9]+/g, ''));
|
|
endColIndex -= 1;
|
|
startColIndex -= 1;
|
|
let colsCount = endColIndex - startColIndex + 1;
|
|
//let sheetArr = [];
|
|
for (var ri = startRowIndex; ri <= endRowIndex; ri++) {
|
|
let row = ri + 1;
|
|
let rowArr = [];
|
|
for (var ci = startColIndex; ci <= endColIndex; ci++) {
|
|
let col = convertDSTo26BS(ci + 1);
|
|
if (item[col + row]) {
|
|
if (item[col + row].t === 's') {
|
|
rowArr.push(item[col + row].v);
|
|
} else if (item[col + row].t === 'n') {
|
|
var reg = /^[0-9,/:-\s]+$/;
|
|
if (!isNaN(Date.parse(new Date(item[col + row].w.replace(/-/g,
|
|
'/')))) && isNaN(
|
|
item[col + row].w) && reg.test(item[col + row].w)) {
|
|
rowArr.push(item[col + row].w);
|
|
} else {
|
|
rowArr.push(item[col + row].v);
|
|
}
|
|
}
|
|
} else {
|
|
if(autoKey && item[col+ Number(currentOption.keysIndex+1)].v === autoKey){
|
|
btn = false
|
|
break;
|
|
}
|
|
rowArr.push('');
|
|
}
|
|
}
|
|
if(btn){
|
|
sheet.push(rowArr);
|
|
}else{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
list.push({
|
|
name: key,
|
|
data: sheet
|
|
})
|
|
}
|
|
return list
|
|
}
|
|
return []
|
|
}
|
|
|
|
|
|
const formatExcelToJsonOptions = function(configArr = []) {
|
|
let defaultConfig = {
|
|
"index": 0,
|
|
"keysIndex": 0,
|
|
"startIndex": 1,
|
|
"endIndex": -1
|
|
}
|
|
if (configArr && configArr.length > 0) {
|
|
return configArr.map(item => {
|
|
return {
|
|
...defaultConfig,
|
|
...item
|
|
}
|
|
})
|
|
} else {
|
|
return [defaultConfig]
|
|
}
|
|
}
|
|
|
|
|
|
exports.convertDSTo26BS = convertDSTo26BS
|
|
exports.convert26BSToDS = convert26BSToDS
|
|
exports.readXlsx = readXlsx
|
|
exports.formatExcelToJsonOptions = formatExcelToJsonOptions |