js导出Excel表格超出26位英文字符的解决方法ES6
网络 2018-01-04 1068
这个需要对Excel表格的表头编码规则有所了解,目前示例代码只扩展到52个字段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | /** *json数据导入导出Excel表格示例代码 * / var array_utils = require('./utils-array') var XLSX = require("xlsx"); module.exports = { writeExcel : function (headers,data,file,callback) { if(data.length ==0){ var obj = {} for(var v of headers){ obj[v] = '' } data.push(obj) } _writeExcel(headers,data,file,callback) }, /** * 获取excel原始信息 * @param path 文件路径 */ info : function(path){ return _info(path) }, /** * 格式化excel原始信息 * @param path 文件路径 */ formate_info : function (path) { return info_formate_info(path).formate }, info_formate_info : function (path) { return info_formate_info(path) } } var _info = function(path) { var k = XLSX.readFile(path, {type: 'base64'}); var result = {} k.SheetNames.forEach(function(sheetName) { var worksheet = k.Sheets[sheetName]; result[sheetName] = XLSX.utils.sheet_to_json(worksheet); }); return result } var info_formate_info = function(path){ var info = _info(path) var result = {} for(var value in info){ result[value] = {} } for(var key_info in info ){ var array = info[key_info] if(array_utils.isArray(array) || array.length>0){ var keys_array = Object.keys(array[0]) var obj = {} for(var value of keys_array){ obj[value] = [] } for( var key in obj ){ var subject_clone = JSON.parse(JSON.stringify(array)) subject_clone.filter( (v)=>{ for(var k in v){ if(k!=key){ delete v[k] } } return v; }) var subject_key_value = Array.from(array_utils.arrayQC(subject_clone),v => v[key] ) var obA = [] for(var v of subject_key_value){ var obk = { id : null, v : v } for(var ke in keys_array){ var thisIndex = keys_array.findIndex(x=>x==keys_array[ke]) var currentIndex = keys_array.findIndex(x=>x==key) if( thisIndex < currentIndex){ try { var thisObj = array.find(x=>x[ key ] == v ) obk[keys_array[ke]] = thisObj[ keys_array[ke] ] }catch (e){ console.error(e) } } } obA.push(obk) } obj[key] = obA } result[key_info]= obj } } return { info : info, formate : result } } var _writeExcel = function (headers,data,file,callback) { var _headers = headers var _data = data; var headers = _headers // 为 _headers 添加对应的单元格位置 .map((v, i) => Object.assign({}, { v: v, position:num(i)+1 })) // 转换成 worksheet 需要的结构 .reduce((prev, next) => Object.assign({}, prev, {[next.position]: {v: next.v}}), {}); var data = _data .map((v, i) => _headers.map((k, j) => Object.assign({}, { v: v[k], position:num(j) + (i+2) }))) // 对刚才的结果进行降维处理(二维数组变成一维数组) .reduce((prev, next) => prev.concat(next)) // 转换成 worksheet 需要的结构 .reduce((prev, next) => Object.assign({}, prev, {[next.position]: {v: next.v}}), {}); // 合并 headers 和 data // console.log("测试data",data) var output = Object.assign({}, headers, data); // 获取所有单元格的位置 var outputPos = Object.keys(output); // 计算出范围 var ref = outputPos[0] + ':' + outputPos[outputPos.length - 1]; // 构建 workbook 对象 var wb = { SheetNames: ['Sheet1'], Sheets: { 'Sheet1': Object.assign({}, output, { '!ref': ref }) } }; // 导出 Excel XLSX.writeFileAsync( file , wb,function (err) { callback(err) }); } //定位Excel位置 var num=function(i){ var n=parseInt(i+65) if(n>90){ n=String.fromCharCode(65)+String.fromCharCode(i+39) return n }else { n=String.fromCharCode(n) return n } } |