VUE+ElementUIブラウザローカルインポート解析Excel(サーバにアップロードしない)
5563 ワード
VUE+ElementUIブラウザは解析Excelをローカルにインポートします(サーバにアップロードしません).
サードパーティ製xlsxライブラリ(バージョン:0.14.*)を導入する必要があります.npmは次のコマンドを実行します.
サンプルコード:
注意:readAsBinaryString関数のthisを書き換えます.onload共通処理方法はmethodsのread関数で再上書きされる.
JavaScriptページ方式
XLSXダウンロードアドレス:https://www.bootcdn.cn/xlsx/
サードパーティ製xlsxライブラリ(バージョン:0.14.*)を導入する必要があります.npmは次のコマンドを実行します.
npm i xlsx@^0.14.1 -s
サンプルコード:
Excel
import XLSX from 'xlsx'; // npm , :npm i xlsx@^0.14.1 -s
export default {
name: 'importExcel',
data() {
return {
files: null //
};
},
methods: {
/**
* input-file , "$event"
* @param e {@link Object}:$event ;
*/
inFile(e) {
this.files = (e.target || e.srcElement).files; // "input-file" FileList
if (!this.files || !this.files.length)
return;
for (let i = 0, len = this.files.length; i < len; i++)
this.read(this.files[i]);
},
/**
* , 、 。
* @param f {@link Object}: ;
* @param fs {@link Array}: ;
*/
elInFile(f, fs) {
this.read(f.raw);
},
/**
*
* @param f {@link File}
*/
read(f) {
let rd = new FileReader();
rd.onload = e => { //this.readAsArrayBuffer , this.onload 。
let sheets = rd.read2JS();
for (let name in sheets)
console.log(name + ' :', sheets[name]);
['formulae', 'html', 'txt', 'csv', 'dif', 'slk', 'eth'].forEach(item => {
console.info('\r
:' + item);
let sheets = rd.read2(item);
for (let name in sheets)
console.log(name + ' :', sheets[name]);
});
};
rd.readAsBinaryString(f);
}
},
beforeCreate() {
/**
* Excel , {@link Object} ( )
* @return {@link Object}:workbook, ;
*/
FileReader.prototype.read2workbook = function () {
let redABS = false; //
let bytes = new Uint8Array(this.result); //
if (redABS) {
// let fix = new TextDecoder(encode || 'UTF-8').decode(bytes);
let fix = fixdata(bytes);
let b2a = btoa(fix); //js : base64 。 atob(base64) , base64
var wb = XLSX.read(b2a, {
type: 'base64'
});
} else {
let len = bytes.byteLength;
let binarys = new Array(len); // ,
for (let i = 0; i < len; i++)
binarys[i] = String.fromCharCode(bytes[i]);
let binary = binarys.join('');
var wb = XLSX.read(binary, {
type: 'binary'
});
}
return wb; //workbook
};
/**
* ...
*/
FileReader.prototype.read2 = function (format = 'json') {
let wb = this.read2workbook();
if (!wb)
return null;
let r = {};
let formats = ['json', 'formulae', 'html', 'txt', 'csv', 'dif', 'slk', 'eth']; //
format = formats.indexOf(format) == -1 ? 'json' : format;
wb.SheetNames.forEach(name => { //
r[name] = XLSX.utils['sheet_to_' + format](wb.Sheets[name]);
});
return r;
};
/**
* JSON
* @description: ,XLSX , sheet Key。
* Excel , 。
*/
FileReader.prototype.read2JS = function () {
return this.read2();
};
/* readAsBinaryString */
FileReader.prototype.readAsBinaryString = function (f) {
if (!this.onload) // this onload ,
this.onload = e => { // this.onload ,
let rs = this.read2workbook();
console.log(rs);
};
this.readAsArrayBuffer(f); // this.onload
};
/**
* char String
* @param data {@link Array}:char ;
* @return {@link String}
*/
function fixdata(data) {
let w = 1024 << 10; // 1M
let len = Math.floor(data.byteLength / w);
let o = new Array(len);
for (var i = 0; i < len; i++)
o[i] = String.fromCharCode.apply(null, new Uint8Array(data.slice(i * w, (i + 1) * w)));
o[i] = String.fromCharCode.apply(null, new Uint8Array(data.slice(i * w)));
return o.join('');
}
}
}
注意:readAsBinaryString関数のthisを書き換えます.onload共通処理方法はmethodsのread関数で再上書きされる.
JavaScriptページ方式
XLSXダウンロードアドレス:https://www.bootcdn.cn/xlsx/
Excel
function inFile() {
var e = window.event;
var fs = (e.target || e.srcElement).files; // "input-file" FileList
if (!fs || !fs.length)
return;
for (var i = 0, len = fs.length; i < len; i++)
read(fs[i]);
}
/**
*
* @param f {@link File}
*/
function read(f) {
/* VUE method.read */
}
void function () {
/* VUE beforeCreate */
}();