123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- var xlsxUtils = {
- Binary: {
- fixdata(data) { //文件流转BinaryString
- var o = "",
- l = 0,
- w = 10240;
- for (; l < data.byteLength / w; ++l) o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w)));
- o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w)));
- return o;
- },
- s2ab(s) { //字符串转字符流
- var buf = new ArrayBuffer(s.length);
- var view = new Uint8Array(buf);
- for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
- return buf;
- }
- },
- _wb: null,
- _rABS: false,
- /**
- * @desc 导入根据文件
- * @param {File} f 文件
- * @param {Function} c 回调
- * @return {Object} 回调值
- */
- import(f, c) {
- this.wb = null;
- var reader = new FileReader();
- reader.onload = function (e) {
- var data = e.target.result;
- xlsxUtils._wb = xlsxUtils._rABS ? XLSX.read(btoa(xlsxUtils.Binary.fixdata(data)), { type: 'base64' }) : XLSX.read(data, { type: 'binary' });
- if (typeof c == "function") { c(xlsxUtils._wb); }
- };
- if (xlsxUtils._rABS) {
- reader.readAsArrayBuffer(f);
- } else {
- reader.readAsBinaryString(f);
- }
- },
- /**
- * @desc 根据表Sheet名获取数据
- * @param {String} name
- * @return {Object}
- */
- getSheetByName(name, opt) {//
- return XLSX.utils.sheet_to_json(xlsxUtils._wb.Sheets[name], opt);
- },
- /**
- * @desc 根据表Sheet索引获取数据
- * @param {Number} index
- * @return {Object}
- */
- getSheetByIndex(index = 0, opt) {
- return xlsxUtils.getSheetByName(xlsxUtils._wb.SheetNames[index], opt);
- },
- /**
- * @desc 导出
- * @param {Array} data 数据{title1:dataList,title2:dataList....}
- * @param {String} type
- * @return {Blob}
- */
- export(data, type) {
- var tmpWB = null;
- for (var title in data) {
- var tmpdata = xlsxUtils.format2Sheet(data[title]);
- tmpWB = xlsxUtils.format2WB(tmpdata, title, tmpWB);
- }
- return xlsxUtils.format2Blob(tmpWB, type);
- },
- /**
- * 从数据数组或对象中根据key生成相同key值的对象
- * @param {Object|Array} data
- * @return {Object}
- */
- readDataHead(data) {
- var o = {}, d = Array.isArray(data) ? Object.keys(data[0]) : data; for (var i of d) o[i] = i;
- return o;
- },
- /**
- * @desc 格式化数据为Sheet格式
- * @param {Array} json 数据
- * @param {Number} n 列偏移
- * @param {Number} r 行偏移
- * @param {Array} keyMap 对象键数组
- * @param {Function|Boolean} t 数据
- */
- format2Sheet(json, n, r, keyMap, t) {
- keyMap = keyMap || Object.keys(json[0]);
- var types = (t == undefined ? ((v) => (({ "number": "n", undefined: "s", "boolean": "b","string":"s" })[typeof v])||"s") : t);
- n = n || 0;
- r = r || 0;
- var tmpdata = {};//用来保存转换好的json
- var t1 = json.map((v, i) => keyMap.map((k, j) => Object.assign({}, {
- v: v[k],
- position: ((j + n) > 25 ? xlsxUtils.getCharCol((j + n)) : String.fromCharCode(65 + (j + n))) + (i + 1 + r),
- }))).reduce((prev, next) => prev.concat(next)).forEach((v, i) => tmpdata[v.position] = {
- v: v.v,
- t: types?types(v.v):"s"
- });
- return tmpdata;
- },
- /**
- * @desc 格式化数据为Sheet格式
- * @param {Array} sheetData
- * @param {String} title
- * @param {Object} wb
- * @param {Object} ref
- */
- format2WB(sheetData, title, wb, ref) {
- title = title || "mySheet";
- var outputPos = Object.keys(sheetData);
- if (!wb) wb = { Sheets: {}, SheetNames: [] };
- wb.SheetNames.push(title);
- wb.Sheets[title] = Object.assign({}, sheetData, {
- '!ref': ref || (outputPos[0] + ':' + outputPos.reverse().find(_=>_.indexOf("!")==-1))//设置填充区域
- });
- return wb;
- },
- /**
- * @desc 将xlsx Workbook 转为blob
- * @param {Array} wb
- * @param {String} type 类型
- */
- format2Blob(wb, type) {
- return new Blob([xlsxUtils.Binary.s2ab(XLSX.write(wb,
- { bookType: (type == undefined ? 'xlsx' : type), bookSST: false, type: 'binary' }//这里的数据是用来定义导出的格式类型
- ))], { type: "" });
- },
- /**
- * @desc 匹配单元格对应的标识
- * @param {Number} n
- */
- getCharCol(n) {
- let temCol = '',
- s = '',
- m = 0
- while (n > 0) {
- m = n % 26 + 1
- s = String.fromCharCode(m + 64) + s
- n = (n - m) / 26
- }
- return s
- },
- };
|