• vue 在线预览word、excel、pdf、txt、图片


    excel文件预览

    word文件预览

    pdf文件预览

    普通图片预览

    一、查看word

    引用mammoth.js

    安装 npm install --save mammoth

    引入import mammoth from “mammoth”;

    1.页面

    <div id="wordView" v-html="vHtml"/></div>

    2.数据

    data() {
      return {
        vHtml: "",
        wordURL:''  //文件地址,看你对应怎末获取、赋值
      };
    },
    created() {
      // 具体函数调用位置根据情况而定
      this.readExcelFromRemoteFile(this.wordURL);
    }
    methods:{
        // 在线查看word文件
        readExcelFromRemoteFile: function (url) {
          var vm = this;
          var xhr = new XMLHttpRequest();
          xhr.open("get", url, true);
          xhr.responseType = "arraybuffer";
          xhr.onload = function () {
            if (xhr.status == 200) {
              mammoth
                .convertToHtml({ arrayBuffer: new Uint8Array(xhr.response) })
                .then(function (resultObject) {
                  vm.$nextTick(() => {
                    // document.querySelector("#wordView").innerHTML =
                    //   resultObject.value;
                    vm.vHtml = resultObject.value;
                  });
                });
            }
          };
          xhr.send();
        },
    }

    二、查看Excel

    引用sheetjs

    安装 npm install --save xlsx

     引入import XLSX from “xlsx”;

    1.页面

    <!-- excel查看详情 -->
      <div id="table" v-if="!isWord">
        <el-table :data="excelData" style=" 100%">
          <el-table-column
             v-for="(value, key, index) in excelData[2]"
             :key="index"
              :prop="key"
              :label="key"
          ></el-table-column>
         </el-table>
     </div>

    2.数据

    data() {
      return {
        excelData: [],
        workbook: {},
        excelURL: "", //文件地址,看你对应怎末获取、赋值
      };
    },
    created() {
      // 具体函数调用位置根据情况而定
      this.readWorkbookFromRemoteFile(this.wordURL);
    }
    methods:{
        // 在线查看excel文件
        readWorkbookFromRemoteFile: function (url) {
          var xhr = new XMLHttpRequest();
          xhr.open("get", url, true);
          xhr.responseType = "arraybuffer";
          let _this = this;
          xhr.onload = function (e) {
            if (xhr.status === 200) {
              var data = new Uint8Array(xhr.response);
              var workbook = XLSX.read(data, { type: "array" });
              console.log("workbook", workbook);
    
              var sheetNames = workbook.SheetNames; // 工作表名称集合
              _this.workbook = workbook;
              _this.getTable(sheetNames[0]);
            }
          };
          xhr.send();
        },
       getTable(sheetName) {
          console.log(sheetName);
          var worksheet = this.workbook.Sheets[sheetName];
          this.excelData = XLSX.utils.sheet_to_json(worksheet);
          console.log(this.excelData);
        },
    }

    写的项目

    1.页面

    <el-dialog
          title="预览"
          append-to-body
          :visible.sync="dialog.dialogVisible"
        >
          <div :class="[checkClass]" class="check" />
          <div v-if="dialog.isPdf" v-loading="iframeLoading" class="pdfClass">
            <iframe
              :src="dialog.src"
              type="application/x-google-chrome-pdf"
            />
          </div>
          <!-- <div v-else-if="dialog.isExcel" class="excelClass" v-html="excelHtml" /> -->
          <div v-else-if="dialog.isExcel">
            <el-table
              :data="excelData"
              border
              stripe
              :header-cell-style="{'background':'#F5F4F7'}"
            >
              <el-table-column
                type="index"
                label="序号"
                width="60"
                :resizable="false"
                align="center"
              />
              <el-table-column
                v-for="(value, key, index) in excelData[0]"
                :key="index"
                :prop="key"
                :label="key"
              />
            </el-table>
          </div>
          <div v-else-if="dialog.isWord" class="wordClass" v-html="wordHtml" />
          <div v-else class="imgfile">
            <img
              :src="dialog.src"
              alt=""
            >
          </div>
        </el-dialog>

    2.数据

    <script>
    import { uploadFile, downloadFileByUniq, downloadFileByFileNames, downloadFileByUniq2 } from '@/base/api/common/'
    import XLSX from 'xlsx'
    import mammoth from 'mammoth'
    export default {
    data() {
        return {
          excelHtml: '',
          wordHtml: '',
          excelData: [],
        dialog: {
            dialogVisible: false,
            src: '',
            isPdf: false,
            isExcel: false,
            isWord: false
          },
    }
     
    methods: {
    // 预览
        previewFn(item) {
          if (!(item.url.includes('.png') || item.url.includes('.jpg') || item.url.includes('.jpeg') || item.url.includes('.bmp') || item.url.includes('.JPG') || item.url.includes('.PNG') || item.url.includes('.JPEG') || item.url.includes('.BMP') || item.url.includes('.pdf') || item.url.includes('.txt') || item.url.includes('.xls') || item.url.includes('.doc'))) {
            this.$message.error('文件类型不支持预览')
            return false
          }
          if (item.url.includes('.pdf') || item.url.includes('.txt')) {
            this.dialog.isPdf = true
            this.dialog.isExcel = false
            this.dialog.isWord = false
            this.dialog.src = ''
            this.iframeLoading = true
            downloadFileByUniq(
              encodeURIComponent(item.url)
            ).then(res => {
              const blob = new Blob([res], { type: item.url.includes('.pdf') ? 'application/pdf;' : '' })
              const href = window.URL.createObjectURL(blob)
              this.dialog.src = href
            }).finally(() => {
              this.iframeLoading = false
            })
          } else if (item.url.includes('.xls')) {
            this.dialog.isExcel = true
            this.dialog.isWord = false
            this.dialog.isPdf = false
            downloadFileByUniq2(
              encodeURIComponent(item.url)
            ).then(data => {
              const workbook = XLSX.read(new Uint8Array(data), { type: 'array' }) // 解析数据
              var worksheet = workbook.Sheets[workbook.SheetNames[0]] // workbook.SheetNames 下存的是该文件每个工作表名字,这里取出第一个工作表
              // this.excelHtml = XLSX.utils.sheet_to_html(worksheet) // 渲染成html
              const sheet2JSONOpts = {
                /** Default value for null/undefined values */
                defval: ''// 给defval赋值为空的字符串,不然没值的这列就不显示
              }
              // 渲染成json
              this.excelData = XLSX.utils.sheet_to_json(worksheet, sheet2JSONOpts)
              console.log(this.excelData)
            })
          } else if (item.url.includes('.doc')) {
            var vm = this
            this.dialog.isWord = true
            this.dialog.isExcel = false
            this.dialog.isPdf = false
            downloadFileByUniq2(
              encodeURIComponent(item.url)
            ).then(data => {
              mammoth.convertToHtml({ arrayBuffer: new Uint8Array(data) })
                .then(function(resultObject) {
                  vm.$nextTick(() => {
                    vm.wordHtml = resultObject.value
                  })
                })
            })
          } else {
            this.dialog.isPdf = false
            this.dialog.isExcel = false
            this.dialog.isWord = false
            this.dialog.src = item.downloadUrl
          }
          this.dialog.dialogVisible = true
          this.checkClass = 'check' + item.intinvoicestatus
        },
    }
  • 相关阅读:
    C# DataSet与DataTable的区别和用法
    黑马程序员_ADO.Net(ExecuteReader,Sql注入与参数添加,DataSet,总结DataSet与SqlDataReader )
    CSS中a标签样式的“爱恨”原则
    外部调用JS文件时出现中文乱码的解决办法
    #nav li:hover ul 与#nav li a:hover ul 的区别
    css sprites介绍
    CSS样式优化
    网站页面常用的尺寸
    display:inline、block、inline-block 的区别
    CSS文档流
  • 原文地址:https://www.cnblogs.com/hellofangfang/p/16048179.html
Copyright © 2020-2023  润新知