1-js-xlsx 介绍
由SheetJS出品的js-xlsx是一款非常方便的只需要纯JS即可读取和导出excel的工具库,功能强大,支持格式众多,支持xls、xlsx、ods(一种OpenOffice专有表格文件格式)等十几种格式。本文全部都是以xlsx格式为例。
官方github:https://github.com/SheetJS/js-xlsx
1.2. 如何使用
dist目录下有很多个JS文件,一般情况下用xlsx.core.min.js就够了,xlsx.full.min.js则是包含了所有功能模块。直接script标签引入即可:
<script type="text/javascript" src="./js/xlsx.core.min.js"></script>
2读取excel
读取excel主要是通过XLSX.read(data, {type: type});方法来实现,返回一个叫WorkBook的对象,type主要取值如下
- base64: 以base64方式读取;
- binary: BinaryString格式(byte n is data.charCodeAt(n))
- string: UTF8编码的字符串;
- buffer: nodejs Buffer;
- array: Uint8Array,8位无符号数组;
- file: 文件的路径(仅nodejs下支持);
2.1.1. 读取本地文件
// 读取本地excel文件
let aForm = document.getElementsByClassName("input")[0]
aForm.onchange=function(event){
readWorkbookFromLocalFile(this.files[0],function(value){
console.log(value);
})
}
function readWorkbookFromLocalFile(file, callback) {
var reader = new FileReader();
reader.onload = function(e) {
var data = e.target.result;
var workbook = XLSX.read(data, {type: 'binary'});
if(callback) callback(workbook);
};
reader.readAsBinaryString(file);
}
2.1.2. 读取网络文件
// 从网络上读取某个excel文件,url必须同域,否则报错
function readWorkbookFromRemoteFile(url, callback) {
var xhr = new XMLHttpRequest();
xhr.open('get', url, true);
xhr.responseType = 'arraybuffer';
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();
}
Workbook Object
workbook里面有什么东西呢
SheetNames里面保存了所有的sheet名字,然后Sheets则保存了每个sheet的具体内容(我们称之为Sheet Object)。每一个sheet是通过类似A1这样的键值保存每个单元格的内容,我们称之为单元格对象(Cell Object)
2.2.4. 读取workbook
普通方法:
// 读取 excel文件
function outputWorkbook(workbook) {
var sheetNames = workbook.SheetNames; // 工作表名称集合
sheetNames.forEach(name => {
var worksheet = workbook.Sheets[name]; // 只能通过工作表名称来获取指定工作表
for(var key in worksheet) {
// v是读取单元格的原始值 得到数据
console.log(key, key[0] === '!' ? worksheet[key] : worksheet[key].v);
}
});
}
采用转csv方式输出结果的简单示例
// 处理数据
function readWorkbook(workbook){
let sheetNames = workbook.SheetNames; // 工作表名称集合
let worksheet = workbook.Sheets[sheetNames[0]]; // 这里我们只读取第一张sheet
let csv = XLSX.utils.sheet_to_csv(worksheet);
// 得到数据
csv2table(csv);
}
// 将csv转换对应格式
function csv2table(csv) {
let rows = csv.split('\n');
rows.pop(); // 最后一行没用的
let html="";
let ap="";
rows.forEach(function (row, idx) {
let columns = row.split(',');
columns.forEach(function (column,index) {
if(index){
html += '<p>' + column + '</p>';
newArr.push(column)
}else{
ap +='<p>' + column + '</p>';
newArr1.push(column)
}
});
});
aNickname.innerHTML=ap;
aNumber.innerHTML=html
}