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


    引入插件 

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

    上传文件方法

    1. // 上传文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用
    2. async handle(ev) {
    3. //改变表格key
    4. this.$refs.cpkTable.loading = true;
    5. this.$refs.cpkLine.myChart.showLoading({
    6. text: "加载中...",
    7. color: "#1890ff",
    8. textColor: "#1890ff",
    9. showSpinner: false,
    10. maskColor: "rgba(255, 255, 255, 0.7)",});
    11. this.tableKey = true;
    12. this.file = ev.raw;
    13. this.excelName = this.file.name;
    14. //截取表格文件名
    15. this.excelName = this.excelName.substring(
    16. 0,
    17. this.excelName.lastIndexOf(".")
    18. );
    19. console.log("上传的未解析源文件", this.file);
    20. if (!this.file) {
    21. console.log("文件打开失败");
    22. return;
    23. } else {
    24. //<!-- 用来解析表头的代码-->
    25. // let data = await this.readFile(file);
    26. // let workbook = XLSX.read(data, { type: "binary" }); //解析二进制格式数据
    27. // console.log("二进制数据的解析:", workbook);
    28. // let worksheet = workbook.Sheets[workbook.SheetNames[0]]; //获取第一个Sheet
    29. // // 调用解析表头方法
    30. // this.getHeader(worksheet);
    31. // let result = XLSX.utils.sheet_to_json(worksheet); //转换为json数据格式
    32. // console.log("最终解析的 json 格式数据:", result);
    33. // this.tableData = result;
    34. // // 调用处理表头函数
    35. // this.setTable();
    36. //<!-- 用来解析表头的代码-->
    37. // 读取 Excel 文件
    38. //<!-- 不需要解析表头的代码-->
    39. const file = this.file;
    40. const reader = new FileReader();
    41. const that = this
    42. reader.onload = function(e) {
    43. const data = new Uint8Array(e.target.result);
    44. const workbook = read(data, { type: 'array' });
    45. const sheetName = workbook.SheetNames[0];
    46. const worksheet = workbook.Sheets[sheetName];
    47. const jsonData = utils.sheet_to_json(worksheet, { header: 1, raw: false, defval: '' });
    48. // const worksheet = workbook.Sheets[workbook.SheetNames[0]];
    49. // const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
    50. that.tableData = jsonData
    51. that.lineData = jsonData
    52. // 在这里处理读取到的数据
    53. };
    54. reader.readAsArrayBuffer(file);
    55. that.fileOpen = false
    56. that.$refs.cpkLine.lineData = this.tableData;
    57. that.LSL = this.form.lsl
    58. that.MBZ = this.form.targetValue
    59. that.USL = this.form.usl
    60. setTimeout(()=>{
    61. that.$message.success(this.excelName+'导入成功')
    62. that.$refs.upload.clearFiles();
    63. that.$refs.cpkTable.loading = false;
    64. that.$refs.cpkLine.myChart.hideLoading();
    65. },800)
    66. // that.tableLength = that.tableData.length
    67. // this.setTable()
    68. //<!-- 不需要解析表头的代码-->
    69. }
    70. },

    解析获取到表头的数据

    1. getHeader(sheet) {
    2. // const XLSX = XLSX;
    3. const headers = [];
    4. const range = XLSX.utils.decode_range(sheet["!ref"]); // worksheet['!ref'] 是工作表的有效范围
    5. let C;
    6. /* 获取单元格值 start in the first row */
    7. const R = range.s.r; //// C 列
    8. let i = 0;
    9. for (C = range.s.c; C <= range.e.c; ++C) {
    10. var cell =
    11. sheet[
    12. XLSX.utils.encode_cell({ c: C, r: R })
    13. ]; /* 根据地址得到单元格的值find the cell in the first row */
    14. var hdr = "UNKNOWN" + C; // 如果有空表头,会替换为您想要的默认值replace with your desired default
    15. // XLSX.utils.format_cell 生成单元格文本值
    16. if (cell && cell.t) hdr = XLSX.utils.format_cell(cell);
    17. if (hdr.indexOf("UNKNOWN") > -1) {
    18. if (!i) {
    19. hdr = "__EMPTY";
    20. } else {
    21. hdr = "__EMPTY_" + i;
    22. }
    23. i++;
    24. }
    25. headers.push(hdr);
    26. }
    27. // 保存至data
    28. this.excelHeader = headers;
    29. return headers;
    30. },

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

    1. // 设置表格中英文映射
    2. setTable() {
    3. const headers = this.excelHeader;
    4. const excellist = this.tableData;
    5. const tableTitleData = []; // 存储表格表头数据
    6. const tableMapTitle = {}; // 设置表格内容中英文对照用
    7. headers.forEach((_, i) => {
    8. tableMapTitle[_] = "cord" + i;
    9. tableTitleData.push({
    10. prop: "cord" + i,
    11. label: _,
    12. width: 100,
    13. });
    14. });
    15. console.log("表格头标题:", tableTitleData);
    16. // 映射表格内容属性名为英文
    17. const newTableData = [];
    18. excellist.forEach((_) => {
    19. const newObj = {};
    20. Object.keys(_).forEach((key) => {
    21. newObj[tableMapTitle[key]] = _[key];
    22. });
    23. newTableData.push(newObj);
    24. });
    25. this.tableColumn = tableTitleData;
    26. this.tableData = newTableData;
    27. },

  • 相关阅读:
    Kafka3.0.0版本——消费者(独立消费者消费某一个主题中某个分区数据案例__订阅分区)
    明远智睿IMX6Q烧写Ubuntu18系统,此方法同样适合其它系统!
    [学习笔记]使用Docker+Jenkin自动化流水线发布.Net应用
    FPGA 学习笔记:Vivado 2019.1 工程创建
    VulnHub | Web_Machine-N7
    【leetcode常见面试题】1. 两数之和
    Design Compiler工具学习笔记(3)
    国际化配置(ant-design-vue设置成中文)
    leetcode 剑指 Offer 10- I. 斐波那契数列
    Greenplum学习笔记——第二部分:集群部署
  • 原文地址:https://blog.csdn.net/huichao199175/article/details/134187063