欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

前端读取Excel文件(使用js-xls插件)

程序员文章站 2022-05-17 10:29:50
...

前言:
由于项目需要,现在要用户在上传文件之后,页面能实时、即不通过服务器就能读取到excel的表头关键字,就像上传图片实时预览一样,将关键字展示到页面上。

官方例子:
使用js-xls插件,亲测IE11、FireFox、Chrome可用,读取速度也客观。
官方地址:官方文档点击这里
官方Demo地址:xls例子 xlsx例子

实现:
一. 定义一个文件上传file:

<input type="file" id="file">

二.下载js-xlsx的相应的 xlsx.core.min.js 文件后引入 下载地址

<script type="text/javascript" src="js/xlsx.core.min.js"></script>

三. 监听文件选择,即时打开文件获取表格内容

    $('#file').change(function(e) {
            var files = e.target.files;

            var fileReader = new FileReader();
            fileReader.onload = function(ev) {
                try {
                    var data = ev.target.result,
                        workbook = XLSX.read(data, {
                            type: 'binary'
                        }), // 以二进制流方式读取得到整份excel表格对象
                        persons = []; // 存储获取到的数据
                } catch (e) {
                    console.log('文件类型不正确');
                    return;
                }

                // 表格的表格范围,可用于判断表头数量是否正确
                var fromTo = '';
                // 遍历每张表读取
                for (var sheet in workbook.Sheets) {
                    if (workbook.Sheets.hasOwnProperty(sheet)) {
                        fromTo = workbook.Sheets[sheet]['!ref'];
                        console.log(fromTo);//打印表格范围
persons =persons.concat(XLSX.utils.sheet_to_json(workbook.Sheets[sheet]));                   
/*使用XLSX.utils.sheet_to_json方法解析表格对象返回相应的JSON数据 */ 

                        // break; // 如果只取第一张表,就取消注释这行
                    }
                }

                console.log(persons);//打印获取的数据
            };

            // 以二进制方式打开文件
            fileReader.readAsBinaryString(files[0]);
        });

表格内容:
前端读取Excel文件(使用js-xls插件)

打印结果:
前端读取Excel文件(使用js-xls插件)
我们现在要的是表头的数据,然而由于js-xlsx这个库自身的问题,它是不会直接获取到表头数据保存起来的,而是直接把表头放到最末级的内容对象里面
可自行逐级看看读取到的表格workbook对象内容:
前端读取Excel文件(使用js-xls插件)

 persons =  //由这行代码可知我们读取的数据的位置                persons.concat(XLSX.utils.sheet_to_json(workbook.Sheets[sheet]));

workbook内容:
前端读取Excel文件(使用js-xls插件)
而在官方例子中可以看到,可以解析成不同的数据返回、
g.1 解析成json数据返回
前端读取Excel文件(使用js-xls插件)
g.2 解析成formulae
前端读取Excel文件(使用js-xls插件)
好了果断选择解析成formulae,因为我们现在需要的是表头数据嘛(●’◡’●)
在官方例子中查看源码可知,可得解析成formalae方法
前端读取Excel文件(使用js-xls插件)

且表头数据储存在string里 呸不在string里T . T 把我坑死了,555
千言万语我好委屈!!!可能是当时数据太特殊侥幸过了玛德,气shi我了。
当时图片:
前端读取Excel文件(使用js-xls插件)
后端拿到测试的时候:
前端读取Excel文件(使用js-xls插件)
于是就变成这样了:

前端读取Excel文件(使用js-xls插件)

关键代码:
// 遍历每张表读取

for (var sheet in workbook.Sheets) {
   if (workbook.Sheets.hasOwnProperty(sheet)) {
   persons=persons.concat(XLSX.utils.get_formulae(workbook.Sheets[sheet]));
   break; 
   }
}               
var len = workbook.Strings.length;//获取关键词组长度
for(var i=0;i<len;i++){
    console.log(persons[i].substring(4));//分割前面的4个不明字符
}

上述通过workbook里面的string来获取表头的方式不对。。可以忽略不看了,为了记录,所以没有把上述方法完全删去,为了警醒下天真的计几
前端读取Excel文件(使用js-xls插件)
好了,开始debug。

刚开始我还以为是输入数据带日期什么的特殊码让这个插件崩溃了= =
好了省略万千字debug时的清奇的脑回路线。。
结果:
用Fromto来确定的。就是开头自己获取了。
前端读取Excel文件(使用js-xls插件)
前端读取Excel文件(使用js-xls插件)
E-A+1就是表头的长度。
下面做的细节就是:
1.Fromto = “A1:E2”,我们要获取A和E;
//charAt()

2.将E-A转换为数字。
//我的方法是将E转换为数字,A再转为数字,然后两者相减

3.再之前的代码基础上兼顾下全局变量函数作用域等问题。


分界线:OVER


原文链接:使用js-xlsx库,前端读取Excel报表文件