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

三、预览效果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/949228.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【简博士统计学习方法】2. 统计学习方法的基本分类

2. 统计学习方法的基本分类 监督学习所学习的数据都是已经标注过的&#xff1b;无监督学习所学习的数据没有标注信息&#xff1b;半监督学习只含有少量标注&#xff0c;大多数没有标注&#xff08;利用已标注的数据来学习去标注未标注的数据&#xff09; 2.1 监督学习 图里的…

【Python爬虫实战】从基础概念到HTTP/HTTPS协议全面解析

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、爬虫的关键概念 &#xff08;一&#xff09;HTTP请求与响应 &#xff0…

Git命令行的使用

目录 一、什么是Git 1、本地仓库 vs 远端仓库 本地仓库 远端仓库 2、.git vs .gitignore .git .gitignore 二、使用Git命令 1、安装git 2、git首次使用需要配置用户邮箱和用户名 3、上传目录/文件到远端仓库步骤 1&#xff09;创建放置文件的目录 2&#xff09;cd…

Genome Research | 俄亥俄州立于忠堂组-结合深度学习与蛋白质数据库系统探究反刍动物真核微生物...

结合深度学习与蛋白质数据库系统探究反刍动物真核微生物 Probing the eukaryotic microbes of ruminants with a deep-learning classifier and comprehensive protein databases 期刊&#xff1a;Genome Research DOI&#xff1a;https://doi.org/10.1101/gr.279825.124 第一作…

unity 播放 序列帧图片 动画

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、方法一&#xff1a;代码控制播放序列帧1、设置图片属性2、创建Image组件3、简单的代码控制4、挂载代码并赋值 二、方法二&#xff1a;直接使用1.Image上添加…

UE5中实现右键开镜效果

右键之后添加时间轴&#xff0c;然后设置视野即可。Set Field Of View 时间轴设置&#xff0c;第一个点设置0,90度&#xff0c;因为默认的就是90度 第二个点看武器的类型或者倍境来设置&#xff0c;时间就是开镜时间&#xff0c;值越小开镜速度越快&#xff0c;第二个值就是视野…

Nginx:限流限速

1. 什么是限流限速? 限流限速是Nginx运维中一个非常重要的功能,用于防止服务器过载和保护资源免受滥用。它可以通过限制客户端的请求速率或上传/下载速度来实现。 限流:控制单位时间内允许处理的请求数量。这有助于防止过多的并发请求导致服务器性能下降或崩溃。限速:限制…

C++ 日志库 spdlog 使用教程

Spdlog是一个快速、异步、线程安全的C日志库&#xff0c;他可以方便地记录应用程序的运行状态&#xff0c;并提供多种输出格式。官网&#xff1a;https://github.com/gabime/spdlog 安装教程可以参考&#xff1a;https://blog.csdn.net/Harrytsz/article/details/144887297 S…

音视频入门基础:MPEG2-PS专题(3)——MPEG2-PS格式简介

一、引言 本文对MPEG2-PS格式进行简介。 进行简介之前&#xff0c;请各位先下载MPEG2-PS的官方文档。ITU-T和ISO/IEC都分别提供MPEG2-PS的官方文档。但是ITU提供的文档是免费的&#xff0c;ISO/IEC是付费的&#xff0c;所以我们主要阅读ITU提供的官方文档&#xff0c;比如较新…

Multisim更新:振幅调制器+解调器(含仿真程序+文档+原理图+PCB)

前言 继3年前设计的&#xff1a;Multisim&#xff1a;振幅调制器的设计&#xff08;含仿真程序文档原理图PCB&#xff09;&#xff0c;有读者表示已经不能满足新需求&#xff0c;需要加上新的解调器功能&#x1f602;&#x1f602;&#x1f602;&#xff0c;鸽了很久这里便安排…

BGP(Border Gateway Protocol)路由收集器

全球 BGP&#xff08;边界网关协议&#xff09;路由收集器的分布情况以及相关数据。以下是主要的信息解读&#xff1a; 地图标记&#xff1a; 每个绿色点代表一个路由收集器的位置。路由收集器分布在全球不同的地区&#xff0c;覆盖了五大区域&#xff1a; ARIN&#xff08;美…

【Rust自学】10.5. 生命周期 Pt.1:生命周期的定义与意义、借用检查器与泛型生命周期

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 10.5.1. 什么是生命周期 Rust的每个引用都有自己的生命周期&#xff0c;生命周期的作用是让引用保持有效&#xff0c;也可以说它是保持引…

Vue2: table加载树形数据的踩坑记录

table中需要加载树形数据,如图: 官网给了两个例子,且每个例子中的tree-props都是这么写的: :tree-props="{children: children, hasChildren: hasChildren}" 给我一种错觉,以为数据结构中要同时指定children和hasChildren字段,然而,在非懒加载模式下,数据结…

深入了解 SSL/TLS 协议及其工作原理

深入了解 SSL/TLS 协议及其工作原理 一. 什么是 SSL/TLS?二. SSL/TLS 握手过程三. SSL/TLS 数据加密与传输四. 总结 点个免费的赞和关注&#xff0c;有错误的地方请指出&#xff0c;看个人主页有惊喜。 作者&#xff1a;神的孩子都在歌唱 一. 什么是 SSL/TLS? 安全套接层&am…

sqlserver sql转HTMM邮件发送

通过sql的形式&#xff0c;把表内数据通过邮件的形式发送出去 declare title varchar(100) DECLARE stat_date CHAR(10),create_time datetime SET stat_dateCONVERT(char(10),GETDATE(),120) SET create_timeDATEADD(MINUTE,-20,GETDATE()) DECLARE xml NVARCHAR (max) DECLAR…

用QT实现 端口扫描工具1

安装在线QT&#xff0c;尽量是完整地自己进行安装&#xff0c;不然会少包 参考【保姆级图文教程】QT下载、安装、入门、配置VS Qt环境-CSDN博客 临时存储空间不够。 Windows系统通常会使用C盘来存储临时文件。 修改临时文件存储位置 打开系统属性&#xff1a; 右键点击“此电…

Selenium 自动化,如何下载正确的 ChromeDriver

在 Python 的 Selenium 自动化操作中&#xff0c;chromedriver 是不可或缺的驱动程序。没有正确安装对应版本的驱动&#xff0c;运行代码时常常会遇到报错问题&#xff0c;比如 “session not created: This version of ChromeDriver only supports Chrome version XX”。 今天…

泊松融合 实例2025

目录 例子1: 实现代码: 原作者代码: 本博客直接给出来最好的效果和源代码 参数说明: 效果不好,不推荐的参数:MONOCHROME_TRANSFER,NORMAL_CLONE 例子1: 目标图: 原图: 效果图: 实现代码: 坐标是要目标图上中心点坐标: import cv2if __na

前端如何从入门进阶到高级

在前端学习的道路上&#xff0c;我们将其划分为三个阶段&#xff1a;入门、实战和进阶。以下是各阶段的学习指南 一、入门阶段 在入门阶段&#xff0c;我们的目标是掌握前端的基本语法和知识&#xff0c;以便能够独立解决一些基础问题。这一阶段&#xff0c;我们建议通过视频…

Python爬虫基础——认识网页结构(各种标签的使用)

1、添加<div>标签的代码定义了两个区块的宽度和高度均为100px&#xff0c;边框的格式也相同&#xff0c;只是区块中显示的内容不同&#xff1b; 2、添加<ul>和<ol>标签分别用于定义无序列表和有序列表。<il>标签位于<ul>标签或<ol>标签之…