代碼:
var wb;//讀取完成的數據
function importf(obj) {//導入
//判斷FileReader是否存在,FileReader是實現純前端導入的必要方法
if (typeof (FileReader) != "undefined") {
//判斷是否可以使用readAsBinaryString,IE10瀏覽器沒有的情況下用readAsArrayBuffer,手動將文件流轉二進制字符串(fixdata方法在下方)
if (!FileReader.prototype.readAsBinaryString) {
var f = obj.files[0];
var reader = new FileReader();
reader.onload = function (e) {
var data = e.target.result;
wb = XLSX.read(btoa(fixdata(data)), {
type: 'base64'
});
//此處showImportVehicles是我接下來展示數據的方法,紅色部分可拿到Excel中第一列的具體數值,其他列自然也可以容易獲取
window.parent.page
.showImportVehicles(JSON.stringify(XLSX.utils
.sheet_to_csv(wb.Sheets[wb.SheetNames[0]])));
};
reader.readAsArrayBuffer(f);
} else {
//不需要兼容IE10及以下版本瀏覽器時可用readAsBinaryString
var f = obj.files[0];
var reader = new FileReader();
reader.onload = function (e) {
var data = e.target.result;
wb = XLSX.read(data, {
type: 'binary'
});
window.parent.page.showImportVehicles(JSON.stringify(XLSX.utils.sheet_to_csv(wb.Sheets[wb.SheetNames[0]])));
};
reader.readAsBinaryString(f);
}
} else {
//IE9及以下版本瀏覽器,沒有FileReader方法時,無法實現純前端導入Excel,這時在后端獲取文件內容再返回前端,更加方便快捷
$.ajaxFileUpload
({
url: "/etims-track/track/importVehicles",
secureuri: false,
fileElementId: 'excelFile',
timeout: 600000,
success: function (data) {
var str = data.body.innerHTML;//獲取返回的字符串
window.parent.page.showImportVehicles(str);
},
error: function (data, status, e) {
}
})
}
}
function fixdata(data) { //文件流轉BinaryString
var o = "";
var bytes = new Uint8Array(data);
for (var i = 0; i < data.byteLength; i++) {
o += String.fromCharCode(bytes[i]);
}
return o;
}
注:兼容IE9及以下版本使用ajaxFileUpload向后端傳文件的兼容處理:
在ajaxfileupload.js文件中有這樣一段代碼:
if(window.ActiveXObject) {
if(jQuery.browser.version=="9.0" || jQuery.browser.version=="10.0"){
var io = document.createElement('iframe');
io.id = frameId;
io.name = frameId;
}else if(jQuery.browser.version=="6.0" || jQuery.browser.version=="7.0" || jQuery.browser.version=="8.0"){
var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />');
if(typeof uri== 'boolean'){
io.src = 'javascript:false';
}
else if(typeof uri== 'string'){
io.src = uri;
}
}
}
這段代碼已經是在想辦法去兼容瀏覽器版本了,但在IE9版本瀏覽器下,無法識別JQuery.browser.version,也就是無法識別瀏覽器版本version,因此修改成以下代碼:
if(window.ActiveXObject) {
var ieVersion = navigator.appVersion.split(";")[1].replace(/[ ]/g, "").replace("MSIE","");
if(ieVersion=="9.0" || ieVersion=="10.0"){
var io = document.createElement('iframe');
io.id = frameId;
io.name = frameId;
}else if(ieVersion=="6.0" || ieVersion=="7.0" || ieVersion=="8.0"){
var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />');
if(typeof uri== 'boolean'){
io.src = 'javascript:false';
}
else if(typeof uri== 'string'){
io.src = uri;
}
}
}
這里的ieVersion獲取到的就是IE瀏覽器的版本,就可以解決兼容性問題。
另:在通過后端獲取Excel文件中內容時,除了通過ajaxFileUpload方式,也可以使用Jquery form表單提交的形式。