excel 树结构json_如何将Excel文件解析为json格式

本文介绍了如何使用js-xlsx库将Excel文件解析为JSON格式。通过阅读工作簿(workbook)和工作表(worksheet)的概念,展示了在网页和React应用中读取Excel文件的方法,包括使用FileReader的读取方法和处理数据转换的代码示例。特别指出,由于js-xlsx遵循CommonJS规范,所以需使用require引入,并注意在浏览器和Node.js环境中的不同读取方式。
摘要由CSDN通过智能技术生成

最近工作中遇到一个需求,大致需求就是将Excel文件在导入时解析为json格式转换数据结构再传输给后台。这方面的库比较少,比较主流的是js-xlsx,官网地址为sheetjs官网,但是文档都写得不太清楚,坑也比较多,这里我做一个简单的介绍与运用与避坑指南。

先介绍几个基本概念:workbook 对象,指的是整份 Excel 文档。我们在使用 js-xlsx 读取 Excel 文档之后就会获得 workbook 对象。

worksheet 对象,指的是 Excel 文档中的表。我们知道一份 Excel 文档中可以包含很多张表,而每张表对应的就是 worksheet 对象。

废话不多说直接上这里演示下网页中使用

/*FileReader共有4种读取方法:1.readAsArrayBuffer(file):将文件读取为ArrayBuffer。2.readAsBinaryString(file):将文件读取为二进制字符串3.readAsDataURL(file):将文件读取为Data URL4.readAsText(file, [encoding]):将文件读取为文本,encoding缺省值为'UTF-8'*/

var wb;//读取完成的数据 var rABS = true; //是否将文件读取为二进制字符串 function importf(obj) {//导入 if(!obj.files) {

return;

}

var f = obj.files[0];

console.log(f);

var reader = new FileReader();

reader.onload = function(e) {

var data = e.target.result;

if(rABS) {

wb = XLSX.read(btoa(fixdata(data)), {//手动转化 type: 'base64'

});

} else {

wb = XLSX.read(data, {

type: 'binary'

});

}

//wb.SheetNames[0]是获取Sheets中第一个Sheet的名字 //wb.Sheets[Sheet名]获取第一个Sheet的数据 console.log(JSON.stringify(XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]])));

};

if(rABS) {

reader.readAsArrayBuffer(f);

} else {

reader.readAsBinaryString(f);

}

}

function fixdata(data) { //文件流转BinaryString var o = "",

l = 0,

w = 10240;

for(; l < data.byteLength / w; ++l)

o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w)));

o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w)));

return o;

}

var rABS = true; // true: readAsBinaryString ; false: readAsArrayBuffer function handleFile(e) {

var files = e.target.files, f = files[0];

var reader = new FileReader();

reader.onload = function(e) {

var data = e.target.result;

if(!rABS) data = new Uint8Array(data);

var workbook = XLSX.read(data, {type: rABS ? 'binary' : 'array'});

};

if(rABS) reader.readAsBinaryString(f);

else reader.readAsArrayBuffer(f);

}

input_dom_element.addEventListener('change', handleFile, false);

这里演示下在react+antd组合下使用

import { Button, Icon } from 'antd';

const XLSX = require('XLSX');//必须使用CommonJs规范引入,如果使用import引入则找不到read 方法

style={{display: 'none'}}

ref={(input) => { input ? this.file_input = input : null; }}

onChange={this.handle_file_change}

/>

导入三级

handle_click_send_file = () => {

this.file_input.click();

}

handle_file_change = () => {

this.asyncReaderFile(this.file_input, XLSX).then((res) => {

console.log(res); //在回调函数中输出结果

});

}

asyncReaderFile = (event, XLSX) => {

const files = event.files || [];

const file = files[0]; //获取第一个Blob对象

return new Promise((resolve, reject) => {

const reader = new FileReader();

reader.readAsBinaryString(file); //readAsBinaryString(file):将文件读取为二进制字符串

reader.onload = function(e) {

const data = e.target.result;

//XLSX.read获得 workbook对象,指的是整份Excel文档,并将其解析为二进制字符串

const wb = XLSX.read(data, {

type: 'binary',

});

//wb.SheetNames[0]是获取第一个表名

//wb.Sheets[表名]获取第一个表的数据

//XLSX.utils.sheet_to_json生成一个对象数组,JSON.stringify解析为json对象

const json = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]);

//这里将解析出的json数据转换下格式

const resData = json.map((obj) => {

let words = '';

for (const i in obj) {

words += obj[i] + '/';

}

return words;

});

resolve(resData);

};

});

};

这里主要的一个坑就是不能使用inport 引用!因为这个库很早之前就做出来了,用的是CommonJs规范,因此不能用import方式引用;另一个需要注意的点是在浏览器中需要使用read方式解析出workbook对象,在Node环境中则需要使用readFile解析出workbook对象。

还有很多其他用法,具体的详情可以看下文档npm-xlsx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值