使用xlsx插件读取Excel表格数据为JSON数据

本文详细介绍了如何使用xlsx插件在Node.js后端和浏览器前端将Excel数据转换为JSON。首先在后端,通过xlsx库读取Excel文件,解析指定列并创建JSON对象。接着在前端,封装了一个读取Excel文件并转换的方法,利用FileReader API读取文件,然后使用xlsx库进行转换。最后展示了如何在主线程中接收并处理转换后的数据。
摘要由CSDN通过智能技术生成

使用xlsx插件读取Excel表格数据为JSON数据


一、使用步骤

1.引入库

// npm i xlsx
import xlsx from 'xlsx'

2.后端node使用


// file是Excel文件路径
const workbook = xlsx.readFile(file, { type: 'binary' })
const arr = xlsx.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]]);
const restul = []
for (const item of arr) {
    const userdata: any = item
    const keys = lodash.keys(userdata)
    const obj: any = {}
    for (const key of keys) {
      const value = userdata[key]
      switch (key) {
        case '姓名(必填)': {
          obj.name = String(value).trim()
          break
        }
        case 'ID(必填)': {
          obj.userId = String(value).trim()
          break
        }
        case '性别(必填)': {
          obj.sex = String(value).trim()
          break
        }
        case '编号(必填)': {
          obj.box_code = String(value).trim()
          break
        }
      }
    }
    restul.push(obj)
 }
// case 监听的值是表格中第一行的列名

3.前端使用

1.封装

//  封装为一个单独的文件,在项目中可以放在common文件夹下
import XLSX from "xlsx";
const fixdata = (data) => {
	var o = ''
	var l = 0
	var 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
}

const praseExecltoJson = (file) => {
	let promise = new Promise((resolve, reject) => {
		// 导入
		// FileReader共有4种读取方法:
		// 1.readAsArrayBuffer(file) :将文件读取为ArrayBuffer。
		// 2.readAsBinaryString(file) :将文件读取为二进制字符串
		// 3.readAsDataURL(file) :将文件读取为Data URL
		// 4.readAsText(file, [encoding]) :将文件读取为文本,encoding缺省值为'UTF-8'
		let wb // 读取完成的数据
		let rABS = false // 是否将文件读取为二进制字符串

        let reader = new FileReader()
		if (rABS) {
			reader.readAsArrayBuffer(file)
		} else {
			reader.readAsBinaryString(file)
		}
		let arr = []
		reader.onload = function (e) {
			let 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的数据
			arr = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]])
			// console.log(JSON.stringify(XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]])))
			// console.log(XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]))
			// return XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]])
			resolve(arr)
		}
		reader.onerror = function (e) {
			reject(arr)
		}
	})
	return promise
}

self.onmessage = function (evt) {
	let file = evt.data.file; //通过evt.data获得发送来的数据
	praseExecltoJson(file).then(res => {
		//将获取到的数据发送会主线程
        postMessage(res);
        self.close();
	})
}

2.调用

// 导入
import toJsonWorker from 'src/common/execlToJson.worker.js'


let worker = new toJsonWorker();
worker.postMessage({file: this.uploadfile});
worker.onmessage = (res)=>{
	let data = res.data;
	let importdata = this.formatData(data);
}

formatData(data) {
  if (!data) {
      return [];
  }
  let arr = [];
  for (let i = 0; i < data.length; i++) {
      let item = data[i];
      let obj = {};
      for (let key in item) {
          if (item.hasOwnProperty(key)) {
              let value = item[key];
              if (String(value).indexOf('例:') > -1) {
                  break;
              }
              switch (key) {
                  case '名称*': {
                      obj.name = String(value);
                      break;
                  }
              }
          }
      }
      if (!_.isEmpty(obj)) {
          arr.push(obj)
      }
  }
  return arr
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值