React纯前端生成word文档(支持多图片导出)

  • 前言
    • 准备工作
    • 代码实现
    • 结语
    • 参考

前言

作为一个入职不就的前端小白来说,前段时间的项目中老大提了一个在我看来十分无理的需求,对!无理。他要求我用纯前端实现一个word文档导出功能,并且附模板。我当即就否决了他(这压根就触及到我知识盲区了…),随后他在长达两个半小时对我的思(hu)想(shuo)教(ba)育(dao)中。我当然是还是选择妥协了(毕竟自己老大我只能惯着啊…)。

准备工作

整个功能用到的相关技术还是比较多的,毕竟涉及到文件操作不是自己手撸封装的,自然得装不少轮子,其中最重要的是docxtemplater(重要归重要,这玩意儿得文档写的就是个坑)毕竟是个付费版,docxtemplater-image-module-free这个是个开源版本,他俩文档一样,但是少一个都不行。后来我用我仅有的两根脑神经理解了一下,后边这个是前边那个开源的一个图片导出的功能模块(毕竟前边那个是付费版…):

//-- 安装 docxtemplater
npm install docxtemplater pizzip  --save
//-- 安装 jszip-utils
npm install jszip-utils --save
//-- 安装 jszip
npm install jszip --save
//-- 安装 FileSaver
npm install file-saver --save
//安装 docxtemplater-image-module-free
npm install --save docxtemplater-image-module-free

代码实现

装好插件以后按照惯例开头引入组件页面,需要注意docxtemplater-image-module-free用Import引入可能会报错,需要换成require方式:

import docxtemplater from 'docxtemplater'
import PizZip from 'pizzip'
import JSZipUtils from 'jszip-utils'
import { saveAs } from 'file-saver'
import ImageModule from 'docxtemplater-image-module-free' //这句是导出图片用的
/*
上边这行代码不好使的情况下需要用var ImageModule = require('docxtemplater-image-module-free')
*/

为了方便理解,生成word文档和生成图片分开写,首先写一个纯文本的word导出。写一个函数以便调用。

/*********base64DataURLToArrayBuffer函数代码块--导出图片函数编写位置********
*/
function exportWord() {// 设置模板变量的值,这个就是模板里所插入的内容数据,根据需要写成动态就好了。var wordData = {textcontents:'123456789',//images: DataUrl //图片导出功能};// 读取并获得模板文件的二进制内容,是docxtemplater提供的固定写法JSZipUtils.getBinaryContent("/exportTemplate.docx", function (error, content) {// exportTemplate.docx是模板,React写在public里。我们在导出的时候,会根据此模板来导出对应的数据//图片导出功能/*var opts = {}opts.centered = false; //Set to true to always center imagesopts.fileType = "docx"; //Or pptxopts.getImage = function (chartId) {return base64DataURLToArrayBuffer(chartId);}//Pass the function that return image sizeopts.getSize = function () {return [450, 450];}var imageModule = new ImageModule(opts);*/// 抛出异常if (error) {throw error;}// 创建一个PizZip实例,内容为模板的内容let zip = new PizZip(content);// 创建并加载docxtemplater实例对象let doc = new docxtemplater()//.attachModule(imageModule) //图片导出功能.loadZip(zip).compile();// 生成一个代表docxtemplater对象的zip文件(不是一个真实的文件,而是在内存中的表示)doc.resolveData(wordData).then(function () {console.log('ready');doc.render();var out = doc.getZip().generate({type: "blob",mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",});// 将目标文件对象保存为目标类型的文件,并命名(起一个自己需要的名字就好了)saveAs(out, "导出文件名.docx");})});}

然后再随便撸个div简单写个按钮调用函数:

 <div className="App"><button type="info" onClick={exportWord} >导出word文档</button></div>

到这里需要写一下word模板(光有代码没有容器是导不出来文件的/手动微笑),直接在{}中写入模板变量,导出后会自动插入,文字大小,格式可以在word里设置:

导出后效果:

能成功导出文字模板这事儿就算成了,写下来就考虑怎么把图片搞进来(其实单图导出和多图的导出差不多,只要弄明白数据格式就可以。)
以下是两张base64的图片地址,图片的话需要处理成base64格式才能用,不然导出后图片可能会不显示:

const DataUrl = [{src: 'data:image/jpeg;base64,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'},{src: 'data:image/png;base64,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'}
]

有了base64的图片地址以后,需要调用docxtemplater提供的base64DataURLToArrayBuffer方法把地址处理成ArrayBuffer才能正常导出图片,否自会出现报错。(函数写的位置在之前代码中注释出来了

  function base64DataURLToArrayBuffer(dataURL) {console.log(dataURL);const base64Regex = /^data:image\/(png|jpg|svg|jpeg|svg\+xml);base64,/;if (!base64Regex.test(dataURL)) {return false;}const stringBase64 = dataURL.replace(base64Regex, "");let binaryString;if (typeof window !== "undefined") {binaryString = window.atob(stringBase64);} else {binaryString = new Buffer(stringBase64, "base64").toString("binary");}const len = binaryString.length;const bytes = new Uint8Array(len);for (let i = 0; i < len; i++) {const ascii = binaryString.charCodeAt(i);bytes[i] = ascii;}return bytes.buffer;}

做完这些以后,把之前纯文本导出的代码中带*//图片导出功能*的注释取消注释功能就实现了,最后记得把word模板做如下修改(有了代码还得有容器才能导出word呢):

结语

回头写这篇博客的时候,才发现这个功能实现起来是真的简单…

参考

https://blog.csdn.net/meimeilive/article/details/103150412
https://blog.csdn.net/weixin_43753330/article/details/103461870
https://docxtemplater.readthedocs.io/en/latest/index.html

React纯前端生成word文档(支持多图片导出)相关推荐

  1. Java使用FreeMarker自动生成Word文档(带图片和表单)

    Java使用FreeMarker自动生成Word文档(带图片和表单) 1 背景 2 目标效果 3 创建Word模板 3.1 创建模板文档 3.2 转换模板文档 3.3 处理模板文档中的占位符 3.4 ...

  2. 用Aspose.Words for .NET动态生成word文档中的图片或水印

    1.概述 在项目中生成word文档,这个功能很普遍的,一般生成都是纯文字或是列表的比较多,便于客户打印,而要把图片也生成到word文档中的需求有些客户也是需要的,例如产品图片.这次我们介绍的是如何利用 ...

  3. freemarker+Jfreechart生成Word文档(含图片)

    这几天再弄一个报表,要统计一些信息最终的部分展示结果如下: 基本工具freemarker,jfreechart 工程的部分结构如下 与生成Word有关的类主要有FreemarkerConfigurat ...

  4. poi生成word文档,插入图片,echar报表生成到word,word表格

    poi生成word文档,word表格,将echar报表生成到word 项目中用到生成word报表,报表中有表格的合并 .页眉.表格中会有报表图片.然后查找了网上的资料,利用echar生成柱状图,然后已 ...

  5. Javascript 前端生成Word文档

    最近做项目遇到要在Web上生成Word文件的需求.一般方案是用报表系统或者在后台生成.由于报表系统中生成的页面再转换成Word难以排版,这里就用前端生成的办法作为临时解决方案.直接上代码了,提供文字排 ...

  6. java 生成word_Java Web 生成Word文档(freemarker方式)

    首先在pom文件中加入下面这个依赖(不是Maven项目的话,把jar包导入项目即可) org.freemarker freemarker 2.3.23 1.创建带有格式的word文档,将该需要动态展示 ...

  7. Android 使用模板生成Word文档,支持手机直接查看word

    最近在项目工作中,碰到一个很棘手的需求,说是要在手机端根据模板生成word文档,而且不借助第三方的软件可以查看word文档,一开始听这个需求差不多蒙了,这要怎么做,为什么不把生成word文档这个工作放 ...

  8. Aspose.Words简单生成word文档

    Aspose.Words简单生成word文档 Aspose.Words.Document doc = new Aspose.Words.Document(); Aspose.Words.Documen ...

  9. 根据标准word模板生成word文档类库(开源)

    前言   最近因项目需要要自定义标准word模板,并以编码方式操作word模板.填充数据和生成word文档,于是自己写了条小"内裤"来实现这个功能.该"内裤"只 ...

  10. Java通过freemarker生成word文档

    文档生成目录 摘要 项目预期效果 使用freemaker生成word文档并下载 一:导入所需要的maven依赖 二:根据word文档生成我们需要的ftl模板文件 三:将word需要的数据存入一个map ...

最新文章

  1. php实现无限分类超牛逼,PHP超牛逼无限极分类生成树方法_php技巧
  2. 2017年7月十三日正式开始记录
  3. mac 使用svn记录
  4. excel 粘贴到web_最新技术让excel秒变web数据库
  5. c#读取Sybase中文乱码的解决办法
  6. linux win32disk,windows使用Win32DiskImager安装树莓派系统
  7. nyoj1306海拔
  8. spring连数据库的配置文件(applicationContext.xml)
  9. Flutter GetX 状态管理 使用入门 程序计数器 (二)
  10. 华扬联众携手搜狗,助雅诗兰黛跃居女神节“C位”
  11. curl 没有到主机的路由_安装RaspAP将树莓派变身为无线路由器
  12. phpstrom查看代码总行数_程序员实用工具,推荐一款代码统计神器GitStats
  13. SQLServer------Sql Server性能优化辅助指标SET STATISTICS TIME ON和SET STATISTICS IO ON
  14. Express高效查询纯真IP库插件lib-qqwry
  15. 未来物联网的一些问题
  16. n个单词输入次数 c语言,C语言问题,从键盘输入n个英语单词.输入格式为n,w1,w2,w3…wn,其中n表示随后输入的英语...
  17. github上很好的iOS资源集锦
  18. 流式计算利器-Storm
  19. 如何用Python+统计学,进行数据分析
  20. openCV中基于HSV的颜色判断(红色为例)

热门文章

  1. 数据时代的我们,应该拥有的大数据思维
  2. 基于Vue的移动端图片裁剪组件 vue-clip(完美兼容ios与安卓)
  3. eventFilter能进入dragEnter但没有event::drog
  4. 信息系统安全等级保护 备案表
  5. 如何查找计算机主机地址,ip地址查询 怎么查询电脑IP地址?
  6. [转]NHibernate中DateTime,int,bool空值的处理方法
  7. ArcMap进行标记符号制作
  8. 基于PTPX的功耗分析
  9. failed to locate @import file common/stylus/variable.styl
  10. C语言 取绝对值函数abs()使用及注意事项