当前位置: 首页 > news >正文

Vue+elementui 纯前端实现Excel导入导出功能(区分表头标题)

引入插件 

import * as XLSX from "xlsx/xlsx.mjs";
import { read, utils } from 'xlsx/xlsx.mjs';

上传文件方法

 // 上传文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用async handle(ev) {//改变表格key值this.$refs.cpkTable.loading = true;this.$refs.cpkLine.myChart.showLoading({text: "加载中...",color: "#1890ff",textColor: "#1890ff",showSpinner: false,maskColor: "rgba(255, 255, 255, 0.7)",});this.tableKey = true;this.file = ev.raw;this.excelName = this.file.name;//截取表格文件名this.excelName = this.excelName.substring(0,this.excelName.lastIndexOf("."));console.log("上传的未解析源文件", this.file);if (!this.file) {console.log("文件打开失败");return;} else {//<!-- 用来解析表头的代码-->// let data = await this.readFile(file);// let workbook = XLSX.read(data, { type: "binary" }); //解析二进制格式数据// console.log("二进制数据的解析:", workbook);// let worksheet = workbook.Sheets[workbook.SheetNames[0]]; //获取第一个Sheet// // 调用解析表头方法// this.getHeader(worksheet);// let result = XLSX.utils.sheet_to_json(worksheet); //转换为json数据格式// console.log("最终解析的 json 格式数据:", result);// this.tableData = result;// // 调用处理表头函数// this.setTable();//<!-- 用来解析表头的代码-->// 读取 Excel 文件//<!-- 不需要解析表头的代码-->const file = this.file;const reader = new FileReader();const that = thisreader.onload = function(e) {const data = new Uint8Array(e.target.result);const workbook = read(data, { type: 'array' });const sheetName = workbook.SheetNames[0];const worksheet = workbook.Sheets[sheetName];const jsonData = utils.sheet_to_json(worksheet, { header: 1, raw: false, defval: '' });// const worksheet = workbook.Sheets[workbook.SheetNames[0]];// const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });that.tableData = jsonDatathat.lineData = jsonData// 在这里处理读取到的数据};reader.readAsArrayBuffer(file);that.fileOpen = falsethat.$refs.cpkLine.lineData = this.tableData;that.LSL = this.form.lslthat.MBZ = this.form.targetValuethat.USL = this.form.uslsetTimeout(()=>{that.$message.success(this.excelName+'导入成功')that.$refs.upload.clearFiles();that.$refs.cpkTable.loading = false;that.$refs.cpkLine.myChart.hideLoading();},800)// that.tableLength = that.tableData.length// this.setTable()//<!-- 不需要解析表头的代码-->}},

解析获取到表头的数据

getHeader(sheet) {// const XLSX = XLSX;const headers = [];const range = XLSX.utils.decode_range(sheet["!ref"]); // worksheet['!ref'] 是工作表的有效范围let C;/* 获取单元格值 start in the first row */const R = range.s.r; // 行 // C 列let i = 0;for (C = range.s.c; C <= range.e.c; ++C) {var cell =sheet[XLSX.utils.encode_cell({ c: C, r: R })]; /* 根据地址得到单元格的值find the cell in the first row */var hdr = "UNKNOWN" + C; // 如果有空表头,会替换为您想要的默认值replace with your desired default// XLSX.utils.format_cell 生成单元格文本值if (cell && cell.t) hdr = XLSX.utils.format_cell(cell);if (hdr.indexOf("UNKNOWN") > -1) {if (!i) {hdr = "__EMPTY";} else {hdr = "__EMPTY_" + i;}i++;}headers.push(hdr);}// 保存至data中this.excelHeader = headers;return headers;},

设置中英文映射 就是字段对应

    // 设置表格中英文映射setTable() {const headers = this.excelHeader;const excellist = this.tableData;const tableTitleData = []; // 存储表格表头数据const tableMapTitle = {}; // 设置表格内容中英文对照用headers.forEach((_, i) => {tableMapTitle[_] = "cord" + i;tableTitleData.push({prop: "cord" + i,label: _,width: 100,});});console.log("表格头标题:", tableTitleData);// 映射表格内容属性名为英文const newTableData = [];excellist.forEach((_) => {const newObj = {};Object.keys(_).forEach((key) => {newObj[tableMapTitle[key]] = _[key];});newTableData.push(newObj);});this.tableColumn = tableTitleData;this.tableData = newTableData;},

相关文章:

  • 费解的开关
  • CentOS和Ubuntu命令行方式配置静态IP
  • 企业上ERP的节奏商讨
  • 新手必看的Facebook广告投放基础思路
  • 贝锐向日葵亮相阿里云“云栖大会”:独创专利算法赋能全新云桌面
  • J2EE项目部署与发布(Linux版本)->jdktomcat安装,MySQL安装,后端接口部署,linux单体项目前端部署
  • 【考研数学】概率论与数理统计 —— 第八章 | 假设检验
  • 链表的介绍
  • Restful风格与Wesocket之间的关联
  • IT技术发展背景下的就业趋势:哪个领域最受欢迎?
  • 【vue3】样式穿透、完整新特性、动态css、css-module
  • 多输入多输出 | Matlab实现k-means-ELM(k均值聚类结合极限学习机)多输入多输出组合预测
  • JavaScript中BOM与DOM
  • SAR 系统基本原理
  • 万物皆可“云” 从杭州云栖大会看数智生活的未来
  • 【mysql】环境安装、服务启动、密码设置
  • 【附node操作实例】redis简明入门系列—字符串类型
  • Angular2开发踩坑系列-生产环境编译
  • css布局,左右固定中间自适应实现
  • Cumulo 的 ClojureScript 模块已经成型
  • es6(二):字符串的扩展
  • FineReport中如何实现自动滚屏效果
  • Git的一些常用操作
  • Idea+maven+scala构建包并在spark on yarn 运行
  • js算法-归并排序(merge_sort)
  • Linux中的硬链接与软链接
  • Making An Indicator With Pure CSS
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • Python3爬取英雄联盟英雄皮肤大图
  • react-native 安卓真机环境搭建
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Spring Boot MyBatis配置多种数据库
  • spring-boot List转Page
  • 分布式熔断降级平台aegis
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 计算机在识别图像时“看到”了什么?
  • 悄悄地说一个bug
  • 人脸识别最新开发经验demo
  • 如何用vue打造一个移动端音乐播放器
  • 深度学习在携程攻略社区的应用
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 数据仓库的几种建模方法
  • 通过几道题目学习二叉搜索树
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • # Apache SeaTunnel 究竟是什么?
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (2.2w字)前端单元测试之Jest详解篇
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (备忘)Java Map 遍历
  • (一)80c52学习之旅-起始篇
  • (原創) 物件導向與老子思想 (OO)
  • (转)linux 命令大全
  • **PHP分步表单提交思路(分页表单提交)