通过基于 jquery 下的文件 jquery.wordexport.js + 插件 file-saver 生成 word 文档。部分优化在代码的注释中。

index.html引入jquery,版本自定

index.html

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.0/jquery.min.js"></script>

通过npm下载 插件 file-saver

npm install file-saver

在当前文件夹新建文件命名为jquery.wordexport.js,优化了部分选项,代码如下:

  • htmlhead标签中添加word以页面视图展示。详见:https://blog.csdn.net/han_xiao_xiao/article/details/106139393
  • body中添加表格样式style
  • 文件中图片的src及Content-Location为同样的链接与之对应(原为base64的图片链接 改为 随机的10位字符串做引用,可以减少文件大小及部分word打开卡死的兼容问题)
  • 同样Content-Transfer-Encoding 会因为base64图片格式代码展示为一行可能导致部分word打开卡死问题,优化成每80个字符进行换行操作。
// `jquery.wordexport.js`
if (typeof jQuery !== 'undefined' && typeof saveAs !== 'undefined') {;(function ($) {$.fn.wordExport = function (fileName) {fileName =typeof fileName !== 'undefined' ? fileName : 'jQuery-Word-Export'var statics = {mhtml: {top:'Mime-Version: 1.0\nContent-Base: ' +location.href +'\nContent-Type: Multipart/related; boundary="NEXT.ITEM-BOUNDARY";type="text/html"\n\n--NEXT.ITEM-BOUNDARY\nContent-Type: text/html; charset="utf-8"\nContent-Location: ' +location.href +// '\n\n<!DOCTYPE html>\n<html>\n_html_</html>',/* html中添加打开word以页面视图展示 */'\n\n<!DOCTYPE html>\n<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">\n_html_</html>',head:// '<head>\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8">\n<style>\n_styles_\n</style>\n</head>\n',/* head中添加打开word以页面视图展示 */'<head>\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8">\n<style>\n_styles_\n</style>\n<!--[if gte mso 9]><xml><w:WordDocument><w:View>Print</w:View><w:TrackMoves>false</w:TrackMoves><w:TrackFormatting/><w:ValidateAgainstSchemas/><w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid><w:IgnoreMixedContent>false</w:IgnoreMixedContent><w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText><w:DoNotPromoteQF/><w:LidThemeOther>EN-US</w:LidThemeOther><w:LidThemeAsian>ZH-CN</w:LidThemeAsian><w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript><w:Compatibility><w:BreakWrappedTables/><w:SnapToGridInCell/><w:WrapTextWithPunct/><w:UseAsianBreakRules/><w:DontGrowAutofit/><w:SplitPgBreakAndParaMark/><w:DontVertAlignCellWithSp/><w:DontBreakConstrainedForcedTables/><w:DontVertAlignInTxbx/><w:Word11KerningPairs/><w:CachedColBalance/><w:UseFELayout/></w:Compatibility><w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel><m:mathPr><m:mathFont m:val="Cambria Math"/><m:brkBin m:val="before"/><m:brkBinSub m:val="--"/><m:smallFrac m:val="off"/><m:dispDef/><m:lMargin m:val="0"/> <m:rMargin m:val="0"/><m:defJc m:val="centerGroup"/><m:wrapIndent m:val="1440"/><m:intLim m:val="subSup"/><m:naryLim m:val="undOvr"/></m:mathPr></w:WordDocument></xml><![endif]--></head>\n',/* body中添加style表格样式 */body: `<body><style>table {border: 1px solid #a4a4a4;// border-collapse: collapse;border-spacing: 0;font-size: 12px;text-align: center;}th,td {padding:6pt 0;text-align: center;border: 1pt solid #a4a4a4;}</style>_body_</body>`,},}var options = {maxWidth: 600,}// Clone selected element before manipulating itvar markup = $(this).clone()// Remove hidden elements from the outputmarkup.each(function () {var self = $(this)if (self.is(':hidden')) self.remove()})// Embed all images using Data URLsvar images = Array()var img = markup.find('img')for (var i = 0; i < img.length; i++) {// Calculate dimensions of output imagevar w = Math.min(img[i].width, options.maxWidth)var h = img[i].height * (w / img[i].width)// Create canvas for converting image to data URLvar canvas = document.createElement('CANVAS')canvas.width = wcanvas.height = h// Draw image to canvasvar context = canvas.getContext('2d')context.drawImage(img[i], 0, 0, w, h)// Get data URL encoding of imagevar uri = canvas.toDataURL('image/png/jpg')// $(img[i]).attr('src', img[i].src)/* 原先是通过base64路径作为引用,文件较大且会有卡死问题,改为随机数作为引用 */$(img[i]).attr('src', Math.floor(Math.random() * 10000000000) + '.png')img[i].width = w / 1.5img[i].height = h / 1.5// Save encoded image to arrayimages[i] = {type: uri.substring(uri.indexOf(':') + 1, uri.indexOf(';')),encoding: uri.substring(uri.indexOf(';') + 1, uri.indexOf(',')),location: $(img[i]).attr('src'),data: uri.substring(uri.indexOf(',') + 1),}}// Prepare bottom of mhtml file with image datavar mhtmlBottom = '\n'for (var i = 0; i < images.length; i++) {mhtmlBottom += '--NEXT.ITEM-BOUNDARY\n'mhtmlBottom += 'Content-Location: ' + images[i].location + '\n'mhtmlBottom += 'Content-Type: ' + images[i].type + '\n'mhtmlBottom +='Content-Transfer-Encoding: ' + images[i].encoding + '\n\n'// mhtmlBottom += images[i].data + '\n\n'/* 原先为引用完的base64,不换行文件会有卡死问题,改为80字符换行且可行 */mhtmlBottom += images[i].data.replace(/.{80}/g, '$&\n') + '\n\n'}mhtmlBottom += '--NEXT.ITEM-BOUNDARY--'var styles = ''// Aggregate parts of the file togethervar fileContent =statics.mhtml.top.replace('_html_',statics.mhtml.head.replace('_styles_', styles) +statics.mhtml.body.replace('_body_', markup.html())) + mhtmlBottom// Create a Blob with the file contentsvar blob = new Blob([fileContent], {type: 'application/msword;charset=utf-8',})saveAs(blob, fileName + '.doc')}})(jQuery)
} else {if (typeof jQuery === 'undefined') {console.error('jQuery Word Export: missing dependency (jQuery)')}if (typeof saveAs === 'undefined') {console.error('jQuery Word Export: missing dependency (FileSaver.js)')}
}
  • 模板引用
<template><div id='report'></div>
</template>
<script>
import saveAs from 'file-saver'
import './jquery.wordexport'export default {name:'',methods(){tapExport() {$('#report').wordExport('《报告》')}}}
</script>

以上就是问题的解决方案。

部分转载:https://blog.csdn.net/dwb123456123456/article/details/84875706

js 导出word文档相关推荐

  1. 使用jquery.wordexport.js导出word文档 设置行间距不生效问题

    在使用jquery.wordexport.js导出word文档时  在js里设置的style  margin-top不生效   生成的doc还是没有行间距 一通百度后  发现没用解决方法 后来发现有位 ...

  2. js导出word文档 可以兼容IE8+浏览器适配其他浏览器

    js导出word文档,兼容IE8浏览器 其他浏览器需要引入两个文件:FileSaver.js 和 jqueryWordExport.js 需要兼容IE8浏览器需要引用:FileSaver.js exc ...

  3. vue项目+element表格前端使用纯js导出word文档

    详细请读https://www.jianshu.com/p/0de31429b12a这篇文章 首先安装各种工具: -- 安装 docxtemplater cnpm install docxtempla ...

  4. js 导出word 文档 doc docx

    在做项目时,要将富文本编辑器,或是html内容 导出为word. 先引入文件保存js <script src="FileSaver.js"></script> ...

  5. 如何导出word文档

    前言 一般导出word,是后台做的功能,如果确实需要前端做,可以借助jQuery的wordexport.js导出word文档 提示:以下是本篇文章正文内容,下面案例可供参考 一.使用步骤 1.引入文件 ...

  6. vue前端html页面导出word文件,Vue-纯前端导出word文档

    在项目中,我们可以借助后端返回文件流实现文件下载.如果前端有数据,也可以借助前端框架进行下载.本文将介绍如何在前端纯js实现word文档导出. 1. 组件介绍 要实现前端纯js导出word文档,我们需 ...

  7. vue 生产word_nodejs(officegen)+vue(axios)在客户端导出word文档

    前言 我的项目中有一个需求:点击按钮生成可编辑的word文档订单详情的信息 我使用的前端框架是Vue.js.后台使用的是node.js node.js生成和导出word文档我参考的是下面这两篇文章,写 ...

  8. vue 导出word文档(包括图片)

    vue 导出word文档(包括图片) 1.打开终端,安装依赖 -- 安装 docxtemplater npm install docxtemplater pizzip --save-- 安装 jszi ...

  9. PHP导出word文档的简单实现方法(可导出图片)

    这是看了网上几篇关于PHP导出word文档的文章之后,本人改进一下的方法,可以导出带图片的,以下是demo. $row = M('Article')->where(array('id'=> ...

最新文章

  1. 贝叶斯反垃圾邮件技术
  2. yarn、npm、cnpm三者区别
  3. 霍金竟然亲口承认自己是个赌徒!明明失败了不止一次,“菜鸡”却成了神话!...
  4. c语言乘法口诀表的流程图_例18:C语言编程实现九九乘法表
  5. 2021母婴行业洞察报告
  6. 如何写一个不带BOM的UTF8文件
  7. C语言程序设计打鱼还是晒网,C语言编程三天打鱼两天晒网
  8. Airflow 中文文档:写日志
  9. 使用android日志工具
  10. VirtualBox centos下设置共享文件夹
  11. uva 10474 - Where is the Marble?
  12. Cadence系列之SIPI仿真笔记:Cadence多种版本的安装、卸载重装(一)
  13. HTTPS 免费证书,免费 ssl 证书,FreeSSL.cn 申请多种免费证书
  14. 服务器装了无线网卡失败,.NET Core Runtime安装失败0x80070005Error报错服务器原因
  15. 搜索计算机文件夹的记录怎么删除,Win7如何删除“我的电脑”搜索栏里面的搜索记录...
  16. 再次使用vue-awesome-swiper做异形轮播
  17. 2022制冷与空调设备运行操作考试模拟100题模拟考试平台操作
  18. Windows 2003安全设置大全----2003系统错误大全解释
  19. 分布式一致性协议Raft,以及难搞的Paxos
  20. UVA11400 简单DP

热门文章

  1. 星起航:抖音小店如何提升店铺复购率
  2. 朴素贝叶斯情感分析评分python_朴素贝叶斯算法下的情感分析——C#编程实现
  3. 什么是哥德尔不完备定理?
  4. 服务器运行时将杀毒软件关掉,云服务器的速度性能优化之一(关闭Windows杀毒软件及无关服务及程序)...
  5. PHP学习-数据类型
  6. 完美解决小米随身wifi创建网络失败
  7. (2013.05.05)N枚硬币找1枚假币
  8. 【嘉然live2d】来给WP网站添加一个live2
  9. 【Unity数据持久化】Ixmllserializable接口的使用
  10. 测试用例-------纸杯