当前位置: 首页 > article >正文

vue2实现excel文件预览

一、插件

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

npm install xlsx

二、完整代码 

<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

三、预览效果

 


http://www.kler.cn/a/464514.html

相关文章:

  • 李宏毅机器学习笔记-Transformer
  • 【踩坑指南2.0 2025最新】Scala中如何在命令行传入参数以运行主函数
  • 关系分类(RC)模型和关系抽取(RE)模型的区别
  • MCGS学习记录
  • uni-app:实现普通选择器,时间选择器,日期选择器,多列选择器
  • Gitea代码仓服务搭建
  • 鸿蒙应用开发搬砖经验之-ArkWeb加载页面的超简单示例
  • vue3 Suspense组件
  • 深入探究 Louvain 算法:从原理到实现
  • 电子电器架构 -- 什么是用于ADAS/AD系统的雷达?
  • JAVA创建绘图板JAVA构建主窗口鼠标拖动来绘制线条
  • 第二十五天 项目实践:图像分类
  • python学习笔记—12—
  • 设计模式 创建型 原型模式(Prototype Pattern)与 常见技术框架应用 解析
  • 闪测仪在医用人造骨骼尺寸检测中的革新应用——从2D到3D的全面升级
  • C语言中的隐式转换问题
  • 王老吉药业SRM系统上线 携手隆道共启战略合作新篇章
  • 【优选算法】查找总价格为目标值的两个商品(双指针)
  • Java-数据结构-包装类与泛型
  • YOLO11改进 | 卷积模块 | ECCV2024 小波卷积
  • 英文字体:创意前卫杀手级标题海报封面设计粗体字体 Morne Display
  • swiftui中struct该如何使用?可选字段怎么定义?使用Alamofire发送请求接收responseDecodable相应解析
  • 远场P2P穿越
  • Facebook元宇宙项目中的智能合约应用:提升虚拟空间的自治能力
  • 《探秘计算机视觉与深度学习:开启智能视觉新时代》
  • HTML——30.视频引入