mirror of
https://github.com/crmeb/CRMEB.git
synced 2026-10-31 06:50:51 +00:00
124 lines
4.2 KiB
JavaScript
124 lines
4.2 KiB
JavaScript
// +---------------------------------------------------------------------
|
||
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
|
||
// +---------------------------------------------------------------------
|
||
// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
|
||
// +---------------------------------------------------------------------
|
||
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
|
||
// +---------------------------------------------------------------------
|
||
// | Author: CRMEB Team <admin@crmeb.com>
|
||
// +---------------------------------------------------------------------
|
||
|
||
/* eslint-disable */
|
||
import XLSX from 'xlsx';
|
||
|
||
function auto_width(ws, data){
|
||
/*set worksheet max width per col*/
|
||
const colWidth = data.map(row => row.map(val => {
|
||
/*if null/undefined*/
|
||
if (val == null) {
|
||
return {'wch': 10};
|
||
}
|
||
/*if chinese*/
|
||
else if (val.toString().charCodeAt(0) > 255) {
|
||
return {'wch': val.toString().length * 2};
|
||
} else {
|
||
return {'wch': val.toString().length};
|
||
}
|
||
}));
|
||
/*start in the first row*/
|
||
let result = colWidth[0];
|
||
for (let i = 1; i < colWidth.length; i++) {
|
||
for (let 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(v => key.map(j => { return v[j] }));
|
||
}
|
||
|
||
// fix data,return string
|
||
function fixdata(data) {
|
||
let o = '';
|
||
let l = 0;
|
||
const 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
|
||
}
|
||
|
||
// get head from excel file,return array
|
||
function get_header_row(sheet) {
|
||
const headers = [];
|
||
const range = XLSX.utils.decode_range(sheet['!ref']);
|
||
let C;
|
||
const 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);
|
||
headers.push(hdr)
|
||
}
|
||
return headers
|
||
}
|
||
|
||
export const export_table_to_excel= (id, filename) => {
|
||
const table = document.getElementById(id);
|
||
const wb = XLSX.utils.table_to_book(table);
|
||
XLSX.writeFile(wb, filename);
|
||
|
||
/* the second way */
|
||
// const table = document.getElementById(id);
|
||
// const wb = XLSX.utils.book_new();
|
||
// const ws = XLSX.utils.table_to_sheet(table);
|
||
// XLSX.utils.book_append_sheet(wb, ws, filename);
|
||
// XLSX.writeFile(wb, filename);
|
||
};
|
||
|
||
export const export_json_to_excel = ({data, key, title, filename, autoWidth}) => {
|
||
const wb = XLSX.utils.book_new();
|
||
data.unshift(title);
|
||
const ws = XLSX.utils.json_to_sheet(data, {header: key, skipHeader: true});
|
||
if(autoWidth){
|
||
const arr = json_to_array(key, data);
|
||
auto_width(ws, arr);
|
||
}
|
||
XLSX.utils.book_append_sheet(wb, ws, filename);
|
||
XLSX.writeFile(wb, filename + '.xlsx');
|
||
};
|
||
|
||
export const export_array_to_excel = ({key, data, title, filename, autoWidth}) => {
|
||
const wb = XLSX.utils.book_new();
|
||
const arr = json_to_array(key, data);
|
||
arr.unshift(title);
|
||
const ws = XLSX.utils.aoa_to_sheet(arr);
|
||
if(autoWidth){
|
||
auto_width(ws, arr);
|
||
}
|
||
XLSX.utils.book_append_sheet(wb, ws, filename);
|
||
XLSX.writeFile(wb, filename + '.xlsx');
|
||
};
|
||
|
||
export const read = (data, type) => {
|
||
/* if type == 'base64' must fix data first */
|
||
// const fixedData = fixdata(data)
|
||
// const workbook = XLSX.read(btoa(fixedData), { type: 'base64' })
|
||
const workbook = XLSX.read(data, { type: type });
|
||
const firstSheetName = workbook.SheetNames[0];
|
||
const worksheet = workbook.Sheets[firstSheetName];
|
||
const header = get_header_row(worksheet);
|
||
const results = XLSX.utils.sheet_to_json(worksheet);
|
||
return {header, results};
|
||
};
|
||
|
||
export default {
|
||
export_table_to_excel,
|
||
export_array_to_excel,
|
||
export_json_to_excel,
|
||
read
|
||
}
|