vue2实现excel文件预览

一、插件

通过xlsx插件解析excel数据,对解析后的html组件进行渲染展示。

html 复制代码
npm install xlsx

二、完整代码

html 复制代码
<template>
  <!-- excel文件预览 -->
  <div
    element-loading-text="拼命加载中"
    element-loading-spinner="el-icon-loading"
    element-loading-background="rgba(0, 0, 0, 0.8)"
    class="panel-box pd-15"
  >
    <div class="file-pre">
      <el-tabs v-model="activeName" type="border-card" style="overflow:auto">
        <el-tab-pane v-for="(item,index) in excelSheet" :key="index" :label="item.name" :name="item.name" style="overflow:auto">
          <div class="table" v-html="item.innerHTML"></div>
        </el-tab-pane>
      </el-tabs>
    </div>
    <div class="tc mgt-20">
      <button class="btn-submit" @click="close()">关闭</button>
    </div>
  </div>
</template>

<script>
import { read, utils } from "xlsx";

export default {
  name:'excelFilePreview',
  data() {
    return {
      activeName:'',
      excelSheet:[],
    };
  },
  created() {
    const params = this.$commonUtil.decodeQuery(this.$route.query.info);
    this.previewFile(params);
  },
  methods: {
    previewFile(docId){
      this.excelSheet = [];
      const inParam = {
        DOC_ID: docId,
        STAFF_NAME: this.$store.getters.staffName,
        SYS_USER_CODE: this.$store.getters.systemUserCode
      };
      const loading = this.$commonUtil.loading.open();
      this.$downloadBuffer(this.mciApi.common.file.previewFile, {...inParam}).then(r => {
        loading.close();
        const data = new Uint8Array(r);
        const workbook = read(data, {
          type: 'array'
        });
        // 删除掉没有数据的sheet
        Object.values(workbook.Sheets).forEach((sheet, index) => {
          if (Object.keys(sheet).indexOf('!ref') === -1) {
            delete workbook.Sheets[workbook.SheetNames[index]];
          }
        });
        this.tableToHtml(workbook);
      }).catch((e) => {
        loading.close()
      })
    },
    tableToHtml(workbook) {
      const sheetList = workbook.SheetNames.filter((v) => v.indexOf('数据源') === -1);
      this.activeName = sheetList[0];
      sheetList.forEach((sheet) => {
        const worksheet = workbook.Sheets[sheet];
        if (worksheet) {
          const innerHTML = utils.sheet_to_html(worksheet);
          this.excelSheet.push({
            name: sheet,
            innerHTML: innerHTML
          });
        } else {
          this.excelSheet.push({
            name: sheet,
            innerHTML: '暂无数据',
          });
        }
      });
    },
    close(){
      this.$commonUtil.closeCurrentTagBackLast(this.$route,false);
    },
  }
};
</script>

<style lang="scss" scope>
.file-pre {
  padding: 20px;
  .table-html-wrap /deep/ table {
    border-right: 1px solid #e8eaec;
    border-bottom: 1px solid #e8eaec;
    border-collapse: collapse;
    margin: auto;
  }
  .table-html-wrap /deep/ table td {
    border-left: 1px solid #e8eaec;
    border-top: 1px solid #e8eaec;
    white-space: wrap;
    text-align: left;
    min-width: 100px;
    padding: 4px;
  }
  table {
    border-top: 1px solid #EBEEF5;
    border-left: 1px solid #EBEEF5;
    width: 100%;
    overflow: auto;
    tr {
      height: 44px;
    }
    tr:first-child{
      background: #f2f8ff;
    }
    td {
      min-width: 200px;
      max-width: 400px;
      padding: 4px 8px;
      border-right: 1px solid #EBEEF5;
      border-bottom: 1px solid #EBEEF5;
    }
  }
}
</style> 

注意:

$downloadBuffer :封装的post请求,请求中的 responseType 需要设置为 arraybuffer

三、预览效果

相关推荐
Channing Lewis31 分钟前
sql server如何创建表导入excel的数据
数据库·oracle·excel
踢足球的,程序猿1 小时前
从 Vue 2.0 进阶到 Vue 3.0 的核心技术解析指南
前端·javascript·vue.js·前端框架·html
掘金安东尼3 小时前
仅仅是发送一封邮件?暴露安全边界!
javascript·vue.js·面试
bo521003 小时前
突破性能瓶颈:基于虚拟滚动的大数据需求文档方案——告别卡顿与分页,实现Word级流畅体验
javascript·vue.js
小张快跑。3 小时前
【Vue3】(三)vue3中的pinia状态管理、组件通信
前端·javascript·vue.js
一颗奇趣蛋3 小时前
vue性能优化(响应数据&静态数据)
vue.js·性能优化
Hilaku3 小时前
用好了 defineProps 才叫会用 Vue3,90% 的写法都错了
前端·javascript·vue.js
Dignity_呱4 小时前
vue3对组件通信做了哪些升级?
前端·vue.js·面试
独立开阀者_FwtCoder4 小时前
最全301/302重定向指南:从SEO到实战,一篇就够了
前端·javascript·vue.js
TE-茶叶蛋16 小时前
Vue Fragment vs React Fragment
javascript·vue.js·react.js