Vue在线预览excel、word、ppt等格式数据。

目录

前言

1.安装库

2.预览文件子组件代码

3、新建store/system.ts

4、父页面进行使用

总结


前言

 纯前端处理文件预览,包含excel、word、ppt、txt等格式,不需要后端服务器进行部署,并且内网也可以使用。

 


1.安装

npm install @vue-office/docx @vue-office/excel @vue-office/pdf
# 或
yarn add @vue-office/docx @vue-office/excel @vue-office/pdf

2.预览文件子组件代码

<template><div class="fileView"><n-modal v-model:show="fileViewVisible"><n-cardstyle="width: 65%;position: fixed;top: 50px;left: 50%;transform: translateX(-50%);":title="sysStore.fileViewInfo.name":bordered="true"size="medium"role="dialog"aria-modal="true"><template #header-extra><n-button circle @click="fileViewVisible = false"><template #icon><n-icon><Close /></n-icon></template></n-button></template><div><iframev-if="sysStore.fileViewInfo.fileType === 'txt'"style="width: 100%; height: calc(100vh - 190px)":src="sysStore.fileViewInfo.viewUrl"frameborder="0"></iframe><vue-office-pdfv-if="sysStore.fileViewInfo.fileType === 'pdf'"style="width: 100%; height: calc(100vh - 180px)":src="sysStore.fileViewInfo.viewUrl"frameborder="0"></vue-office-pdf><vue-office-docxv-if="sysStore.fileViewInfo.fileType === 'doc'"style="width: 100%; height: calc(100vh - 180px)":src="sysStore.fileViewInfo.viewUrl"frameborder="0"></vue-office-docx><vue-office-excelv-if="sysStore.fileViewInfo.fileType === 'xlsx'"style="width: 100%; height: calc(100vh - 180px)":src="sysStore.fileViewInfo.viewUrl"frameborder="0"></vue-office-excel></div></n-card></n-modal></div>
</template>
<script lang="ts" setup>
import { ref } from "vue";
import useSystemStore from "@/store/system";
import { Close } from "@vicons/ionicons5";
// 引入VueOffice组件
import VueOfficeDocx from "@vue-office/docx";
import VueOfficeExcel from "@vue-office/excel";
import VueOfficePdf from "@vue-office/pdf";
// 引入相关样式
import "@vue-office/docx/lib/index.css";
import "@vue-office/excel/lib/index.css";const sysStore = useSystemStore();const fileViewVisible = ref(false);const show = () => {fileViewVisible.value = true;
};// 监听外部变化
watch(() => props.visible, (newVal) => {fileViewVisible.value = newValue
}, {immediate: true
})
// 暴漏show给父组件使用
defineExpose({show,
});
</script>
<style lang="less" scoped></style>

 

3、新建store/system.ts

代码如下:

import { defineStore } from "pinia";interface State {fileViewInfo: any; // 文件预览信息
}const useSystemStore = defineStore("system", {state: (): State => ({fileViewInfo: {},}),actions: {setFileViewInfo(val: any) {this.fileViewInfo = val;},},
});export default useSystemStore;

4、父页面进行使用

<template><n-space class="file-view" style="gap: 8px 8px" :inline="true"><divclass="file-item"v-for="(file, index) in fileComp":key="index"@click="fileView(file)"><div class="file-icon"><img width="28" :src="file.iconIamge" alt="" /></div></div></n-space><FilePreviewDialog v-model:visible="obj.showDialog" ref="filePreviewDialogRef" />
</template>
<script lang="ts" setup>import { computed, ref } from "vue";
// 以下icon是不同后缀名的文件图片 可要可不要
import excelImg from "@/assets/images/fileIcon/excel.png";
import pdfImg from "@/assets/images/fileIcon/pdf.png";
import wordImg from "@/assets/images/fileIcon/word.png";
import textImg from "@/assets/images/fileIcon/text.png";
import unknownImg from "@/assets/images/fileIcon/unknown.png";
import { getFileSize } from "@/utils/useFunc";
import useSystemStore from "@/store/system";
import FilePreviewDialog from "@/components/FilePreviewDialog.vue";const filePreviewDialogRef = ref<any>();
const props = defineProps({files: {type: [Object,Array],required: true,},role: {type: String,},
});// 引入vuex
const sysStore = useSystemStore();// 文件信息
const obj = reactive({showDialog: false, // 是否展示附件fileUrl: [] // 附件地址
})const getIcon = (type: string) => {type = type.toLowerCase();let fileType: "doc" | "pdf" | "xlsx" | "txt" | "" = "";let iconIamge = "";const docMap = ["doc","docx","application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document",];const pdfMap = ["application/pdf", "pdf"];const xlsxMap = ["application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","xls","xlsx",];const textMap = ["txt", "text/plain", "text"];if (docMap.includes(type)) {fileType = "doc";iconIamge = wordImg;} else if (pdfMap.includes(type)) {fileType = "pdf";iconIamge = pdfImg;} else if (xlsxMap.includes(type)) {fileType = "xlsx";iconIamge = excelImg;} else if (textMap.includes(type)) {fileType = "txt";iconIamge = textImg;} else {fileType = "";iconIamge = unknownImg;}return {fileType,iconIamge: iconIamge,};
};// 获取文件数据
const fileView = async(item) => {
const {id} = item
const res = await getPolicy(id)
const {url,name,size,mime_type} = res.data
// 这里拿到的数据:url:完整的url文件流地址// name: 文件名//size: 文件字节大小// mime_type: 文件对应的类型 譬如txt对应 text/plain
// 获取文件后缀类型
const {fileType} = getIcon(mime_type)
const fileInfo = {name,fileType,type: mime_type,size,viewUrl: url
}// 更新文件信息sysStore.setFileViewInfo(fileInfo);
// 先关闭
obj.showDialog = false
// 确保dom更新后再次打卡
await nextTick()
obj.showDialog = true
};</script><style lang="less" scoped>
.file-view {.file-item {display: flex;align-items: center;border: 1px solid var(--baseColor);padding: 8px;cursor: pointer;min-width: 240px;max-width: 300px;border-radius: 5px;.file-icon {margin-right: 5px;}.file-info {max-width: calc(100% - 28px);.file-size {font-size: var(--fontSizeSmall);}}}
}
</style>

总结

记录一下 希望能帮助到你

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【小沐杂货铺】基于Three.JS绘制太阳系Solar System(GIS 、WebGL、vue、react,提供全部源代码)第2期

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第二期3【小沐学GIS】…

Fullstack 面试复习笔记:项目梳理总结

Fullstack 面试复习笔记&#xff1a;项目梳理总结 之前的笔记&#xff1a; Fullstack 面试复习笔记&#xff1a;操作系统 / 网络 / HTTP / 设计模式梳理Fullstack 面试复习笔记&#xff1a;Java 基础语法 / 核心特性体系化总结 这篇笔记主自用&#xff0c;系统地梳理一下最近…

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…

float和float32有什么区别

这是一个非常重要但容易混淆的问题。我们来一步一步讲清楚&#xff1a; ✅ 简答&#xff1a;float 和 float32 的区别 项目float&#xff08;通用名称&#xff09;float32&#xff08;精确定义&#xff09;含义通常指“浮点数”&#xff0c;具体精度由语言/平台决定明确指 32 …

openvino如何在c++中调用pytorch训练的模型

步骤1&#xff1a;将PyTorch模型转换为ONNX格式 转换代码示例&#xff08;Python&#xff09; import torch import torchvision1. 加载训练好的PyTorch模型 model torchvision.models.resnet18(pretrainedTrue) model.eval() # 设置为评估模式2. 创建虚拟输入&#xff08…

OpenCV CUDA模块特征检测------创建Harris角点检测器的GPU实现接口cv::cuda::createHarrisCorner

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数创建一个 基于 Harris 算法的角点响应计算对象&#xff0c;专门用于在 GPU 上进行高效计算。 它返回的是一个 cv::Ptrcv::cuda::Cornernes…

html文字红色粗体,闪烁渐变动画效果

1. 代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>红色粗体闪烁文字表格</title><s…

Springboot独立学院资产管理系统k0o7w(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能:财务员,校级管理员,部门,部门管理员,资产类型,资产信息,资产调拨,资产申购,申购入库,资产出库,资产报废,资产维修,资产盘点,维修复审 开题报告内容 基于Spring Boot的独立学院资产管理系统开题报告 一、选题背景与意义 &#xff08;一&#xff0…

基于javaweb的SpringBoot药房管理系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

Web前端之隐藏元素方式的区别、Vue循环标签的时候在同一标签上隐藏元素的解决办法、hidden、display、visibility

MENU 标签区别速览详解✅ v-if✅ v-show✅ :style"{ display: ... }"⚠️ :hidden⚠️ :style"{ visibility: ... }" 总结 标签 <div v-for"item in list" v-if"item.isShow">{{item.name}}</div> <div v-for"it…

Kafka 安装教程(支持 Windows / Linux / macOS)

一、下载 1、kafka官网下载地址:https://kafka.apache.org/downloads 根据实际情况下载对应的版本 2、JDK的版本最好是17+ JDK下载地址:https://www.oracle.com/java/technologies/javase/jdk17-0-13-later-archive-downloads.html 二、安装 前置条件 安装 Java(至少 Jav…

Linux研学-用户解析

一 root用户 1 介绍 root是Linux系统中唯一的超级管理员账户&#xff0c;拥有系统的最高权限&#xff08;UID0&#xff09;&#xff0c;可执行任何操作&#xff0c;包括修改系统文件、安装/卸载软件、管理用户权限等。   如普通用户无法在根目录下创建文件&#xff0c;而roo…

设计模式系列(07):建造者模式(Builder)

本文为设计模式系列第7篇&#xff0c;聚焦创建型模式中的建造者模式&#xff0c;涵盖定义、原理、实际业务场景、优缺点、最佳实践及详细代码示例&#xff0c;适合系统学习与实战应用。 目录 1. 模式概述2. 使用场景3. 优缺点分析4. 实际应用案例5. 结构与UML类图6. 代码示例7…

HBuilder 发行Android(apk包)全流程指南

一、前言 小程序以其便捷性和轻量性受到越来越多开发者的青睐。HBuilder 作为一款强大的开发工具&#xff0c;为小程序开发提供了极大的便利。本文将详细介绍如何通过 HBuilder 完成小程序的开发与发行。 二、环境准备 1. 安装 HBuilder 访问 DCloud 官方网站&#xff0c;下…

React 18新特性介绍

React 18是React团队于2022年发布的一个重要版本&#xff0c;它引入了多项改进和新特性&#xff0c;在提升性能的同时也带来了一些使用上的变化。本文将全面介绍React 18的主要新特性&#xff0c;包括并发渲染、API更新、浏览器兼容性等重要内容&#xff0c;并通过代码示例说明…

设计模式——面向对象设计六大原则

摘要 本文详细介绍了设计模式中的六大基本原则&#xff0c;包括单一职责原则、开放封闭原则、里氏替换原则、接口隔离原则、依赖倒置原则和合成复用原则。每个原则都通过定义、理解、示例三个部分进行阐述&#xff0c;旨在帮助开发者提高代码的可维护性和灵活性。通过具体代码…

使用 So-VITS-SVC 实现明星声音克隆与视频音轨替换实战全流程

本文展示如何使用开源项目 so-vits-svc 实现声音克隆与视频音轨替换流程&#xff0c;适用于 AI 音频工程、声音合成等学习场景。所述内容仅限技术交流&#xff0c;禁止用于非法用途。 一、项目背景 此项目采用 so-vits-svc 4.1 开源框架&#xff0c;实现了“用明星声音替换视频…

【学习记录】深入解析 AI 交互中的五大核心概念:Prompt、Agent、MCP、Function Calling 与 Tools

&#x1f4cc; 引言 随着大语言模型&#xff08;LLM&#xff09;的发展&#xff0c;AI 已经不再只是“回答问题”的工具&#xff0c;而是可以主动执行任务、调用外部资源、甚至构建完整工作流的智能系统。 为了更好地理解和使用这些能力&#xff0c;我们需要了解 AI 交互中几…

纹理压缩格式优化

🎯 Unity 项目纹理压缩格式优化终极指南 ——不同平台、不同手机型号,如何正确选择 🧩 什么是纹理压缩(Texture Compression)? Texture压缩 = 减小显存占用,提升加载速度,减轻GPU负担纹理是游戏中最大资源,占用50%+内存正确压缩:减少GPU Bandwidth,提高渲染性能错…

Docker轻松搭建Neo4j+APOC环境

Docker轻松搭建Neo4jAPOC环境 一、简介二、Docker部署neo4j三、Docker安装APOC插件四、删除数据库/切换数据库 一、简介 Neo4j 是一款高性能的 原生图数据库&#xff0c;采用 属性图模型 存储数据&#xff0c;支持 Cypher查询语言&#xff0c;适用于复杂关系数据的存储和分析。…