当前位置:首页 > 每日看点 > 正文内容

怎样使用js解析word文档使它按原word文档的格式显示在网页上?

卡卷网8个月前 (01-19)每日看点197

那天听到隔壁组的技术领导在怒斥刚来的前端小白

我让你显示个docx的文件而已,你搞这么久还没搞出来?

你是怎么被招进来的?

前端小白默默地啥也没说。

听到这对话,我默默地打开了我的搜索引擎,写一篇文章记录下怎么使用 docx-preview 插件在前端页面展示 DOCX 文件

1. 引入必要的库

首先,需要引入 jszip.min.jsdocx-preview.min.js。这些库可以通过 CDN 或本地文件引入。

<script src="https://cdn.bootcdn.net/ajax/libs/jszip/3.10.0/jszip.min.js"></script> <script src="https://volodymyrbaydalka.github.io/docxjs/dist/docx-preview.min.js"></script>

2. HTML 结构

创建一个简单的 HTML 结构,包括一个文件输入框和一个用于显示预览的容器。

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>DOCX 文件预览</title> </head> <body> <div id="app"> <input type="file" @change="upload"> <div ref="file"></div> </div> <script src="https://cdn.bootcdn.net/ajax/libs/jszip/3.10.0/jszip.min.js"></script> <script src="https://volodymyrbaydalka.github.io/docxjs/dist/docx-preview.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script> var app = new Vue({ el: '#app', data: { file: null }, methods: { // 通过 input 预加载展示文档 upload(e) { this.file = e.target.files[0]; docx.renderAsync(this.file, this.$refs.file); } } }); </script> </body> </html>

3. Vue.js 示例

如果你使用 Vue.js,可以更方便地管理文件上传和预览。以下是一个完整的 Vue.js 示例[^39^]:

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>DOCX 文件预览</title> </head> <body> <div id="app"> <input type="file" @change="upload"> <div ref="file"></div> </div> <script src="https://cdn.bootcdn.net/ajax/libs/jszip/3.10.0/jszip.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script src="https://volodymyrbaydalka.github.io/docxjs/dist/docx-preview.min.js"></script> <script> var app = new Vue({ el: '#app', data: { file: null }, methods: { // 通过 input 预加载展示文档 upload(e) { this.file = e.target.files[0]; docx.renderAsync(this.file, this.$refs.file); }, // 直接请求本地文档 getApi(path) { let _that = this; let xhr = new XMLHttpRequest(); xhr.open('GET', path, true); xhr.responseType = 'blob'; xhr.onload = function (e) { if (this.status == 200) { let blob = new Blob([this.response], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' }); docx.renderAsync(blob, _that.$refs.file); } }; xhr.send(); } }, mounted() { this.getApi("./example.docx"); // 本地文档地址 } }); </script> </body> </html>

4. 样式调整

docx-preview 会自动生成一些样式,你可以根据需要进行调整。例如,去除背景灰边和阴影效果[^40^]:

<style> .docx-wrapper { background-color: #fff; padding: 0; } .docx-wrapper > section.docx { width: 100% !important; padding: 0rem !important; min-height: auto !important; box-shadow: none; margin-bottom: 0; } </style>

5. 使用 fetch 请求

如果你需要从服务器获取 DOCX 文件,可以使用 fetch API[^40^]:

function previewfile(item) { if (item.fileType == '.docx') { nextTick(() => { fetch(item.filePath) .then((response) => { let docData = response.blob(); let childRef = document.getElementsByClassName('childRef'); renderAsync(docData, childRef[0]).then((res) => { console.log('res---->', res); }); }) .catch((error) => { console.log(error); }); }); } else { ImageUrl.value = toRaw(item).filePath; } }

6. 完整的 Vue.js 示例

以下是一个完整的 Vue.js 示例,展示了如何从服务器获取 DOCX 文件并进行预览[^43^]:

<template> <div> <el-button @click="goPreview">点击预览 word 文件</el-button> <el-button @click="downLoad">点击下载 word 文件</el-button> <div class="docWrap"> <div ref="file"></div> </div> </div> </template> <script> import axios from "axios"; import { renderAsync } from 'docx-preview'; export default { methods: { // 预览 goPreview() { axios({ method: "get", responseType: "blob", // 因为是流文件,所以要指定 blob 类型 url: "http://ashuai.work:10000/getDoc", // 自己的服务器,提供的一个 word 下载文件接口 }).then(({ data }) => { renderAsync(data, this.$refs.file); // 渲染到页面 }); }, // 下载 downLoad() { axios({ method: "get", responseType: "blob", // 因为是流文件,所以要指定 blob 类型 url: "http://ashuai.work:10000/getDoc", // 自己的服务器,提供的一个 word 下载文件接口 }).then(({ data }) => { const blob = new Blob([data]); // 把得到的结果用流对象转一下 var a = document.createElement("a"); // 创建一个 <a></a> 标签 a.href = URL.createObjectURL(blob); // 将流文件写入 a 标签的 href 属性值 a.download = "出师表.docx"; // 设置文件名 a.style.display = "none"; // 隐藏 a 标签 document.body.appendChild(a); // 将 a 标签追加到文档对象中 a.click(); // 模拟点击 a 标签,会触发 a 标签的 href 的读取,浏览器就会自动下载了 a.remove(); // 一次性的,用完就删除 a 标签 }); }, }, }; </script> <style lang="less" scoped> .docWrap { width: 900px; overflow-x: auto; } </style>

扫描二维码推送至手机访问。

版权声明:本文由卡卷网发布,如需转载请注明出处。

本文链接:https://www.kajuan.net/ttnews/2025/01/10099.html

分享给朋友:

相关文章

创业容易吗?

创业容易吗?创建企业不一定是困难或令人生畏的。它可以从一个简单但有力的想法开始,比如小强意识到,如果洗手液能杀死真菌,尤其是拳击台上的真菌,就会更加有用。创业确实需要奉献精神、努力工作和仔细规划——这是没有办法的。虽然这本身可能并不容易,但...

如果我们没有自己的手机操作系统,会出现所谓的“卡脖子”“安全”问题吗?

如果我们没有自己的手机操作系统,会出现所谓的“卡脖子”“安全”问题吗?

前段时间某某高管在微博发文表示:“其实我觉得,中国人需要的不是一个自己的手机os,而是一个全国产的微信,再搭配一些辅助功能。”这算是“安卓开源”开源的代表了吧。然而打脸来的如此之快,10月30日消息,在Linux内核疑似大规...

支付宝碰一碰市场如何?

支付宝碰一碰市场如何?

今年,支付宝又整了新的大活,即无须扫码即能完成支付操作的“支付宝碰一碰”正式登场。下面就来给大家分析分析,这是个什么情况,为什么都在说能赚钱。支付宝碰一下怎么赚钱的?都有谁能赚到这份钱?1.支付宝碰一下原理支付宝碰一下的本质依旧是“条码支付...

4499 元起的荣耀Magic7 系列实际使用体验怎么样,值得入手吗?

全是软文。。。。。。不过我买了,标准版。为什么买荣耀:屏幕看着舒服,玩游戏选择大屏,超声波指纹解锁。其它,系统、续航、充电、拍照,不是最强,但均衡下来短板都不是很短。其它米OV,IQ、一加,都看了,预算有限,米OV的小屏不感兴趣,OPPO硬...

抖音上有一些账号搬运别人的视频,几乎一模一样,也没判搬运,他们是怎么做到的??

对于任何短视频平台来说,如何用最低的成本快速实现伪原创搬运都是需要解决的问题。所有的短视频平台,包括抖音、快手、tiktok、视频号、小红书、B站,甚至是FB、推特、INS、YouTube,它们的查重技术都是类似的,只要你在网络环境设置得当...

为什么神经网络可以解偏微分方程,是什么原理?

为什么神经网络可以解偏微分方程,是什么原理?

题主一直比较关心神经网络在其他科学领域的应用,比如数学、物理学还有生物学,比如AlphaFold。本次带来的这篇文章傅里叶神经网络算子解偏微分方程就是一个很有意思的方向,其实我自己去年在给美国一个客户做兼职预测数字货币期权价格的时候就用到过...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。