import { HandleImportFile } from '@/common/xlsx.js'
<input
class="excel-upload-input"
type="file"
@change="Uploads"
/>
Uploads = async (e) => {
const xlsxList = await HandleImportFile(e)
console.log(xlsxList, 'xlsx生成list')
}
import * as XLSX from 'xlsx';
export let HandleImportFile = (e) => {
return new Promise((resolve, reject) => {
let { files } = e.target;
if (!files.length) return;
let name = files[0].name;
let suffix = name.substr(name.lastIndexOf('.'));
let reader = new FileReader();
reader.onload = event => {
try {
if ('.xls' !== suffix && '.xlsx' !== suffix) {
alert('仅支持上传xls、xlsx格式的文件!');
resolve(0);
return false;
}
let data = [];
let { result } = event.target;
let workbook = XLSX.read(result, { type: 'binary' });
for (let sheet in workbook.Sheets) {
if (workbook.Sheets.hasOwnProperty(sheet)) {
data = data.concat(
XLSX.utils.sheet_to_json(workbook.Sheets[sheet])
);
}
}
resolve(data);
} catch (e) {
alert('文件类型不正确!');
}
};
reader.readAsBinaryString(files[0]);
});
};
export const DownloadExl = (json, type) => {
var data = json[0];
json.unshift({});
var keyMap = [];
for (var k in data) {
keyMap.push(k);
json[0][k] = k;
}
var tmpdata = [];
json
.map((v, i) =>
keyMap.map((k, j) =>
Object.assign(
{},
{
v: v[k],
position:
(j > 25 ? getCharCol(j) : String.fromCharCode(65 + j)) + (i + 1)
}
)
)
)
.reduce((prev, next) => prev.concat(next))
.forEach(
(v, i) =>
(tmpdata[v.position] = {
v: v.v
})
);
var outputPos = Object.keys(tmpdata);
var tmpWB = {
SheetNames: ['mySheet'],
Sheets: {
mySheet: Object.assign(
{},
tmpdata,
{
'!ref': outputPos[0] + ':' + outputPos[outputPos.length - 1]
}
)
}
};
var tmpDown = new Blob(
[
s2ab(
XLSX.write(
tmpWB,
{
bookType: type ? 'xlsx' : type,
bookSST: false,
type: 'binary'
}
)
)
],
{
type: ''
}
);
var href = URL.createObjectURL(tmpDown);
setTimeout(() => {
let newTmpDown = tmpDown.toString();
URL.revokeObjectURL(newTmpDown);
}, 100);
return href;
};
const 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;
};
const getCharCol = (n) => {
let s = '',
m = 0;
while (n > 0) {
m = (n % 26) + 1;
s = String.fromCharCode(m + 64) + s;
n = (n - m) / 26;
}
return s;
};