ARTICLE · 1062298
Vue 纯前端 Office 预览实战:Word / Excel / PPT / PDF 方案选型
做后台、OA、合同管理、知识库时,几乎都会遇到同一个需求:用户在浏览器里直接预览 Word / Excel / PPT / PDF,而不是下载后用本地 Office 打开。若希望不依赖后端转码、不部署 OnlyOffice 服务,Vue 项目里有哪些「纯前端」路线?本文按可落地程度整理主流方案,并给出 Vue 3 接入模板。

图1:Vue 纯前端 Office 四类文件预览全景
一、为什么优先看 @vue-office
在 Vue 生态里,@vue-office 系列是目前集成度最高的纯前端预览方案之一:按格式拆包,组件化接入,底层分别基于 docx-preview、exceljs、pptx 解析与 pdf.js 等能力封装。
@vue-office/docx | ||
@vue-office/excel | ||
@vue-office/pdf | ||
@vue-office/pptx |
二、数据怎么进组件:URL 与 ArrayBuffer

图2:纯前端预览典型数据流
@vue-office 组件统一吃 src:可以是文件 URL(需 CORS 允许),也可以是 ArrayBuffer(本地上传最常用)。推荐生产环境对鉴权文件先 axios 拉二进制,再传 ArrayBuffer,避免把带 Token 的 URL 暴露给第三方 iframe。
# 按格式按需安装(Vue 3 项目)npm install @vue-office/docx vue-deminpm install @vue-office/excel vue-deminpm install @vue-office/pdf vue-deminpm install @vue-office/pptx vue-demi/** 根据后缀动态渲染 docx / excel / pdf / pptx */<template> <div class="office-preview" v-loading="loading"> <VueOfficeDocx v-if="type==='docx'" :src="buffer" @rendered="onRendered" @error="onError" /> <VueOfficeExcel v-if="type==='xlsx'" :src="buffer" @rendered="onRendered" @error="onError" /> <VueOfficePdf v-if="type==='pdf'" :src="buffer" @rendered="onRendered" @error="onError" /> <VueOfficePptx v-if="type==='pptx'" :src="buffer" @rendered="onRendered" @error="onError" /> </div></template><script setup>import { ref, watch } from 'vue'import VueOfficeDocx from '@vue-office/docx'import VueOfficeExcel from '@vue-office/excel'import VueOfficePdf from '@vue-office/pdf'import VueOfficePptx from '@vue-office/pptx'import '@vue-office/docx/lib/index.css'import '@vue-office/excel/lib/index.css'const props = defineProps({ fileUrl: String, fileType: String })const buffer = ref(null)const loading = ref(false)const type = ref('')/** 拉取远程文件为 ArrayBuffer,供 vue-office 解析 */async function loadFile(url) { loading.value = true try { const res = await fetch(url, { credentials: 'include' }) buffer.value = await res.arrayBuffer() type.value = props.fileType } finally { loading.value = false }}function onRendered() { /* 示例:预览完成,可关闭 loading */ }function onError(e) { console.error('预览失败', e) }watch(() => props.fileUrl, (url) => url && loadFile(url), { immediate: true })</script>/** 将用户选择的 File 转为 ArrayBuffer 并识别后缀 */function handleUpload(file) { const ext = file.name.split('.').pop()?.toLowerCase() const reader = new FileReader() reader.onload = () => { buffer.value = reader.result type.value = ext === 'doc' ? 'docx' : ext // .doc 需后端转 docx } reader.readAsArrayBuffer(file)}三、其他纯前端路线(何时不用 vue-office)

图3:Office 预览常见方案对比
| @vue-office | ||
选型建议:Vue 3 后台、格式以 Office 2007+ 为主、希望快速上线 → 优先 @vue-office。若只要 Word 转 HTML、样式要求不高,可单独用 mammoth;Excel 只做数据表格、不做复杂样式,可用 xlsx 读数据后自绘表格。
四、按格式的注意点
Word(docx)
页眉页脚、复杂排版、嵌入字体可能偏差;.doc 二进制格式不支持,需服务端先转 docx。大文档建议分页或限制文件大小(如 ≤10MB)。
Excel(xlsx)
多 Sheet 可切换;合并单元格、条件格式大体可用,宏、数据透视表、复杂图表可能无法还原。超宽表记得容器加横向滚动。
PPT(pptx)
静态幻灯片预览尚可;动画、切换、音视频支持弱,重要汇报类 PPT 建议转 PDF 或走 OnlyOffice。
纯前端最成熟;注意 wasm/ worker 体积,可按需 CDN。加密 PDF 需密码或后端解密后再传 ArrayBuffer。
五、生产环境踩坑清单


图4:纯前端 Office 预览常见踩坑
六、推荐工程结构
- 独立路由
/preview/:fileId,预览页按需 import 对应 @vue-office 包。 - 统一 FileService
:封装「根据 fileId 换 ArrayBuffer」,组件只关心 buffer + type。 - 后缀白名单
:docx / xlsx / pptx / pdf,其它格式提示下载或走转码接口。 - 埋点
:记录 rendered/error,便于统计失败率与文件特征。
七、总结
Vue 纯前端 Office 预览的可行路径,是以 @vue-office 为代表的「浏览器内解析 + 组件渲染」。它适合内网后台、标准 OpenXML、快速交付;不适合像素级排版、复杂 PPT 动画、超大文件、老式 .doc 等场景——后者请转 PDF 或部署文档服务。
落地时记住三件事:ArrayBuffer 接入鉴权文件、按格式控制预期、限制文件大小并懒加载组件。做到这三点,大多数 OA / 知识库预览需求可以在纯前端闭环。


往期回顾:
2、前端常用插件清单:从构建到 UI,一篇讲清楚它们是干什么的