项目里有个需求要在线查看服务端的Excel文件网上提供的代码不能远程访问服务端的Excel文件,只能同域访问,需要设置IIS跨域。

代码:

function  loadRemoteFile(url) {
 this.readWorkbookFromRemoteFile(url, function (workbook) {
    vueApp1.readWorkbook(workbook);
                    });},
// 从网络上读取某个excel文件,url必须同域,否则报错
//这里就要在IIS里设置了
function  readWorkbookFromRemoteFile(url, callback) {
                    // var xhr = new XMLHttpRequest();
                    var xhr = this.getHttpObj();
                    xhr.open('get', url, true);
                    xhr.responseType = 'arraybuffer';
                   // response.setHeader("Access-Control-Allow-Origin", "http:localhost:8080/");
                    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
                    xhr.onload = function (e) {
    if (xhr.status == 200) {
          var data = new Uint8Array(xhr.response)
         var workbook = XLSX.read(data, { type: 'array' });
        if (callback) callback(workbook);
    }
                    };
                    xhr.send();}
 
 function   getHttpObj() {
                    var httpobj = null;
                    try {
                        httpobj = new ActiveXObject("Msxml2.XMLHTTP");
                    }
                    catch (e) {
                        try {
                            httpobj = new ActiveXObject("Microsoft.XMLHTTP");
                        }
                        catch (e1) {
                            httpobj = new XMLHttpRequest();
                        }
                    }
                    return httpobj; }
 
function  readWorkbook: function (workbook) {
 var sheetNames = workbook.SheetNames; // 工作表名称集合
                    var worksheet = workbook.Sheets[sheetNames[0]]; // 这里我们只读取第一张sheet

var csvcc = XLSX.utils.sheet_to_csv(worksheet);   //手动调的布局,也可以用sheet_to_html直接生成html的table,如果列文字多显示不美观
                    $("#excelPdf").css("overflow-x", "visible"); 
                    $("#excelPdf").html(this.sheetHtml(csvcc));}
 
 function  csv2table: function (csv) { 
                    var html='';
                    var first = true;
                    var rows = csv.split('\n');
                    rows.pop(); // 最后一行没用的
                    rows.forEach(function (row, idx) {
                        var columns = row.split(',');
                        var blank = columns.filter(c=>c == "");
                        var len = columns.filter(c=> {
                           let blen=  vueApp1.getBLen(c);
                           return blen > 12;
                        });                        if (blank.length > 2 && len.length>0) {
                            if (!first) html += '</table>';
                            html += '<p>';
                            columns.forEach(function (column) {
                                html += '<span style="padding-right:15px;">' + column + '</span>';
                            });
                            html += '</p>';
                        }
                        else {
                            if (first) html += '<table>'
                            first = false;                            html += '<tr>';
                            columns.forEach(function (column) {
                                html += '<td style="padding-right:15px;">' + column + '</td>';
                            });
                            html += '</tr>';
                        }
                    });

                    return html;
                }                function  getBLen(str) {     //把双字节的替换成两个单字节的然后再获得长度
                    if (str == null) return 0;
                    if (typeof str != "string"){
                        str += "";
                    }
                    return str.replace(/[^\x00-\xff]/g,"01").length;
                }