当前位置: 首页 > news >正文

React实现在线预览word报告/本地选择报告预览

标题使用的核心技术点是docx-preview,读取到文件的File对象,用File去做文件展示,这里是才用将文件转base64字符串存储到localStorage中

在线预览word报告且包含word样式

  1. 下载需要使用的min.js文件进项目的public目录中(上zip已包含以下pulib内的js/css文件)
    在这里插入图片描述
    2.在public文件目录下新建html,命名为docpreview.html
    3.在html中引入public下的资源
<linkhref="./docx-preview/bootstrap.min.css"rel="stylesheet"integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3"crossorigin="anonymous"/><scriptsrc="./docx-preview/bootstrap.bundle.min.js"integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p"crossorigin="anonymous"></script><script src="./docx-preview/jszip.min.js"></script><script src="./docx-preview/docx-preview.min.js"></script><script src="./docx-preview/thumbnail.example.js"></script><link href="./docx-preview/thumbnail.example.css" rel="stylesheet" /><script crossorigin src="./docx-preview/tiff.js"></script><script src="./docx-preview/tiff-preprocessor.js"></script>

4.创建dom去展示对应的docx文件

<body class="vh-100 d-flex flex-column"><div class="flex-grow-1 d-flex flex-row" style="height: 0"><divid="document-container"class="overflow-auto flex-grow-1 h-100"></div></div></body>

5.创建一个基于Web的文档查看器,用于查看和预览Microsoft Word文档。

1.获取当前文档(currentDocument):通过document.querySelector(‘#document-container’)获取一个用于显示文档内容的HTML元素。

2.设置docx选项:使用Object.assign()方法将docx.defaultOptions与一个包含debug和experimental属性值的对象进行合并。

3.获取加载按钮(loadButton):通过document.querySelector(‘#loadButton’)获取一个用于加载文档的按钮。

4.定义renderDocx函数:一个异步函数,用于渲染Word文档。它接受一个文件参数(file),将其转换为Blob对象,然后使用docx.renderAsync()方法将其渲染到指定的容器中。同时,它还调用renderThumbnails()函数来生成文档的缩略图。

5.处理加载文档按钮的点击事件:当用户点击加载按钮时,调用renderDocx()函数并传入当前文档

<script>let currentDocument = nullconst docxOptions = Object.assign(docx.defaultOptions, {debug: true,experimental: true})const container = document.querySelector('#document-container')const loadButton = document.querySelector('#loadButton')async function renderDocx(file) {currentDocument = fileif (!currentDocument) returnlet docxBlob = preprocessTiff(currentDocument)let res = await docx.renderAsync(docxBlob, container, null, docxOptions)renderThumbnails(container,document.querySelector('#thumbnails-container'))}</script>

6.读取本地存储的文件base64并展示

<script>// base64Data是从后端接收到的Base64字符串const base64String = localStorage.getItem('base64String')// 将Base64字符串转换为Blob对象const byteCharacters = atob(base64String)const byteNumbers = new Array(byteCharacters.length)for (let i = 0; i < byteCharacters.length; i++) {byteNumbers[i] = byteCharacters.charCodeAt(i)}const byteArray = new Uint8Array(byteNumbers)const blob = new Blob([byteArray], { type: 'application/octet-stream' })// 将 Blob 对象转换为 File 对象const file = new File([blob], 'example.docx', {type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'})//调用方法renderDocx(file)</script>

7.触发预览按钮的事件

  //预览报告function previewReportRequest() {setsubmitLoading(true)asyncActionCreators.previewReport({ id: ID }).then((response) => {setsubmitLoading(false)if (response?.data?.code === 0) {localStorage.setItem('base64String', response?.data?.data)//存好之后,跳转到预览页面const htmlFilePath = `${window.location.origin}/docpreview.html`openHtmlFileInNewTab(htmlFilePath)} else {message.warning(response.data.msg || '获取报告失败')}})}const openHtmlFileInNewTab = (url) => {const anchor = document.createElement('a')anchor.href = urlanchor.target = '_blank'anchor.rel = 'noopener noreferrer'anchor.click()}

本地选择文件后预览需做以下改动

1.设一个input选取文件

<input type="file" accept=".docx" onChange={handleLocalFilePreview} />

2.添加文件选择方法

const handleLocalFilePreview = (event) => {const file = event.target.files[0]const reader = new FileReader()// 将 Blob 数据编码为 Base64 字符串reader.onload = (event) => {const base64String = event.target.resultlocalStorage.setItem('base64String', base64String)}reader.readAsDataURL(file)}

3.预览按钮的事件 openHtmlFileInNewTab同在线预览

  const docxPreview = () => {const htmlFilePath = `${window.location.origin}/docpreview.html`openHtmlFileInNewTab(htmlFilePath)}

4.html文件需要改变方法

<script>//==========之前的===========//获取存储的blob的base64字符串const base64String = localStorage.getItem('base64String')// 将 Base64 字符串解码为 Blob 对象const byteCharacters = atob(base64String?.split(',')?.[1])const byteNumbers = new Array(byteCharacters.length)for (let i = 0; i < byteCharacters.length; i++) {byteNumbers[i] = byteCharacters.charCodeAt(i)}const byteArray = new Uint8Array(byteNumbers)const blob = new Blob([byteArray])const file = new File([blob], 'example.docx', {type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'})// 将 Blob 对象转换为 File 对象const file = new File([blob], 'example.docx', {type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'})//调用方法renderDocx(file)</script>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • LabVIEW调用DLL时需注意的问题
  • 文件IOoooo
  • 计算机网络 —— 数据链路层(以太网)
  • adb 脚本化Android系统截图和录屏
  • Python的Pillow(图像处理库)非常详细的学习笔记
  • 【HarmonyOS】鸿蒙应用子模块module资源如何获取
  • 【人工智能】ChatGPT基本工作原理
  • 【C语言】一篇带你高强度解析精通 字符串函数和内存函数 (万字总结大全,含思维导图)(建议收藏!!!)
  • qt qDebug兼容LOGE
  • Hive的安装与配置
  • 十二 nginx中location重写和匹配规则
  • 《科技与金融》是什么级别的期刊?是正规期刊吗?能评职称吗?
  • 移动机器人解决方案-MRC5000控制系统无人清扫车
  • oracle10g的dataguard测试
  • 第一章 - 第6节- 数制转换 - 课件
  • 230. Kth Smallest Element in a BST
  • Angular 2 DI - IoC DI - 1
  • Angular2开发踩坑系列-生产环境编译
  • Fabric架构演变之路
  • Redis中的lru算法实现
  • Spark学习笔记之相关记录
  • Tornado学习笔记(1)
  • 从重复到重用
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 正则表达式
  • 白色的风信子
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 如何在招聘中考核.NET架构师
  • ​数据结构之初始二叉树(3)
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • #FPGA(基础知识)
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (03)光刻——半导体电路的绘制
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (STM32笔记)九、RCC时钟树与时钟 第一部分
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (十三)Flink SQL
  • (十三)Maven插件解析运行机制
  • (一)Docker基本介绍
  • (正则)提取页面里的img标签
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (轉貼) UML中文FAQ (OO) (UML)
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • ./configure,make,make install的作用(转)
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .NET基础篇——反射的奥妙
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • :中兴通讯为何成功
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @reference注解_Dubbo配置参考手册之dubbo:reference