基于xlsx.js的导入导出插件 lay-excel , 一行代码即可导出,操作更方便 功能更强大

2,577 阅读1分钟

 一. 介绍插件

官方原话↓↓

  • 现有导出前端库中,XLSX.JS功能强大但是操作颇为不便,于是封装了此插件,无额外依赖,支持 npm 引入,支持 Layui插件形式加载,导出仅需一句话

  • 导出excel功能基于 XLSX.js,下载功能基于 FileSaver,读取文件基于 H5的 FileReader。

话不多说, 上地址↓↓

功能演示地址: excel.wj2015.com

文档地址: 概览 · LAY-EXCEL 插件文档

二. 初始准备

  1. 创建个vue2空项目(具体步骤省略 详情看上一篇)

  2. 安装依赖

npm i element-ui

npm i lay-excel

  1. main.js导入UI插件

 import ElementUI from 'element-ui';

import 'element-ui/lib/theme-chalk/index.css';

Vue.use(ElementUI);

三. 导入导出demo 

一行导出

import LAY_EXCEL from 'lay-excel';
//导出
LAY_EXCEL.exportExcel([[1, 2, 3]], '表格导出.xlsx', 'xlsx')

↓注释齐全 复制即可拿来用, 若功能不满足, 可查看文档↓

导出excel样式设置

时间处理

导入模板↓

链接:pan.baidu.com/s/1RIpEcLWu… 提取码:7ok2

image.png

image.png

-------------------------------------------分割线--------------------------------------------

<template>
  <div class="app-container">
    <input
      hidden
      ref="excel-upload-input"
      class="excel-upload-input"
      type="file"
      accept=".xlsx, .xls"
      @change="handleClick"
    />
    <el-button type="primary" @click="importExcel">导入</el-button>
    <el-table
      :data="tableData"
      border
      highlight-current-row
      style="width: 100%; margin-top: 20px"
    >
      <el-table-column prop="username" label="姓名" width="180">
      </el-table-column>
      <el-table-column prop="mobile" label="手机号" width="180">
      </el-table-column>
      <el-table-column prop="timeOfEntry" label="入职日期" width="180">
      </el-table-column>
      <el-table-column prop="correctionTime" label="转正日期" width="180">
      </el-table-column>
      <el-table-column prop="workNumber" label="工号" width="180">
      </el-table-column>
      <el-table-column prop="deptName" label="部门"> </el-table-column>
    </el-table>
    <el-button type="primary" @click="exportExcel">导出</el-button>
  </div>
</template>

<script>
import LAY_EXCEL from "lay-excel";
export default {
  data() {
    return {
      tableData: [],
      tableHeader: [],
    };
  },
  methods: {
    // 文件框值更新事件
    handleClick(e) {
      try {
        // 获取导入的文件
        const files = e.target.files;
        const rawFile = files[0];
        if (!rawFile) return;

        // 插件的导入方法
        LAY_EXCEL.importExcel(files, {}, (data) => {
          console.log("导入JSON:" + JSON.stringify(data));
          // 列名转英文方法
          data = LAY_EXCEL.filterImportData(data, {
            username: "A", //梳理时 要确保字段名对应上
            mobile: "B",
            timeOfEntry: "C",
            correctionTime: "D",
            workNumber: "E",
            deptName: "F",
          });
          console.log("梳理后JSON:" + JSON.stringify(data));

          /*  这里要注意 xlsx文件默认的第一页名字叫 Sheet1 ,  一般这么写 data[0].Sheet1 
            如果改过,比如SheetJS ,  这里需要对应修改 data[0].SheetJS 
            */
          //获取表格数据
          let Sheet1 = data[0].SheetJS;
          console.log(Sheet1);
          for (let i = 0; i < Sheet1.length; i++) {
            if (i == 0) {
              // 取到第一行的列头
              this.tableHeader = Object.values(Sheet1[0]);
              //跳过列头
              continue;
            }
            this.tableData.push(Sheet1[i]); //新增一条
          }
          // this.exportConfig.value = false;
          if (this.tableData.length > 0) {
            this.$message.success("导入成功!");
          }
        });
      } catch (e) {
        this.$Message.error("导入错误: " + e.message);
      }
    },
    // 导入
    importExcel() {
      this.$refs["excel-upload-input"].click();
    },
    // 导出
    exportExcel() {
      if (this.tableData.length === 0)
        return this.$message.error("无数据可导出");
      // 姓名	手机号	入职日期	转正日期	工号	部门
      const data = [ ...this.tableData ];
      console.log(data);
      data.unshift({
        username: "姓名",
        mobile: "手机号",
        timeOfEntry: "入职日期",
        correctionTime: "转正日期",
        workNumber: "工号",
        deptName: "部门",
      });

      // 执行导出函数,系统会弹出弹框
      LAY_EXCEL.exportExcel(
        {
          sheet1: data,
        },
        "导出接口数据.xlsx",
        "xlsx"
      );
      this.$message.error("导出成功");
    },
  },
};
</script>