legions-thirdparty-plugin
Version:
384 lines (361 loc) • 12.3 kB
JavaScript
/**
* legions-thirdparty-plugin v0.0.9
* (c) 2021 duanguang
* @license MIT
*/
import XLSX from 'xlsx';
function has (browser) {
const ua = navigator.userAgent;
if (browser === 'ie') {
const isIE = ua.indexOf('compatible') > -1 && ua.indexOf('MSIE') > -1;
if (isIE) {
const reIE = new RegExp('MSIE (\\d+\\.\\d+);');
reIE.test(ua);
return parseFloat(RegExp['$1']);
} else {
return false;
}
} else {
return ua.indexOf(browser) > -1;
}
}
const csv$1 = {
_isIE11 () {
let iev = 0;
const ieold = (/MSIE (\d+\.\d+);/.test(navigator.userAgent));
const trident = !!navigator.userAgent.match(/Trident\/7.0/);
const rv = navigator.userAgent.indexOf('rv:11.0');
if (ieold) {
iev = Number(RegExp.$1);
}
if (navigator.appVersion.indexOf('MSIE 10') !== -1) {
iev = 10;
}
if (trident && rv !== -1) {
iev = 11;
}
return iev === 11;
},
_isEdge () {
return /Edge/.test(navigator.userAgent);
},
_getDownloadUrl (text) {
const BOM = '\uFEFF';
// Add BOM to text for open in excel correctly
if (window.Blob && window.URL && window.URL.createObjectURL) {
const csvData = new Blob([BOM + text], { type: 'text/csv' });
return URL.createObjectURL(csvData);
} else {
return 'data:attachment/csv;charset=utf-8,' + BOM + encodeURIComponent(text);
}
},
download (filename, text) {
if (has('ie') && has('ie') < 10) {
// has module unable identify ie11 and Edge
const oWin = window.top.open('about:blank', '_blank');
oWin.document.charset = 'utf-8';
oWin.document.write(text);
oWin.document.close();
oWin.document.execCommand('SaveAs', filename);
oWin.close();
} else if (has('ie') === 10 || this._isIE11() || this._isEdge()) {
const BOM = '\uFEFF';
const csvData = new Blob([BOM + text], { type: 'text/csv' });
navigator.msSaveBlob(csvData, filename);
} else {
const link = document.createElement('a');
link.download = filename;
link.href = this._getDownloadUrl(text);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
}
};
/*
inspired by https://www.npmjs.com/package/react-csv-downloader
now removed from Github
*/
const newLine = '\r\n';
const appendLine = (content, row, { separator, quoted }) => {
const line = row.map(data => {
if (!quoted) return data;
// quote data
data = typeof data === 'string' ? data.replace(/"/g, '"') : data;
return typeof data === 'string' ? `"${data}"\t` : data;
// return `"${data}\t"`; // add \t 解决数字字符过长显示成科学计算法
});
content.push(line.join(separator));
};
const defaults = {
separator: ',',
quoted: false,
};
function csv(columns, datas, options, noHeader = false) {
options = Object.assign({}, defaults, options);
let columnOrder;
const content = [];
const column = [];
if (columns) {
columnOrder = columns.map(v => {
if (typeof v === 'string') return v;
if (!noHeader) {
column.push(typeof v.title !== 'undefined' ? v.title : v.dataIndex);
}
return v.dataIndex;
});
if (column.length > 0) appendLine(content, column, options);
} else {
columnOrder = [];
datas.forEach(v => {
if (!Array.isArray(v)) {
columnOrder = columnOrder.concat(Object.keys(v));
}
});
if (columnOrder.length > 0) {
columnOrder = columnOrder.filter(
(value, index, self) => self.indexOf(value) === index
);
if (!noHeader) appendLine(content, columnOrder, options);
}
}
if (Array.isArray(datas)) {
datas.forEach(row => {
if (!Array.isArray(row)) {
row = columnOrder.map(k =>
typeof row[k] !== 'undefined' ? row[k] : ''
);
}
appendLine(
content,
row,
Object.assign(options, { separator: ',', quoted: true })
); // 修复内容区遇到逗号,会换行
});
}
return content.join(newLine);
}
/**
* Copyright (c) 2013-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* Use invariant() to assert state which your program assumes to be true.
*
* Provide sprintf-style format (only %s is supported) and arguments
* to provide information about what broke and what you were
* expecting.
*
* The invariant message will be stripped in production, but the invariant
* will remain to ensure logic does not differ in production.
*/
var NODE_ENV = process.env.NODE_ENV;
var invariant = function (condition, format, a, b, c, d, e, f) {
if (NODE_ENV !== 'production') {
if (format === undefined) {
throw new Error('invariant requires an error message argument');
}
}
if (!condition) {
var error;
if (format === undefined) {
error = new Error(
'Minified exception occurred; use the non-minified dev environment ' +
'for the full error message and additional helpful warnings.'
);
} else {
var args = [a, b, c, d, e, f];
var argIndex = 0;
error = new Error(
format.replace(/%s/g, function () {
return args[argIndex++];
})
);
error.name = 'Invariant Violation';
}
error.framesToPop = 1; // we don't care about invariant's own frame
throw error;
}
};
var invariant_1 = invariant;
function auto_width(ws, data) {
/*set worksheet max width per col*/
var colWidth = data.map(function (row) {
return row.map(function (val) {
/*if null/undefined*/
if (val == null) {
return { wch: 10 };
}
else if (val.toString().charCodeAt(0) > 255) {
/*if chinese*/
return { wch: val.toString().length * 2 };
}
else {
return { wch: val.toString().length };
}
});
});
/*start in the first row*/
var result = colWidth[0];
for (var i = 1; i < colWidth.length; i++) {
for (var j = 0; j < colWidth[i].length; j++) {
if (result[j]['wch'] < colWidth[i][j]['wch']) {
result[j]['wch'] = colWidth[i][j]['wch'];
}
}
}
ws['!cols'] = result;
}
function json_to_array(key, jsonData) {
return jsonData.map(function (v) {
return key.map(function (j) {
return v[j];
});
});
}
// get head from excel file,return array
function get_header_row(sheet) {
var headers = [];
var range = XLSX.utils.decode_range(sheet['!ref']);
var C;
var R = range.s.r; /* start in the first row */
for (C = range.s.c; C <= range.e.c; ++C) {
/* walk every column in the range */
var cell = sheet[XLSX.utils.encode_cell({ c: C, r: R })]; /* find the cell in the first row */
var hdr = 'UNKNOWN ' + C; // <-- replace with your desired default
if (cell && cell.t)
hdr = XLSX.utils.format_cell(cell);
//@ts-ignore
headers.push(hdr);
}
return headers;
}
var export_table_to_excel = function (id, filename) {
//@ts-ignore
var table = document.querySelector("." + id).querySelector('table');
var wb = XLSX.utils.table_to_book(table);
XLSX.writeFile(wb, filename);
};
var exportJsonToExcel = function (_a) {
var data = _a.data, columns = _a.columns, autoWidth = _a.autoWidth, filename = _a.filename;
var newArr = [];
data.map(function (item) {
var dataItem = {};
var _loop_1 = function (key) {
var newItem = columns.filter(function (entity) { return entity['dataIndex'] === key; });
if (newItem && newItem.length) {
// @ts-ignore
dataItem[newItem[0].title] = item[key];
}
};
for (var key in item) {
_loop_1(key);
}
if (dataItem) {
//@ts-ignore
newArr.push(dataItem);
}
});
export_json_to_excel({
data: newArr,
key: columns.map(function (item) { return item['title']; }),
filename: filename,
//@ts-ignore
autoWidth: autoWidth,
});
};
var exportArrayToExcel = function (_a) {
var data = _a.data, columns = _a.columns, autoWidth = _a.autoWidth, filename = _a.filename;
var newArr = [];
data.map(function (item) {
var newDataItem = [];
columns.map(function (entity) {
//@ts-ignore
newDataItem.push(item[entity['dataIndex']]);
});
//@ts-ignore
newArr.push(newDataItem);
});
export_array_to_excel({
data: newArr,
key: columns.map(function (item) { return item['title']; }),
filename: filename,
//@ts-ignore
autoWidth: autoWidth,
});
};
var export_json_to_excel = function (_a) {
var data = _a.data, key = _a.key; _a.title; var filename = _a.filename, autoWidth = _a.autoWidth;
var wb = XLSX.utils.book_new();
// data.unshift(title);
var ws = XLSX.utils.json_to_sheet(data, { header: key });
if (autoWidth) {
var arr = json_to_array(key, data);
auto_width(ws, arr);
}
XLSX.utils.book_append_sheet(wb, ws, filename);
XLSX.writeFile(wb, filename + '.xlsx');
};
var export_array_to_excel = function (_a) {
var key = _a.key, data = _a.data; _a.title; var filename = _a.filename, autoWidth = _a.autoWidth;
var wb = XLSX.utils.book_new();
// arr.unshift(title);
//const ws = XLSX.utils.aoa_to_sheet(arr);
var ws = XLSX.utils.aoa_to_sheet([key]);
if (autoWidth) {
var arr = json_to_array(key, data);
auto_width(ws, arr);
}
XLSX.utils.sheet_add_aoa(ws, data, { origin: 'A2' });
XLSX.utils.book_append_sheet(wb, ws, filename);
XLSX.writeFile(wb, filename + '.xlsx');
};
var read = function (data, type) {
var workbook = XLSX.read(data, { type: type });
var firstSheetName = workbook.SheetNames[0];
var worksheet = workbook.Sheets[firstSheetName];
var header = get_header_row(worksheet);
var results = XLSX.utils.sheet_to_json(worksheet);
return { header: header, results: results };
};
/**
* 将数据导出为 .csv 文件,不适应复杂表格的excel 文件生成 说明
支持IE9~IE11、Edge、Chrome、Safari、Firefox 全系列浏览器。
IE9、Safari 需要手动修改后缀名为 .csv。
IE9暂时只支持英文,中文会显示为乱码。
*说明:columns 和 data 需同时声明,声明后将导出指定的数据,建议列数据有自定义render时,可以根据需求自定义导出内容
* @export
* @param {IExportCsv} params
*/
function exportCsv(params) {
if (params.filename) {
if (params.filename.indexOf('.csv') === -1) {
params.filename += '.csv';
}
}
else {
params.filename = 'table.csv';
}
invariant_1(params.columns instanceof Array, "\u8BF7\u8BBE\u7F6E\u9700\u8981\u5BFC\u51FA\u7684\u5217\u4FE1\u606F");
invariant_1(params.data instanceof Array, "\u8BF7\u8BBE\u7F6E\u9700\u8981\u5BFC\u51FA\u7684\u4FE1\u606F");
var columns = [];
var datas = [];
if (params.columns && params.data) {
//@ts-ignore
columns = params.columns;
//@ts-ignore
datas = params.data;
}
var noHeader = false;
//@ts-ignore
if ('noHeader' in params)
noHeader = params.noHeader;
var data = csv(columns, datas, params, noHeader);
if (params.callback)
params.callback(data);
else
csv$1.download(params.filename, data);
}
export { exportArrayToExcel, exportCsv, exportJsonToExcel, export_array_to_excel, export_json_to_excel, export_table_to_excel, read };