预览word,excel,ppt,pdf、图片————使用vue实现

预览word,excel,ppt,pdf、图片————使用vue实现

需要下载的依赖:

npm i xlsx 		// 预览excel插件
npm i mammoth	// 预览word插件
npm i vue-pdf 	// 预览pdf插件

template模板实现:

<template>
  <div>
    <input type="file" @change="handleClick($event)" />
    <el-dialog
      :before-close="closePreviewClick"
      :close-on-click-modal="false"
      :visible.sync="iframeState"
    >
      <div v-if="showExcel == true" style="width: 100%; height: 650px">
        <el-table
          :data="tableData"
          style="width: 100%"
          height="450"
          size="mini"
        >
          <el-table-column
            :prop="item"
            :label="item"
            v-for="(item, index) in checkboxTableColumn"
            :key="'column' + index"
          >
          </el-table-column>
        </el-table>
        <div class="block">
          <el-pagination
            v-if="excelData != 0"
            @size-change="handleSizeChange"
            @current-change="CurrentChange"
            :current-page="currentPage"
            :page-sizes="[10, 20, 30, 40, 50, 100, 200, 500]"
            :page-size="pageSize"
            layout="total, sizes, prev, pager, next, jumper"
            :total="total"
          >
          </el-pagination>
        </div>
      </div>
      <div
        v-else-if="showDoc == true"
        style="
          margin-bottom: 20px;
          display: flex;
          justify-content: center;
          height: 850px;
          width: 100%;
          padding: 15px;
        "
      >
        <div
          v-loading="docVisible"
          element-loading-text="加载中"
          element-loading-spinner="el-icon-loading"
          v-html="vHtml"
        />
      </div>
      <div
        v-else-if="showPdf == true"
        style="
          margin-bottom: 20px;
          display: flex;
          justify-content: center;
          height: 850px;
          width: 100%;
          padding: 15px;
        "
      >
        <div style="position: fixed; top: 10px; z-index: 100">
          <el-button-group>
            <el-button
              type="primary"
              icon="el-icon-arrow-left"
              size="mini"
              @click="prePage"
              >上一页</el-button
            >
            <el-button type="primary" size="mini" @click="nextPage"
              >下一页<i class="el-icon-arrow-right el-icon--right"></i
            ></el-button>
          </el-button-group>
          <div style="margin-top: 10px; margin-left: 60px; color: #409eff">
            {{ pageNum }} / {{ pageTotalNum }}
          </div>
        </div>
        <pdf
          style="width: 70%; margin: 0 auto; height: 850px"
          ref="pdf"
          :src="src"
          :page="pageNum"
          @num-pages="pageTotalNum = $event"
        >
        </pdf>
      </div>
      <div
        v-else-if="showImg == true"
        class="dialog-body-content-base-style"
        style="margin-bottom: 20px; display: flex; justify-content: center"
      >
        <img :src="imgUrl" />
      </div>
      <div
        v-else-if="showPPt == true"
        style="
          margin-bottom: 20px;
          display: flex;
          justify-content: center;
          width: 800px;
          height: 800px;
        "
      >
        <iframe
          :src="pptUrl"
          scrolling="no"
          frameborder="0"
          style="z-index: 1000; height: 100%; width: 100%"
        ></iframe>
      </div>
    </el-dialog>
  </div>
</template>

方法的实现:

(包括预览pdf,excel,ppt,word,图片的方法)

<script>
import pdf from "vue-pdf"; // 预览pdf插件
import mammoth from "mammoth"; // 预览word插件
import * as XLSX from "xlsx"; // 预览excel插件
export default {
  name: "",
  components: {
    pdf,
  },
  props: {},
  data() {
    return {
      // start:控制那个标签显示的变量
      showPPt: false,
      showExcel: false,
      showPdf: false,
      showDoc: false,
      showImg: false,
      iframeState: false,
      // start:控制那个标签显示的变量
      src: "", // pdf的url地址
      // start:excel所需要的变量
      columnHeader: [], //所有键的值
      excelData: [], // 导入的excel的数据
      checkboxTableColumn: [], // 表格显示列
      tableData: [], //表格数据
      currentPage: 1, // 当前分页
      pageSize: 10, // 每页显示数量
      total: 0, // 数据总数
      // end:excel所需要的变量

      // start:pdf需要的变量
      vHtml: "", // doc文件变成html标签的变量
      docVisible: false, // 控制doc加载的变量
      pageNum: 1, // pdf的页码数量
      pageTotalNum: 1, // 总页数
      currentPage: 0, // pdf文件页码
      pageCount: 0, // pdf文件总页数
      // end:pdf需要的变量

      imgUrl: "", // 图片的url地址 (转化成了base64)
      pptUrl:"", // ppt的url地址 (转化成了base64)
    };
  },
  methods: {
    // 控制对话框展示与否的方法
    closePreviewClick() {
      if (this.showExcel === true) {
        this.showExcel = false;
        this.iframeState = false;
      } else if (this.showPdf === true) {
        this.showPdf = false;
        this.iframeState = false;
      } else if (this.showImg === true) {
        this.showImg = false;
        this.iframeState = false;
      } else if (this.showDoc === true) {
        this.showDoc = false;
        this.iframeState = false;
      } else if (this.showPPt === true) {
        this.showPPt = false;
        this.iframeState = false;
      }
    },
    // 根据文件类型处理不同的文件
    handleClick(e) {
      let file = e.target.files[0];
      let type = this.iconByType(e);
      if (type.indexOf("pdf") !== -1) {
        this.iframeState = true;
        this.showPdf = true;
        this.viewPdf(file);
      } else if (type.indexOf("doc") !== -1 || type.indexOf("docx") !== -1) {
        this.iframeState = true;
        this.showDoc = true;
        this.viewDoc(file);
      } else if (
        type.indexOf("xsl") !== -1 ||
        type.indexOf("xslx") !== -1 ||
        type.indexOf("xls") !== -1
      ) {
        this.iframeState = true;
        this.showExcel = true;
        this.exportData(e);
      } else if (
        type.indexOf("jpg") !== -1 ||
        type.indexOf("png") !== -1 ||
        type.indexOf("jpeg") !== -1
      ) {
        this.showImg = true;
        this.iframeState = true;
        this.viewImg(file);
      } else if (type.indexOf("pptx") !== -1 || type.indexOf("ppt") !== -1) {
        this.showPPt = true;
        this.viewPPt(file);
      }
    },
    // 判断文件类型的方法
    iconByType(e) {
      let filename = e.target.files[0].name;
      return filename.substring(filename.lastIndexOf(".") + 1, filename.length);
    },
    // start:解析excel的方法
    exportData(event) {
      if (!event.currentTarget.files.length) {
        return;
      }
      const that = this;
      let f = event.currentTarget.files[0];
      let reader = new FileReader();
      reader.onload = function (e) {
        var data = e.target.result;
        var wb = XLSX.read(data, {
          type: "buffer",
        });
        var outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]);
        console.log(outdata);
        that.excelData = outdata;
        that.tableData = outdata.slice(0, 10);
        that.total = outdata.length;
        var importDataThead = Array.from(Object.keys(outdata[0])).map(
          (item) => {
            return item;
          }
        );
        that.columnHeader = importDataThead;
        that.checkboxTableColumn = importDataThead.slice(0, 9);
        console.log(importDataThead);
      };
      reader.readAsArrayBuffer(f);
    },
    // 分页切换
    CurrentChange(val) {
      this.currentPage = val;
      this.tableData = this.excelData.slice(
        (val - 1) * this.pageSize,
        val * this.pageSize - 1
      );
    },
    // 每页显示数量改变
    handleSizeChange(val) {
      this.pageSize = val;
      this.tableData = this.excelData.slice(
        (this.currentPage - 1) * val,
        this.currentPage * val - 1
      );
    },
    // end:解析excel的方法

    // 预览doc文件
    viewDoc(file) {
      const that = this;
      var reader = new FileReader();
      reader.readAsArrayBuffer(file);
      reader.onload = function () {
        const buffer = this.result; //此时是arraybuffer类型
        console.log(buffer);
        mammoth.convertToHtml({ arrayBuffer: buffer }).then((result) => {
          that.vHtml = result.value;
        });
      };
    },
    // srart: 预览pdf文件
    // 预览pdf文件
    viewPdf(file) {
      var fileReader = new FileReader();
      let that = this;
      fileReader.onload = function () {
        that.src = this.result;
      };
      fileReader.readAsDataURL(file);
    },
    // 上一页
    prePage() {
      let page = this.pageNum;
      page = page > 1 ? page - 1 : this.pageTotalNum;
      this.pageNum = page;
    },
    // 下一页
    nextPage() {
      let page = this.pageNum;
      page = page < this.pageTotalNum ? page + 1 : 1;
      this.pageNum = page;
    },
    // end: 预览pdf文件

    // 预览图片
    viewImg(file) {
      let _this = this;
      let reader = new FileReader();
      reader.readAsDataURL(file); // 文件转换
      reader.onload = function () {
        _this.imgUrl = this.result;
      };
    },
    
    // 预览ppt
    viewPPt(file) {
      let _this = this;
      let reader = new FileReader();
      reader.readAsDataURL(file); // 文件转换
      reader.onload = function () {
        _this.pptUrl = this.result;
      };
    },
  },
};
</script>
<style scoped>
.block {
  height: 40px;
  padding: 0;
  display: flex;
  justify-content: center;
  align-items: center;
}
</style>

借鉴该篇文章(https://blog.csdn.net/weixin_44378416/article/details/119543832?spm=1001.2014.3001.5502

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Vue3可以通过使用Vue Router和Vue CLI来实现PPT在线预览。下面是一种可能的实现方式: 1. 首先,你需要安装Vue CLI并创建一个新的Vue项目。你可以使用以下命令来完成这个步骤: ``` npm install -g @vue/cli vue create ppt-preview ``` 2. 安装Vue Router,用于管理路由。在项目根目录下运行以下命令: ``` npm install vue-router ``` 3. 创建一个名为`PPTPreview.vue`的组件,用于显示PPT预览。在该组件中,你可以使用第三方库(如`reveal.js`)来实现PPT的展示效果。 4. 在`src`目录下创建一个名为`router`的文件夹,并在其中创建一个名为`index.js`的文件。在该文件中,你可以配置Vue Router的路由信息,例如: ```javascript import { createRouter, createWebHistory } from 'vue-router' import PPTPreview from '../components/PPTPreview.vue' const routes = [ { path: '/', name: 'PPTPreview', component: PPTPreview } ] const router = createRouter({ history: createWebHistory(), routes }) export default router ``` 5. 在项目的根目录下找到`main.js`文件,并添加以下代码来启用Vue Router: ```javascript import { createApp } from 'vue' import App from './App.vue' import router from './router' createApp(App).use(router).mount('#app') ``` 6. 在`App.vue`中,你可以添加一个导航栏或其他方式来触发PPT预览页面的跳转。例如: ```html <template> <div> <router-link to="/ppt-preview">预览PPT</router-link> <router-view></router-view> </div> </template> ``` 7. 最后,你可以在`PPTPreview.vue`组件中实现PPT的在线预览功能。你可以使用第三方库(如`reveal.js`)来加载和展示PPT文件。 这只是一种实现方式,具体的实现细节可能因项目需求而有所不同。你可以根据自己的需求进行相应的调整和扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖啡壶子

你的鼓励奖是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值