vue 前端读取Excel文件并解析

前端读取Excel文件并解析

    • 前端如何解释Excel呢

平时项目中对于Excel的导入解析是很常见的功能,一般都是放在后端执行;但是也有特殊的情况,偶尔也有要求说前端执行解析,判空,校验等,最后组装成后端接口想要的数据结构。

前端如何解释Excel呢

因为我使用插件执行的 you know

  • 安装插件
npm install xlsx@0.14.1   // 0.14.1 是我使用的版本
  • 还有个nanoid
npm i nanoid 

此处我没有使用安装的这个 而是使用 自定的代码如下:

// index.js
const createId =  () => {return (Number(Math.random().toString().substr(2, 7) + Date.now()).toString(36) +Date.now())
}
export {createId as default,createId
}
  • 安装已经完成了 当然 依然 you know
import XLSX from 'xlsx'
import nanoid from 'xxxx/xxx/index'
  • 报一丝 差点忘记了 template
<el-upload class="upload" action="" :auto-upload="false" :show-file-list="false" :multiple="false" :on-change="(file, fileList) => importTemp(file, fileList)"><el-button v-permission="'are you ok'" type="primary" size="small" plain class="flex" >you know the name of the custom button</el-button></el-upload>
  • finally
methods: {importTemp(file, fileList) {const fileReader = new FileReader()fileReader.onload = ev => {try {const data = ev.target.resultconst workbook = XLSX.read(data, {type: 'binary'})const sheet = Object.keys(workbook.Sheets)[1] // 我是用的是第二个const json = XLSX.utils.sheet_to_json(workbook.Sheets[sheet]) // const worksheet = workbook.Sheets[sheet]const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 })if (!jsonData.length) returnconst headers = jsonData[0]if (!headers.length) returnconst colorParam = headers.find(i => /xxx/.test(i))const transtypeParam = headers.find(i => /xxx/.test(i))const operationTypeParam = headers.find(i => /xxx/.test(i))const systemCodeParam = headers.find(i => /xxx/.test(i))const platCodeParam = headers.find(i => /xxx/.test(i))const truckingBillNoParam = headers.find(i => /xxx/.test(i))const delivyPlanTypeParam = headers.find(i => /xxx/.test(i))const targetObj = {}const nameMap = { // 定义必填的字段systemCode: systemCodeParam,platCode: platCodeParam,operationType: operationTypeParam,truckingBillNo: truckingBillNoParam,transType: transtypeParam,vehicleNumber: '车牌号',carColor: colorParam,driverName: '司机姓名',idcard: '司机身份证号',driverPhone: '司机手机号',clientCompanyCode: 'xxx',clientCompanyName: 'xxx名称',// messageBatchNo: 'xxx批次号',// detailsCounts: '明细条数',billId: 'xxx',billDependId: 'xxx',factoryBillId: 'xxx',delivyPlanType: delivyPlanTypeParam}for (let [idx, el] of json.entries()) {let tempObj = {}for (const key of Object.keys(nameMap)) {const value = el[nameMap[key]]if (!value && value !== 0) {this.$message.warning(`第${idx + 2}行,字段: ${nameMap[key]} 为必填值`)return}tempObj[key] = value}tempObj = {...tempObj,queueId: el['车辆排队号']}if (targetObj[tempObj.truckingBillNo]) {targetObj[tempObj.truckingBillNo].push(tempObj)} else {targetObj[tempObj.truckingBillNo] = [tempObj]}}const targetList = Object.keys(targetObj).map((key, i) => {const mainitem = targetObj[key][0]const target = {}Object.keys(mainitem).map(key => {if (!['qqq', 'xxxx', 'ssss', 'wwww'].includes(key)) {const val = (mainitem[key] + '').replace(/\s/gi, '')target[key] = ['null', 'undefined'].includes(val) ? '' : val // 判空下}})target.details = targetObj[key].map(item => {return {billId: item.qqq,billDependId: item.xxxx,factoryBillId: item.ssss,delivyPlanType: item.wwww}})target.detailsCounts = target.details.lengthtarget.messageBatchNo = nanoid() + ireturn target})// 后台请求接口import({ // 你自己的哦importDataList: targetList}).then(res => {const { msg, status } = resif (status) {this.$message.success('发送成功')} else {this.$message.error(msg ?? '操作失败')}})} catch (e) {console.log(e, 'error')}}fileReader.readAsBinaryString(file.raw)}
}
  • catch
    我的附件类型
    双人行也有我师焉:哎呦不错哦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/660581.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ECHARTS学习

坐标轴 option {xAxis: {type: category,data: [A, B, C]},yAxis: {type: value},series: [{data: [120, 200, 150],type: line}] }; 1、坐标轴的默认类型type是数值型&#xff0c;而xAxis指定了类目型的data&#xff0c;所以Echarts也能识别出这是类目型的坐标轴&#xff0c;…

Spring Boot的热部署工具“AND”Swagger测试工具

Spring Boot的热部署&Swagger测试页面的使用 热部署指的是在项目无需重启的情况下&#xff0c;只需要刷新页面&#xff0c;即可获得已经修改的样式或功能。要注意该工具一般用于开发环境&#xff0c;在生产环境中最好不要添加这个工具。 对于无需重启便可刷新这么方便的工…

net lambda 、 匿名函数 以及集合(实现IEnumerable的 如数组 、list等)

匿名函数&#xff1a;》》》 Action a1 delegate(int i) { Console.WriteLine(i); }; Lambda:>>> Aciont a1 (int i) > { Console.WriteLine(i); }; 可以简写 &#xff08;编译器会自动根据委托类型 推断&#xff09; Action a1 &#xff08;i&#xff09;> {…

Scala 多版本下载指南

Scala&#xff0c;这一功能丰富的编程语言&#xff0c;结合了面向对象和函数式编程的精华&#xff0c;为开发者提供了强大的工具来构建高效、可扩展的应用程序。随着Scala社区的不断壮大和技术的演进&#xff0c;多个版本的Scala被广泛应用于不同的项目与场景中。本文旨在为您提…

WSL2如何部署 Xinference

环境&#xff1a; WSL2 Ubuntu22.04 问题描述&#xff1a; WSL2如何部署 Xinference Xinference是一个用于加速和优化深度学习推理的平台。它提供了高性能、低延迟的推理解决方案&#xff0c;帮助开发者在生产环境中更高效地部署他们的深度学习模型。Xinference支持多种硬…

AQS共享模式之CyclicBarrier

概念&#xff1a;CyclicBarrier翻译为循环(屏障/栅栏)&#xff0c;当一组线程到达一个屏障&#xff08;同步点&#xff09;时被阻塞&#xff0c;直到最后一个线程到达屏障时&#xff0c;屏障才会打开&#xff0c;所有被屏障拦截的线程才会继续工作。 设计目的&#xff1a;和Co…

VTK —— 二、教程五 - 通过鼠标事件与渲染交互(附完整源码)

代码效果 本代码编译运行均在如下链接文章生成的库执行成功&#xff0c;若无VTK库则请先参考如下链接编译vtk源码&#xff1a; VTK —— 一、Windows10下编译VTK源码&#xff0c;并用Vs2017代码测试&#xff08;附编译流程、附编译好的库、vtk测试源码&#xff09; 教程描述 本…

从Paint 3D入门glTF

Paint 3D Microsoft Paint 3D是微软的一款图像编辑软件&#xff0c;它是传统的Microsoft Paint程序的升级版。 这个新版本的Paint专注于三维设计和创作&#xff0c;使用户可以使用简单的工具创建和编辑三维模型。 Microsoft Paint 3D具有直观的界面和易于使用的工具&#xff0…

[游戏陪玩系统] 陪玩软件APP小程序H5游戏陪玩成品软件源码-线上线下可爆改家政,整理师等功能

简介 随着电竞行业的快速发展&#xff0c;电竞陪玩APP正在逐渐成为用户在休闲娱乐时的首选。为了吸引用户和提高用户体验&#xff0c;电竞陪玩APP开发需要定制一些特色功能&#xff0c;并通过合适的盈利模式来获得收益。本文将为您介绍电竞陪玩APP开发需要定制的特色功能以及常…

微信小程序实现九宫格

微信小程序使用样式实现九宫格布局 使用微信小程序实现九宫格样式&#xff0c;可以直接使用样式进行编写&#xff0c;具体图片如下&#xff1a;1、js代码&#xff1a; Page({/*** 页面的初始数据*/data: {current: 4},// 监听activeClick(e) {let index e.currentTarget.dat…

为什么公共事业机构会偏爱 TiDB :TiDB 数据库在某省妇幼健康管理系统的应用

本文介绍了某省妇幼健康管理系统的建设和数据库架构优化的过程。原有的数据库架构使用了 StarRocks 作为分析层&#xff0c;但随着业务的发展&#xff0c;这套架构暴露出诸多痛点&#xff0c;不再适应妇幼业务的需求。为解决这些问题&#xff0c;该系统选择了将原有架构中的 St…

Cesium 3dTileset 支持 uv 和 纹理贴图

原理: 使用自定义shader实现uv自动计算 贴图效果: uv效果: