vue实现导入表格数据纯前端实现

Posted 水香木鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue实现导入表格数据纯前端实现相关的知识,希望对你有一定的参考价值。

一、文章引导

vue实现导入表格数据-纯前端实现 5-按钮样式区域 4-业务区域 3-展示区域 2-局部导入xlsx 1-安装xlsx

二、博主简介

🌏博客首页: 水香木鱼
📌专栏收录:后台管理系统
📑文章摘要:纯前端实现  vue  xlsx依赖  javascript  
💌木鱼寄语:故木秀于林,风必摧之;堆出于岸,流必湍之;行高于人,众必非之。

三、文章内容

程序的小伙伴们,大家好!木鱼本期为大家带来的是【纯前端实现导入表格功能】,直奔主题 👇 如下 业务代码相关注释,已标注。请移步代码内容区域

①、安装xlsx

需要安装0.15.6 版本的xlsx,否则会出现错误!

npm install xlsx@0.15.6

②、局部导入xlsx

import xlsx from "xlsx"; 

③、展示区域

<template>
  <div>
      <!-- 导入按钮 -->
      <div class="button_group dateBoxTxt">
        <a
          href="javascript:;"
          class="button_s my_file el-button button_s el-button--primary el-button--small"
        >
          <input
            type="file"
            class="my_input"
            @change="importExcel"
            id="upload"
          />导入货运系统实际运量数据
        </a>
      </div>
      <!-- 渲染内容 -->
      <el-table
        :data="dataArr"
        style="width: 95%; margin: 0 auto; margin-top: 5px"
        max-height="100%"
        border
      >
        <el-table-column
          :prop="item.prop"
          :label="item.label"
          v-for="(item, i) in tableColumn"
          :key="i"
        >
        </el-table-column>
      </el-table>
  </div>
</template>

④、业务区域

<script>
import xlsx from "xlsx"; //导入表格
export default 
  data() 
    return 
      /*--上传表格配置----*/
      dataArr: [], // 表格内容数据数组
      countArr: , // 分析表格数据以及表头,得到一个对照数组,用来进行自定义合并,本文暂时只写基础,不介绍自动合并单元格了哟~~我的其他文章有写自定义合并实现方法~
      tableColumn: [], // 表格表头配置数组
      tableLoading: false, // 表格是否loading
    ;
  ,
  methods: 
    // 设置表格渲染合并单元格,本文暂时只写基础,不介绍自动合并单元格了哟~~我的其他文章有写自定义合并实现方法~
    objectSpanMethod( row, column, rowIndex, columnIndex ) 
      if (columnIndex < 5) 
        // 举例只自动合并前4列
        if (this.countArr[column.property]) 
          let colNum = this.countArr[column.property][rowIndex];
          return 
            rowspan: colNum,
            colspan: 1,
          ;
        
      
    ,
    // 获取表格表头
    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);
      
      return headers;
    ,
    setTable(headers, excellist) 
      const tableTitleData = []; // 存储表格表头数据
      const tableMapTitle = ; // 设置表格内容中英文对照用
      headers.forEach((_, i) => 
        tableMapTitle[_] = "prop" + i;
        tableTitleData.push(
          prop: "prop" + i,
          label: _,
          width: 100,
        );
      );
      console.log("tableTitleData", tableTitleData);
      // 映射表格内容属性名为英文
      const newTableData = [];
      excellist.forEach((_) => 
        const newObj = ;
        Object.keys(_).forEach((key) => 
          newObj[tableMapTitle[key]] = _[key];
        );
        newTableData.push(newObj);
      );
      console.log("newTableData", newTableData);
      this.tableColumn = tableTitleData;
      this.dataArr = newTableData;
    ,
    // 导入表格
    importExcel(e) 
      const files = e.target.files;
      console.log(files);
      if (!files.length) 
        return;
       else if (!/\\.(xls|xlsx)$/.test(files[0].name.toLowerCase())) 
        return alert("上传格式不正确,请上传xls或者xlsx格式");
      
      const fileReader = new FileReader();
      fileReader.onload = (ev) => 
        try 
          const data = ev.target.result;
          const XLSX = xlsx;
          const workbook = XLSX.read(data, 
            type: "binary",
          );
          const wsname = workbook.SheetNames[0]; //取第一张表,wb.SheetNames[0]是获取Sheets中第一个Sheet的名字
          const ws = XLSX.utils.sheet_to_json(workbook.Sheets[wsname]); //生成json表格内容,wb.Sheets[Sheet名]获取第一个Sheet的数据
          const excellist = []; //清空接收数据
          //编辑数据
          for (var i = 0; i < ws.length; i++) 
            excellist.push(ws[i]);
          
          console.log("读取结果", excellist); // 此时得到的是一个内容是对象的数组需要处理
          // 获取表头1-1
          const a = workbook.Sheets[workbook.SheetNames[0]];
          const headers = this.getHeader(a);
          console.log("headers", headers);
          // 获取表头1-2
          // 渲染表格1-1
          this.setTable(headers, excellist);
          // 渲染表格1-2
         catch (e) 
          return alert("读取失败!");
        
      ;
      fileReader.readAsBinaryString(files[0]);
      var input = document.getElementById("upload");
      input.value = "";
    ,
  ,
;
</script>

⑤、按钮样式区域

<style lang="less" scoped>
// 按钮样式
.button_group 
  .button_s 
    width: 180px;
    margin: 5px 10px 5px 5px;
  
  .button_m 
    width: 180px;
    margin: 5px 10px 5px 5px;
  
  .my_file 
    position: relative;
    .my_input 
      position: absolute;
      opacity: 0;
      width: 180px;
      height: 30px;
      top: 0;
      left: 0;
    
  

</style>

四、精彩推荐

💡vue时间格式处理(YYYY-MM-DD HH:mm:ss)moment.js,神器你知道吗?
💡vue后台管理做适配的最佳方案,你知道吗
💡前端引入阿里图标库的最便捷方式
💡前端实现div标签p标签等吸顶效果【Vue+原生JS组合写法】
💡vue如何通过url携带token,并且打开新页面


本篇博客文章模板唯一版权归属©水香木鱼

以上是关于vue实现导入表格数据纯前端实现的主要内容,如果未能解决你的问题,请参考以下文章

vue实现导入表格数据纯前端实现

个人技术总结

vue实现按钮弹框弹出图片视频表格表单等

在vue中,实现纯前端读取和展示excel文件

如何实现SpreadJS的纯前端Excel导入导出

表格集算表高性能原理——怎样实现纯前端百万行数据秒级响应