vue实现excel文件的导入和读取完整步骤

 更新时间:2023年10月13日 15:46:32   作者:bu_xiang_tutou  
Vue的数据绑定功能非常强大,很适合用来读取Excel内容,这篇文章主要给大家介绍了关于vue实现excel文件的导入和读取的相关资料,文中通过代码示例介绍的非常详细,需要的朋友可以参考下

1.效果展示

上传数据前

 上传数据后

或者

2.下载

npm install xlsx@0.17.0

如果一直报关于xlsx的read的错误,这里是因为xlsx的0.18.0版本已经没有read属性了,所以最好是使用0.18.0版本以下的xlsx。

3. js文件

excel.js

import { stringify } from "json5";
// 按照二进制读取文件
export function readFile(file) {
  return new Promise((resolve) => {
    let reader = new FileReader();
    reader.readAsBinaryString(file);
    reader.onload = (e) => {
      resolve(e.target.result);
    };
  });
}
// 字段对应表
export let character = {
  staffName: {
    text: "员工姓名",
    type: "string",
  },
  sex: {
    text: "性别",
    type: "string",
  },
  idNumber: {
    text: "身份证号",
    type: "string",
  },
  staffEmail: {
    text: "员工邮箱",
    type: "string",
  },
  phone: {
    text: "电话号码",
    type: "string",
  },
  jobPreference: {
    text: "工作偏好",
    type: "string",
  },
  timePreference: {
    text: "时间偏好",
    type: "string",
  },
  datePreference: {
    text: "时间段偏好",
    type: "string",
  }
};
// 时间字符串格式化
export function formatTime(str, tpl) {
  let arr = str.match(/\d+/g).map((item) => {
    return item.length < 2 ? "0" + item : item;
  });
  tpl = tpl || "{0}年{1}月{2}日 {3}时{4}分{5}秒";
  return tpl.replace(/\{(\d+)\}/g, (_, group) => {
    return arr[group] || "00";
  });
}

utils.js 实现加载

// 设置异步延迟间隔
export function delay(interval = 0) {
    return new Promise((resolve) => {
      let timer = setTimeout((_) => {
        clearTimeout(timer);                                                                                                          
        resolve();
      }, interval);
    });
  }

4 .界面处理

<template>
  <el-upload
    ref="upload"
    class="upload-demo"
    action
    accept=".xlsx,.xls"
    :show-file-list="false"
    :on-exceed="handleExceed"
    :auto-upload="false"
    :on-change="handle"
  >
    <template #trigger>
      <el-button type="primary">选择文件</el-button>
    </template>
  </el-upload>
  <el-table :data="employeeData" border style="width: 100%">
    <el-table-column prop="staffName" label="姓名" width="100px" />
    <el-table-column prop="sex" label="性别" width="80px" />
    <el-table-column prop="idNumber" label="身份证号" width="200px" />
    <el-table-column prop="phone" label="电话号码" width="150px" />
    <el-table-column prop="staffEmail" label="邮箱" width="200px" />
    <el-table-column prop="jobPreference" label="工作偏好" />
    <el-table-column prop="timePreference" label="时间偏好" />
    <el-table-column prop="datePreference" label="时间段偏好" />
    <el-table-column label="操作">
        <el-button>编辑</el-button>
        <el-button type="danger">删除</el-button>
    </el-table-column>
  </el-table>
</template>
<script>
//excel文件的处理
import { character, readFile } from "@/assets/js/excel";
//异步消息处理
import { delay } from "@/assets/js/utils";
//excel文件数据解析
import XLSX from "xlsx";
import { ElLoading } from 'element-plus'
export default {
  data() {
    return {
      employeeData: [],
    };
  },
  component: {},
  created() {
  },
  methods: {
    //采集excel数据
    async handle(ev) {
      //这个是上传的文件
      let file = ev.raw;
      // console.log(file, "file");
      //没有文件
      if (!file) return;
      //解析和上传到后端的时候进行loading加载显示
      let loadingInstance =  ElLoading.service({
        text: "请稍等一下,数据正在处理中"
      });
      await delay(100);//延迟
      //读取file中的数据
      //把文件解析成二进制数据,把二级制数据变成excel表格式的数据
      let data = await readFile(file);
      let workbook = XLSX.read(data, { type: "binary" });
      //拿到第一个sheet表的数据,把第一个表格的数据转换成JSON数据
      const worksheet = workbook.Sheets[workbook.SheetNames[0]];
      data = XLSX.utils.sheet_to_json(worksheet);
      //把读取出来的数据变成最后可以传递给服务器的数据
      let employees = [];
      data.forEach((item) => {
        let obj = {};
        for (let key in character) {
          if (!character.hasOwnProperty(key)) break;
          let v = character[key];
          const text = v.text;
          const type = v.type;
          v = item[text] || "";
          //对数据类型的处理
          type === "string" ? (v = String(v)) : null;
          type === "number" ? (v = Number(v)) : null;
          obj[key] = v;
        }
        employees.push(obj);
      });
      console.log(employees, "最后传入后端的excel数据");
      this.employeeData = employees;
      loadingInstance.close();
    },
  },
};
</script>

总结

到此这篇关于vue实现excel文件的导入和读取的文章就介绍到这了,更多相关vue导入和读取excel文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue-Cli配置代理转发解决跨域问题的方法

    Vue-Cli配置代理转发解决跨域问题的方法

    本文主要介绍了Vue-Cli配置代理转发解决跨域问题的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • vue使用js-audio-recorder实现录音功能

    vue使用js-audio-recorder实现录音功能

    这篇文章主要为大家详细介绍了vue如何使用js-audio-recorder实现录音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • Vue实现一种简单的无限循环滚动动画的示例

    Vue实现一种简单的无限循环滚动动画的示例

    这篇文章主要介绍了Vue实现一种简单的无限循环滚动动画的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • vue实现div拖拽互换位置

    vue实现div拖拽互换位置

    这篇文章主要为大家详细介绍了vue实现div拖拽互换位置的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Vue使用虚拟键盘及中英文切换功能

    Vue使用虚拟键盘及中英文切换功能

    这篇文章主要给大家介绍了关于Vue使用虚拟键盘及中英文切换的相关资料,有时候在大型触屏设备(如双屏设备)中往往就没有键盘去操作,所以就需要去建立一个虚拟键盘去操作,需要的朋友可以参考下
    2023-06-06
  • Vue页面刷新记住页面状态的实现

    Vue页面刷新记住页面状态的实现

    这篇文章主要介绍了Vue页面刷新记住页面状态的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-12-12
  • element-ui修改el-form-item样式的详细示例

    element-ui修改el-form-item样式的详细示例

    在使用element-ui组件库的时候经常需要修改原有样式,下面这篇文章主要给大家介绍了关于element-ui修改el-form-item样式的详细示例,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • vite分目录打包及去掉默认的.gz 文件的操作方法

    vite分目录打包及去掉默认的.gz 文件的操作方法

    Vite在默认配置下会将资源打包至assets文件夹并添加哈希值,不同于Webpack的多文件夹存放方式,Vite只对public文件夹不进行打包处理,而Webpack不打包public和static文件夹,本文介绍vite分目录打包及去掉默认的.gz 文件的操作方法,感兴趣的朋友一起看看吧
    2024-09-09
  • Vue 项目迁移 React 路由部分经验分享

    Vue 项目迁移 React 路由部分经验分享

    这篇文章主要为大家介绍了Vue 项目迁移 React 路由部分经验分享,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • idea编译器vue缩进报错问题场景分析

    idea编译器vue缩进报错问题场景分析

    idea编译器出现Vue缩进报错,怎么解决呢,很多朋友遇到这个问题都很棘手,不知该如何解决,今天小编给大家通过场景分析介绍解决方案,需要的朋友参考下吧
    2021-07-07

最新评论