文件阅览功能的实现(适用于word、pdf、Excel、ppt、png...)

news/2024/7/21 6:57:05 标签: word, pdf, excel

需求描述:

需要一个组件,同时能预览多种类型文件,一种类型文件可有多个的文件。

看过各种博主的方案,其中最简单的是利用第三方地址进行预览解析(无需任何插件);

这里推荐三个地址:       

        @params 微软解析地址

        @url    https://view.officeapps.live.com/op/view.aspx?src=资料地址

        @params docx云服务解析 大小限制 50MB

        @url    http://view.xdocin.com/xdoc?_xdoc=资料地址

        @params 豆瓣在线预览解析  

        @url    www.xdocin.com/xdoc?_func=to&_format=html&_cache=1&_xdoc=资料地址

 效果图:

已测试,因为单线程原因,可能有些文件无法同时展现,后期还会优化

 注意:操作的文件必须是公网能访问得到的,否则无法被解析;

组件代码:

<!--多文件类型预览-->
<template>
  <el-dialog
    class="filedialog"
    title="文件预览"
    append-to-body
    :visible.sync="dialogVisible"
    close-on-press-escape
    @close="close"
    width="70%"
  >
    <span slot="title" class="dialog-footer">
      <div class="title">
        <span>文件预览</span>
      </div>
      <div class="select_box">
        <el-select
          v-model="fileType"
          placeholder="请选择文件类型"
          @change="selectChange"
          clearable
          transfer="true"
          :popper-append-to-body="false"
          popper-class="select-popper"
        >
          <el-option
            v-for="(item, index) in fileTypes"
            :key="index"
            :label="`文件类型` + (index + 1) + item"
            :value="item"
            >{{ `文件类型` + (index + 1) + item }}</el-option
          >
        </el-select>
      </div>
    </span>
    <template v-if="onImg">
      <iframe
        v-for="(item, index) in fileListInfo"
        :src="item"
        frameborder="0"
        width="100%"
        height="650"
        class="iframe"
      ></iframe>
    </template>
    <template v-else>
      <div class="block" :style="{ height: '600px' }">
        <!-- <span class="demonstration">默认 Hover 指示器触发</span> -->
        <el-carousel height="600px">
          <el-carousel-item v-for="item in fileListInfo" :key="item">
            <h3 class="small">
              <img
                :src="item"
                alt=""
                :style="{ width: '100%', height: 'auto' }"
              />
            </h3>
          </el-carousel-item>
        </el-carousel>
      </div>
    </template>
  </el-dialog>
</template>

<script>
export default {
  name: "file_Preview",
  data() {
    return {
      imgVisibleURL: "",
      onImg: true,
      dialogVisible: false,
      fileTypes: [],
      fileType: "",
      fileListInfo: null,
    };
  },
  props: {
    fileDialogVisible: {
      type: Boolean,
    },
    filePreview: {
      type: String,
      default: "",
    },
  },
  watch: {
    fileDialogVisible: {
      handler(newVal, oldVal) {
        this.dialogVisible = newVal;
      },
      deep: true,
      immediate: true,
    },
    filePreview: {
      handler(newVal, oldVal) {
        if (newVal) {
          this.imgVisibleURL = newVal;
          //类型收集
          this.fileTypes = this.conversion(newVal);
          //默认选中
          this.$nextTick(() => {
            this.fileType = this.fileTypes[0];
            this.selectChange(this.fileTypes[0]);
          });
        }
      },
      deep: true,
      immediate: false,
    },
  },
  created() {},
  mounted() {},
  methods: {
    /**
     *  @params 微软解析地址
        @url    https://view.officeapps.live.com/op/view.aspx?src=
        @params docx云服务解析 大小限制 50MB
        @url    http://view.xdocin.com/xdoc?_xdoc=
        @params 豆瓣在线预览解析  
        @url    www.xdocin.com/xdoc?_func=to&_format=html&_cache=1&_xdoc=
     */
    conversion(str) {
      str.split(",").forEach((item, index) => {
        let extIndex = item.lastIndexOf(".");
        let ext = item.substr(extIndex);
        this.fileTypes.push(ext);
      });
      let unique = (arr) => {
        return Array.from(new Set(arr));
      };
      return unique([...this.fileTypes]);
    },
    selectChange(e) {
      const fileDataList = this.fileFilter(this.imgVisibleURL.split(","), e);
      if (
        e == ".xls" ||
        e == ".doc" ||
        e == ".docx" ||
        e == ".xlsx" ||
        e == ".detx" ||
        e == ".pptx" ||
        e == ".ppt" ||
        e == ".xls"
      ) {
        //需二次处理
        this.onImg = true;
        this.fileListInfo = fileDataList;
        this.fileListInfo = this.fileListInfo.map((url, index) => {
          return `https://view.officeapps.live.com/op/view.aspx?src=${url}`;
        });
      } else if (e == ".png" || e == ".jpg" || e == ".webp" || e == ".gif") {
        //图片类型直接
        this.onImg = false;
        this.fileListInfo = fileDataList;
      } else if (e == ".pdf") {
        //.pdf类型不需要二次处理
        this.onImg = true;
        this.fileListInfo = fileDataList;
      }
    },
    fileFilter(arr, callback) {
      let urlArr = [];
      arr.forEach((item, index) => {
        let extIndex = item.lastIndexOf(".");
        let ext = item.substr(extIndex);
        if (ext == callback) {
          urlArr.push(item);
        }
      });
      return urlArr;
    },
    close() {
      this.$emit("fileCloseDialog", false);
      this.fileTypes = [];
      this.fileListInfo = null;
      this.fileType = "";
    },
  },
};
</script>

<style lang="less" scoped>
.filedialog {
  width: 100%;
  height: 100%;
  z-index: 9999 !important;
  ::v-deep .dialog-footer {
    height: 50px;
    font-size: 19px;
    display: flex;
    align-items: center;
    position: relative;
    .select_box {
      position: absolute;
      right: 100px;
    }
  }

  ::v-deep .el-dialog {
    opacity: 0.9;

    .el-dialog__body {
      height: 700px;
      margin: 0;
      padding: 15px;
      background: #00132f;
      overflow: auto;

      // 滚动条整体部分
      &::-webkit-scrollbar {
        width: 6px;
        height: 6px;
      }
      // 滚动条的轨道的两端按钮,允许通过点击微调小方块的位置。
      &::-webkit-scrollbar-button {
        display: none;
      }
      // 滚动条的轨道(里面装有Thumb)
      &::-webkit-scrollbar-track {
        background: transparent;
      }
      // 滚动条的轨道(里面装有Thumb)
      &::-webkit-scrollbar-track-piece {
        background-color: transparent;
      }
      // 滚动条里面的小方块,能向上向下移动(或往左往右移动,取决于是垂直滚动条还是水平滚动条)
      &::-webkit-scrollbar-thumb {
        background: #fff;
        cursor: pointer;
        border-radius: 4px;
      }
      // 边角,即两个滚动条的交汇处
      &::-webkit-scrollbar-corner {
        display: none;
      }
      // 两个滚动条的交汇处上用于通过拖动调整元素大小的小控件
      &::-webkit-resizer {
        display: none;
      }
    }
    .el-dialog__header {
      background: #00132f;
      color: white;
    }
  }
}

</style>

方法还是有很多的,下面给大家推荐几个还不错的网站;

可参考:

vue在线预览wordexcelpdf、txt、图片的相关资料,

https://www.jb51.net/article/266520.html

vue集成Luckyexcel实现在线编辑Excel,可自行导入,也可从服务器端获取:

https://blog.csdn.net/weixin_45000975/article/details/121856816

希望对大家有所帮助,如有不妥,多多包涵


http://www.niftyadmin.cn/n/395221.html

相关文章

MySQL-Linux版安装

MySQL-Linux版安装 1、准备一台Linux服务器 云服务器或者虚拟机都可以&#xff1b; Linux的版本为 CentOS7&#xff1b; 2、 下载Linux版MySQL安装包 下载地址 3、上传MySQL安装包 使用FinalShell软件上传即可&#xff01; 4、 创建目录,并解压 mkdir mysqltar -xvf my…

日志打印规范

1、【必须】应用中不可以直接使用日志系统(Log4j,Logback)中的API,而应该依赖使用日志框架中SLF4J中的API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一 2、【必须】应用中的扩展日志(如打点、临时监控,访问日志等)命名方式:appName_logType_logName.…

MPS|如何学习电路设计?帮你快速上手

​电路设计是电子工程中的重要领域之一&#xff0c;涉及到电子元件的选择、电路的设计和分析、电路板的制作等多个方面。对于初学者来说&#xff0c;学习电路设计需要掌握一定的基础知识和技能&#xff0c;同时需要有耐心和实践经验。本文将从七个方面总结如何学习电路设计&…

MATLAB 之 数据统计分析和多项式计算

这里写目录标题 一、数据统计分析1. 最大值和最小值1.1 求向量的最大值和最小值1.2 求矩阵的最大值和最小值1.3 两个向量或矩阵对于元素的比较 2. 求和与求积3. 平均值和中值4. 累加和与累乘积5. 标准差与相关系数5.1 求标准差5.2 相关系数 6. 排序 二、多项式计算1. 多项式的四…

数据迁移工具,用这8种就够了

前言 最近由于工作需要需要进行数据迁移&#xff0c;那么ETL数据迁移工具该用哪些呢&#xff1f; ETL(是Extract-Transform-Load的缩写&#xff0c;即数据抽取、转换、装载的过程)&#xff0c;对于企业应用来说&#xff0c;我们经常会遇到各种数据的处理、转换、迁移的场景。…

C++的Lambda函数怎么使用

Lambda函数的语法形式为[捕获列表](参数列表) -> 返回类型 { 函数体 }。下面是Lambda函数的使用示例和说明: #include <iostream>int main() {// Lambda函数示例1:无参数、无返回值[] {std::cout << "Hello, Lambda!" << std::endl;}();// L…

Elsevier期刊Latex模板注意事项总结

目前遇到的问题 Elsevier&#xff08;爱思唯尔&#xff09;论文模板下载地址及说明 https://blog.csdn.net/yhcwjh/article/details/122101397#comments_24217163 模板最下面页码那一行&#xff08;preprint submitted to elsevier&#xff09;怎么去掉呢&#xff1f; 找到cas…

内存池技术

为了学习池化技术以及后续自行实现一个仿tcmalloc的线程池&#xff0c;我们先浅浅的学习一下池化的概念&#xff0c;以及简单的实现一个定长的内存池。 文章目录 一&#xff1a;池化技术二&#xff1a;内存池三&#xff1a;内存池主要解决的问题四&#xff1a;malloc五&#x…