import XLSX from 'xlsx';
export interface Ix2jProps {
size: number;
checked: boolean;
}
export interface IxlsxJsonProps {
tableHead: (string | number)[];
tableBody: (string | number)[][];
}
export const xlsxToJson = (
file: File | null,
params: Ix2jProps = { size: 10, checked: true },
) => {
return new Promise((resolve, reject) => {
if (!file) {
reject('文件不正确');
return;
}
const { size, checked } = params;
const fileName = file.name.split('.')[0],
fileSize = file.size / 1024 / 1024,
fileType = file.name.split('.')[1];
if (fileSize > size) reject(`文件大小不能超过${size}M`);
if (checked && !/(xlsx|xls)/i.test(fileType)) reject('文件格式不正确');
const fileReader = new FileReader();
fileReader.readAsBinaryString(file);
fileReader.onload = (e: ProgressEvent<FileReader>) => {
let json = e.target?.result || {};
let workbook = XLSX.read(json, { type: 'binary' });
let data: any[] = [];
for (let sheet in workbook.Sheets) {
if (workbook.Sheets.hasOwnProperty(sheet)) {
data = data.concat(XLSX.utils.sheet_to_json(workbook.Sheets[sheet]));
}
}
resolve(data);
};
fileReader.onerror = () => {
reject('转换失败');
};
});
};
export const json2antdTable = (xlsxList: any[]) => {
let column: any[] = [],
datasource: any[] = [];
const head = xlsxList[0],
body = xlsxList.slice(1);
Object.entries(head).forEach(([key, val]) => {
column.push({
title: val,
key,
dataIndex: key,
});
});
datasource = body.map((item) => {
item.key = item.__rowNum__;
Reflect.deleteProperty(item, '__rowNum__');
return { ...item };
});
return {
column,
datasource,
};
};
export const jsonToXlsxBlob = ({ tableHead, tableBody }: IxlsxJsonProps) => {
const sheet = XLSX.utils.aoa_to_sheet([tableHead, ...tableBody]);
return sheet2blob(sheet);
};
const sheet2blob = (sheet: XLSX.WorkSheet) => {
function s2ab(s: any) {
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;
}
const workbook = {
SheetNames: ['sheet1'],
Sheets: { sheet1: sheet },
};
const workBuf = XLSX.write(workbook, {
bookType: 'xlsx',
bookSST: false,
type: 'binary',
});
return new Blob([s2ab(workBuf)], { type: 'application/octet-stream' });
};
export const donwLoadFile = (blob: Blob, fileName: string) => {
const url = window.URL.createObjectURL(blob);
const aLink = document.createElement('a');
aLink.setAttribute('href', url);
aLink.setAttribute('download', fileName + '.xlsx');
aLink.click();
setTimeout(() => {
aLink.remove();
window.URL.revokeObjectURL(url);
}, 300);
};