在实际开发中,经常会遇到导入Excel文件的需求,有的产品人想法更多,想要在前端直接判断文件内容格式是否正确,必填项是否已填写

依据HTML5的FileReader,可以使用新的API打开本地文件(参考这篇文章

  • FileReader.readAsBinaryString(Blob|File)
  • FileReader.readAsText(Blob|File, opt_encoding)
  • FileReader.readAsDataURL(Blob|File)
  • FileReader.readAsArrayBuffer(Blob|File)

通过 readAsBinaryString 虽然能打开二进制文件(*.pdf、*.doc、*.xls等),但如若要直接通过JS进行判断这些二进制数据是否符合要求,是不行的

所以就需要转换,对于Excel文件的内容分析转换,已经有了比较成熟的解决方案:js-xlsx

其实现方式也用到了上述新特性,看看具体要怎么用

1. 首先定义一个文件上传项

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

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

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

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

使用XLSX.utils.sheet_to_json方法解析表格对象返回相应的JSON数据

    $('#excel-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]));
// break; // 如果只取第一张表,就取消注释这行
}
} console.log(persons);
}; // 以二进制方式打开文件
fileReader.readAsBinaryString(files[0]);
});

上述代码只是简单地获取表格文件的内容,如果要判断,还得根据实际加上一些判断逻辑

js-xlsx只能读取相关的文件,否则会报错

4. 表格文件内容

使用一个excel表格,定义了三张表

5. 查看获取到的数据

红框部分为三个表项的不同之处,看看代码执行之后的结果:

第一个红框是每张表的数据范围,由于js-xlsx这个库自身的问题,它是不会直接获取到表头数据保存起来的,而是直接把表头放到最末级的内容对象里面

可自行逐级看看读取到的表格workbook对象内容:

如果要判断表头的数量,就需要使用到!ref属性

在excel文件中,A1:D3中的字母指代列待号,紧接其后的数字指代行号,所以判断表头数量,即为判断列号数量

比如第一张表有四个表头,所以为A-D;第三张表有五个表头,所以为A-E,如

if (fromTo[0] === 'A' && fromTo[3] === 'D') {
excelIsOk = true;
}

这只是单单判断表头数量,还得判断表头内容

            console.log(persons);

                var headStr = '姓名,性别,年龄,学校';
for (var i = 0; i < persons.length; i++) {
if (Object.keys(persons[i]).join(',') !== headStr) {
persons.splice(i, 1);
}
} console.log(persons);

可以看到,倒数第二项的JSON数据,因为表头内容不匹配,被过滤掉了

这里还得注意的是最后一项,虽然有个表头,但因为没有内容,所以得到的JSON是符合要求的,所以就需要用到那个!ref属性来共同判断表格是否符合要求

6. 其他

除此之外,还有更多用法如XLSX.readFile、XLSX.writeFile等,具体就看看官方文档

前端读取Excel报表文件的更多相关文章

  1. 前端读取Excel报表文件 js-xlsx

    1.http://www.cnblogs.com/imwtr/p/6001480.html (前端读取Excel报表文件) 2.https://github.com/SheetJS/js-xlsx

  2. 使用js-xlsx库,前端读取Excel报表文件

    在实际开发中,经常会遇到导入Excel文件的需求,有的产品人想法更多,想要在前端直接判断文件内容格式是否正确,必填项是否已填写 依据HTML5的FileReader,可以使用新的API打开本地文件(参 ...

  3. python读取Excel表格文件

    python读取Excel表格文件,例如获取这个文件的数据 python读取Excel表格文件,需要如下步骤: 1.安装Excel读取数据的库-----xlrd 直接pip install xlrd安 ...

  4. java生成excel报表文件

    此次简单的操作将数据从数据库导出生成excel报表以及将excel数据导入数据库 首先建立数据库的连接池: package jdbc; import java.io.FileInputStream; ...

  5. pyhton读取 excel表格文件

    2019的第一天,忘记昨日之事,迎接新的明天. excel表格文件办公中常用,如通过Python操作这些数据需导入并有序读取这些数据 特随笔,供以后查阅 代码如下: import xlrd # fil ...

  6. python脚本 读取excel格式文件 并进行处理的方法

    一.安装xlrd模块 pip install xlrd 二.读取excel文件 try: excel_obj = xlrd.open_workbook("文件路径") except ...

  7. PHP读取Excel类文件

    想要使用PHP读取Excel文件必然要用到PHPExcel开源类库,网上资源应该挺多的.但是每一种的操作必然都是不同的,可原理应该都是大同小异. 这个文件夹里包含的就是PHPExcel类文件,在外面还 ...

  8. 结合Poi实现可读取Excel的文件选择对话框

    第一步:ApachePoi的jar包导全,不全会出现异常. 第二步:写就完事了:此例为读取特定模板的excel,仅供参考,根据实际需求改写. package 自建包; import java.awt. ...

  9. Java 读取excel表格文件

    注意,本文使用的Jar包为jxl.jar,只能处理97-03版本xls格式的Excel jar包 maven依赖: <dependency> <groupId>net.sour ...

随机推荐

  1. The easy way to implement a Red-Black tree

    Red-Black trees are notorious for being nightmares of pointer manipulation. Instructors will show th ...

  2. SQL Server 2016 CTP2.2 安装手记

    SQL Server 2016 CTP2.2 安装手记 下载一个iso文件,解压出来(大约2.8G左右),在该路径下双击Setup.exe即可开始安装. 安装之前请先安装.NET 3.5 SP1,在服 ...

  3. 【译】更快的方式实现PHP数组去重

    原文:Faster Alternative to PHP’s Array Unique Function 概述 使用PHP的array_unique()函数允许你传递一个数组,然后移除重复的值,返回一 ...

  4. Oracle:从SQL文件批量导入数据

    进入DOS界面. 进入SQL文件目录. 在命令提示下运行SqlPlus,c:\sql>sqlplus user_name/password@net_service_name 指定SQL执行日志文 ...

  5. com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK assets/com.xx.xx

    完整的Error 信息(关键部分) Error:Execution failed for task ':fanwe_o2o_47_mgxz_dingzhi:transformResourcesWith ...

  6. Java学习笔记(06)

    继承 super关键字 重写 final关键字 抽象类/abstract关键字 接口 一.继承 继承是类与类之间的继承,是一种is a 的关系(继承的满足条件) 继承的类叫子类 / 派生类,被继承的叫 ...

  7. KnockoutJS 3.X API 第七章 其他技术(2) 使用扩展器来增加可观察量(监控属性)

    Knockout observables提供了支持读取/写入值并在值改变时通知订阅者所需的基本功能. 但在某些情况下,您可能希望向可观察者添加其他功能. 这可能包括通过在可观察者前面放置一个可写的计算 ...

  8. 使用批处理设置JDK环境变量(Win7可用,新版本)

    欢迎探讨,如有错误敬请指正 如需转载,请注明出处http://www.cnblogs.com/nullzx/ 1. JDK环境的设置 一般情况下来说按照网上大多数的教程设置JDK的环境变量即可.但对于 ...

  9. gcc

    gcc编译源文件一步到位的命令就是 $ gcc demo.c -o demo 实际上这一步包含了四步: 1.预处理 $ gcc -E demo.c demo.i 预处理功能主要包括宏定义,文件包含,条 ...

  10. Service Plugin / Agent - 每天5分钟玩转 OpenStack(73)

    Core Plugin/Agent 负责管理核心实体:net, subnet 和 port.而对于更高级的网络服务,则由 Service Plugin/Agent 管理.Service Plugin ...