导入导出并将excel表格数据展示

javascript 复制代码
<template>
  <div>
    <div class="inline-block">

      <el-upload
        class="upload-demo"
        action="https://jsonplaceholder.typicode.com/posts/"
        :on-change="handleChange"
        :file-list="fileList"
        list-type="picture"
        multiple
        show-file-list
        accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel"
      >
        <el-button slot="trigger" type="primary" icon="el-icon-upload">导入</el-button>
        <el-button type="primary" icon="el-icon-download" style="margin-left: 10px" @click="handleExport">导出</el-button>
      </el-upload>

    </div>

    <el-table id="tables" :data="tableData" border>
      <el-table-column prop="Project" label="姓名" />
      <el-table-column prop="ERS1" label="性别" />
      <el-table-column prop="CategoryRel" label="民族" />
      <el-table-column prop="CategoryRel2" label="身份证号" />
      <el-table-column prop="CategoryRel3" label="出生时间" />
      <el-table-column prop="CategoryRel4" label="电话" />
      <el-table-column label="操作" />
    </el-table>
  </div>
</template>
// 数据
<script>
import { excel } from '@/api/excel'
import xlsx from 'xlsx'
export default {
  data() {
    return {
      tableData: [],
      fileList: [],
      fileTemp: null, // 关键!!!!存放组件上传的excel file 用于实现读取数据
      outdata: []
    }
  },

  methods: {
    handleExport(event) {
      const loading = this.$loading({
        lock: true,
        text: '拼命加载中请稍等...',
        spinner: 'el-icon-loading',
        background: 'rgba(0, 0, 0, 0.7)'
      })
      setTimeout(() => {
        this.$confirm('确定导出列表文件?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        })
          .then(() => {
            loading.close()
            excel('tables', '测试表格导出')
          })
          .catch(() => {
            loading.close()
          })
      }, 1000)
    },

    handleChange(file) {
      const _this = this

      const reader = new FileReader()
      // 提取excel中文件内容
      reader.readAsArrayBuffer(file.raw)
      reader.onload = function() {
        const buffer = reader.result
        const bytes = new Uint8Array(buffer)
        const length = bytes.byteLength
        let binary = ''
        for (let i = 0; i < length; i++) {
          binary += String.fromCharCode(bytes[i])
        }
        const XLSX = require('xlsx') // import xlsx from 'xlsx'

        // 转换二进制
        const wb = XLSX.read(binary, {
          type: 'binary'
        })
        _this.outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]])
        console.log(_this.outdata)
      }

      // 这里for循环将excel表格数据转化成json数据
      _this.outdata.forEach((i) => {
        const obj = {
          Project: i.姓名,
          ERS1: i.性别,
          CategoryRel: i.民族,
          CategoryRel2: i.身份证号,
          CategoryRel3: i.出生时间,
          CategoryRel4: i.电话
        }
        // 连接后台接口添加到后台数据库
        // _this
        //   .$http({
        //     method: "post",
        //     url: "/ERS/InsertERS",
        //     data: obj,
        //   })
        //   .then((response) => {
        //     if (response.data["header"]["code"] == 0) 
        //       _this.getData();

        //     } else {
        //       _this.$message.error(response.data["header"]["message"]);
        //     }
        //   })
        //   .catch((error) => {
        //     _this.$message.error(error.toString());
        //   });
        _this.tableData.push(obj)
        console.log(_this.tableData)
      })
    }
  }
}
</script>
<style>
.inline-block {
  display: inline-block;
  margin: 20px;
}
</style>
javascript 复制代码
//二、导出需要的excel.js代码如下

// 引入依赖
import FileSaver from 'file-saver'
import * as XLSX from 'xlsx'

// id绑定的id,title表格名称
export const excel = (id, title) => {
  /* generate workbook object from table */
  //  判断要导出的节点中是否有fixed的表格,如果有,转换excel时先将该dom移除,然后append回去,
  const fix = document.querySelector('.el-table__fixed')
  let wb
  if (fix) {
    wb = XLSX.utils.table_to_book(
      document.querySelector('#' + id).removeChild(fix)
    )
    document.querySelector('#' + id).appendChild(fix)
  } else {
    wb = XLSX.utils.table_to_book(document.querySelector('#' + id))
  }

  // 网上wb = XLSX.utils.table_to_book(document.querySelector('#'+id));直接这样写,如果存在固定列,导出的excel表格会重复两遍

  /* get binary string as output */
  console.log(wb)
  const wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: true, type: 'array' })
  try {
    FileSaver.saveAs(
      new Blob([wbout], { type: 'application/octet-stream' }),
      title + '.xlsx'
    )
  } catch (e) {
    if (typeof console !== 'undefined') console.log(e, wbout)
  }
  return wbout
}

参考:https://blog.csdn.net/qq_39593196/article/details/126008880

相关推荐
yxlalm13 小时前
4.java秒杀项目第四课-后端商品后台接口
java·开发语言
孙启超13 小时前
【AI开发之Rust】第 1 课:认识 Rust 与开发环境 —— 装好工具链,跑通第一个程序
开发语言·人工智能·后端·ai·rust·安全架构
君顾113 小时前
家政派单小程序源码开发实战:从零搭建到上线全流程指南
java·开发语言·家政派单
Bs_MoneyMagnet14 小时前
基于springboot+vue的宠物殡葬管理平台的设计与实现 源码+文档
java·javascript·vue.js·spring boot·后端·宠物
我是唐青枫14 小时前
C#.NET PInvoke 深入解析:封送、内存布局与原生互操作实战
开发语言·c#·.net
程序猿编码14 小时前
纯C++轻量计算机视觉推理引擎:基于GGML的端侧CV模型部署技术全解析
开发语言·c++·计算机视觉·大模型·transformer
尾善爱看海14 小时前
Vue 面试进阶篇:Composition API、插槽、自定义指令……8 个章节 + 高频面试题全解析
前端·javascript·vue.js·面试·vue
SEO_juper15 小时前
外贸多语言站最隐蔽的流量杀手:hreflang 错了,谷歌把德语页推给美国人(附审计脚本)
开发语言·前端·python·seo·独立站·谷歌优化
geovindu15 小时前
CSharp: Strategy Pattern
开发语言·后端·c#·.net·.netcore·策略模式·行为模式
Tairitsu_H15 小时前
[C++] C++11新增构造:列表初始化和std::initializer_list
开发语言·c++·c++11·构造