NGTools/uni_modules/sv-excel-json-each/uniCloud/cloudfunctions/common/sv-excel-json-handler/util/index.js
ldeyun 9dbfdc6c71 V1.0.0
微信小程序运行成功;
H5运行成功
2024-09-30 01:30:39 +08:00

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