项目当中经常会遇到文件需要预览的功能,大多数是 pdf
、word
、excel
、img
等类型,pdf
类型的文件预览方式很多,也很简单,主要是word
和excel
类型的文件,大多数支持docx
和xlsx
类型的,之前doc
和xls
类型的支持的比较少。下面介绍几种预览的方式,每种方式都有有优缺点,按需求选择。
1. vue-office 插件
vue-office 这个插件使用起来方便,可以网络地址,也可以二进制预览。
支持类型
:docx
、xlsx
、xls
、pptx
。
缺点
:
xls
类型需要加单独的配置,xlsx
类型不需要单独加配置,2者复杂样式都会有问题。pptx
类型的预览比较慢。
安装插件
#docx文档预览组件
npm install @vue-office/docx vue-demi@0.14.6
#excel文档预览组件
npm install @vue-office/excel vue-demi@0.14.6
#pdf文档预览组件
npm install @vue-office/pdf vue-demi@0.14.6
#pptx文档预览组件
npm install @vue-office/pptx vue-demi@0.14.6
vue2.6以下的还需要的单独安装一个插件 @vue/composition-api
npm install @vue/composition-api
使用方式一(网络地址)
<template>
<vue-office-pdf :src="pdfUrl" style="height: 100vh" @rendered="renderedHandler" @error="errorHandler"/>
<vue-office-docx :src="docxUrl" style="height: 100vh" />
<vue-office-excel :src="xlsxUrl" style="height: 100vh" />
<vue-office-excel :options="options" :src="xlsUrl" style="height: 100vh" />
<vue-office-pptx :src="pptxUrl" style="height: 100vh" />
</template>
<script setup>
//引入VueOfficeDocx组件
import VueOfficeDocx from '@vue-office/docx'
import '@vue-office/docx/lib/index.css'
//引入VueOfficePdf组件
import VueOfficePdf from '@vue-office/pdf'
//引入VueOfficeExcel组件
import VueOfficeExcel from '@vue-office/excel'
import '@vue-office/excel/lib/index.css'
//引入VueOfficePptx组件
import VueOfficePptx from '@vue-office/pptx'
let pdfUrl = ref('https://501351981.github.io/vue-office/examples/dist/static/test-files/test.pdf')
let docxUrl = ref('https://501351981.github.io/vue-office/examples/dist/static/test-files/test.docx')
let xlsxUrl = ref('https://501351981.github.io/vue-office/examples/dist/static/test-files/test.xlsx')
let xlsUrl = ref('https://501351981.github.io/vue-office/examples/dist/static/test-files/test.xls')
let pptxUrl = ref('https://501351981.github.io/vue-office/examples/dist/static/test-files/test.pptx')
// 如果是xls文件一定要加这个配置
let options = {
xls: true, //预览xlsx文件设为false;预览xls文件设为true
minColLength: 0, // excel最少渲染多少列,如果想实现xlsx文件内容有几列,就渲染几列,可以将此值设置为0.
minRowLength: 0, // excel最少渲染多少行,如果想实现根据xlsx实际函数渲染,可以将此值设置为0.
widthOffset: 10, //如果渲染出来的结果感觉单元格宽度不够,可以在默认渲染的列表宽度上再加 Npx宽
heightOffset: 10, //在默认渲染的列表高度上再加 Npx高
beforeTransformData: (workbookData) => { return workbookData }, //底层通过exceljs获取excel文件内容,通过该钩子函数,可以对获取的excel文件内容进行修改,比如某个单元格的数据显示不正确,可以在此自行修改每个单元格的value值。
transformData: (workbookData) => { return workbookData }, //将获取到的excel数据进行处理之后且渲染到页面之前,可通过transformData对即将渲染的数据及样式进行修改,此时每个单元格的text值就是即将渲染到页面上的内容
}
const renderedHandler = () => {
console.log('渲染完成')
}
const errorHandler = () => {
console.log('渲染失败')
}
</script>
每个组件都可以添加 rendered(渲染完成)
和 error(渲染失败)
事件。
如果是 xls
文件一定要加 options
配置, 将里面的 xls
属性设置为 true
。
使用方式二(上传文件)
<template>
<input type="file" @change="changeHandle"/>
<vue-office-docx :src="docxUrl" style="height: 100vh" />
</template>
<script setup>
//引入VueOfficeDocx组件
import VueOfficeDocx from '@vue-office/docx'
import '@vue-office/docx/lib/index.css'
let docxUrl = ref('')
const changeHandle = (event) => {
let file = event.target.files[0]
let fileReader = new FileReader()
fileReader.readAsArrayBuffer(file)
fileReader.onload = () => {
docxUrl.value = fileReader.result
}
}
</script>
使用方式三(请求的数据)
<template>
<vue-office-docx :src="docxUrl" style="height: 100vh" />
</template>
<script setup>
//引入VueOfficeDocx组件
import VueOfficeDocx from '@vue-office/docx'
import '@vue-office/docx/lib/index.css'
let docxUrl = ref('')
onMounted(() => {
getDocxUrl()
})
const getDocxUrl = () => {
fetch('请求地址').then(res => {
//读取文件的arrayBuffer
res.arrayBuffer().then(res=>{
docxUrl.value = res
})
})
}
</script>
2. iframe + Microsoft Office Viewer服务
这种方式不需要安装插件,支持的文件类型比较多,加载速度快,还原度高。
<template>
<iframe :src="url" frameborder="0" style="width: 100%;height: 100vh;"></iframe>
</template>
<script setup>
let ctx = 'https://view.officeapps.live.com/op/view.aspx?src='
let url = ref('')
onMounted(() => {
// 通过 encodeURIComponent 对特殊字符进行编码
url.value = ctx + encodeURIComponent('文件地址')
})
</script>
支持类型
:doc
、docx
、xlsx
、xls
、pptx
、ppt
。
缺点
:
- 不支持
iframe
访问)- 不支持文件流的方式预览。
- 文件会传输到微软的服务器上,因此可能会涉及到文件隐私。
3. kkFileView
kkFileView
这种方式功能是最为全面的,支持的文件类型也非常多,唯一的缺点就是需要后端部署一个服务,前端调用后端给出的预览接口就可以。
支持的文档类型
- 支持 doc, docx, xls, xlsx, xlsm, ppt, pptx, csv, tsv, dotm, xlt, xltm, dot, dotx,xlam, xla 等 Office 办公文档
- 支持 wps, dps, et, ett, wpt 等国产 WPS Office 办公文档
- 支持 odt, ods, ots, odp, otp, six, ott, fodt, fods 等OpenOffice、LibreOffice 办公文档
- 支持 vsd, vsdx 等 Visio 流程图文件
- 支持 wmf, emf 等 Windows 系统图像文件
- 支持 psd 等 Photoshop 软件模型文件
- 支持 pdf ,ofd, rtf 等文档
- 支持 xmind 软件模型文件
- 支持 bpmn 工作流文件
- 支持 eml 邮件文件
- 支持 epub 图书文档
- 支持 obj, 3ds, stl, ply, gltf, glb, off, 3dm, fbx, dae, wrl, 3mf, ifc, brep, step, iges, fcstd, bim 等 3D 模型文件
- 支持 dwg, dxf 等 CAD 模型文件
- 支持 txt, xml(渲染), md(渲染), java, php, py, js, css 等所有纯文本
- 支持 zip, rar, jar, tar, gzip, 7z 等压缩包
- 支持 jpg, jpeg, png, gif, bmp, ico, jfif, webp 等图片预览(翻转,缩放,镜像)
- 支持 tif, tiff 图信息模型文件
- 支持 tga 图像格式文件
- 支持 svg 矢量图像格式文件
- 支持 mp3,wav,mp4,flv 等音视频格式文件
- 支持 avi,mov,rm,webm,ts,rm,mkv,mpeg,ogg,mpg,rmvb,wmv,3gp,ts,swf 等视频格式转码预览
前端调用方式
//要预览文件的访问地址
let url = 'http://127.0.0.1:8080/file/test.txt';
// http://127.0.0.1:8012/onlinePreview 这个是后端给的预览接口
window.open('http://127.0.0.1:8012/onlinePreview?url=' + encodeURIComponent(Base64.encode(previewUrl)));
其余单个预览某种类型文件的插件就不介绍了,可以搜索出来很多个,后面又更好用的就继续更新。