vue 数据导出,vue导出表格数据

  vue 数据导出,vue导出表格数据

  这篇文章主要介绍了某视频剪辑软件实现导出单词文件(数据流方式),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  

目录

   第一步:安装依赖:jquery和文件保护程序第二步:新增jquery.wordexport.js第三步:组件使用某视频剪辑软件导出单词文件(模板方式)vue导出单词文档(包括图片)jquery.wordexport.js,通过该插件可以导出文本和图片,图片通过帆布的形式绘制,文本则需要依赖FileSaver.js插件。

  FileSaver.js插件则主要通过H5的文件操作新特性新斑点()和新文件读取器()来实现文本的导出。

  

第一步:安装依赖:jquery 和file-saver

  新公共管理安装框架文件-保存程序-保存

  

第二步:新增jquery.wordexport.js

  在科学研究委员会下的资产中新增射流研究…文件夹,新增jquery.wordexport.js文件

  //导入射流研究…文件

  从" jquery "中导入$

  从"文件保存程序"导入另存为

  if (typeof $!==未定义类型的另存为!==未定义){

  (函数($) {

  $.fn.wordExport=函数(文件名){

  文件名=文件名类型!==未定义?文件名:“jQuery-Word-Export”;

  变量静态={

  mhtml: {

  顶部:“Mime版本:1.0 \ n内容库:”位置。href \ n content-Type:Multipart/related;boundary=\ 下一个。项目边界\ ;type=\text/html\\n\n -下一步。项目边界\ n内容类型:text/html;charset=\ utf-8 \ \ n content-Location: Location。href \ n \ n! DOCTYPE html\nhtml\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 ,

  正文: body_body_/body

  }

  };

  定义变量选项={

  最大宽度:624

  };

  //在操纵所选元素之前克隆它

  定义变量加价=$(这个).clone();

  //从输出中移除隐藏元素

  markup.each(function () {

  var self=$(这个);

  if (self.is(:hidden ))

  自我。移除();

  });

  //使用数据统一资源定位器嵌入所有图像

  var images=Array();

  var img=标记。find( img );

  for(var I=0;我。图像长度;i ) {

  //计算输出图像的尺寸

  var w=Math.min(img[i].宽度,选项。maxwidth);

  var h=img[i].高度* (w/img[i]).宽度);

  //创建用于将图像转换为数据统一资源定位器的画布

  var CANVAS=文档。createelement(“CANVAS”);

  画布。宽度=w;

  画布。高度=h;

  //将图像绘制到画布

  var context=画布。获取上下文(“2d”);

  context.drawImage(img[i],0,0,w,h);

  //获取图像的数据统一资源定位器编码

  var uri=canvas。toda taurl( image/png/jpg );

  $(img[i]).attr(src ,img[i].src);

  img[i].宽度=w;

  img[i].高度=h;

  //将编码图像保存到数组

  图像[i]={

  类型:uri。子字符串(uri。(“:”)1的索引,uri。的索引(“;”))),

  编码:uri。子字符串(uri。的索引(“;”))1,uri.indexOf(,),

  位置:$(img[i]).attr(src ),

  data: uri.substring(uri.indexOf(,)1)

  };

  }

  //用图像数据准备单个文件网页文件的底部

  var mhtmlBottom= \ n

  for(var j=0;j图像。长度;j ) {

  mhtmlBottom= -下一个。项目边界\ n ;

  mhtmlBottom= Content-Location: images[j].位置”\ n”;

  mhtmlBottom= Content-Type: images[j].键入”\ n”;

  mhtmlBottom= Content-Transfer-Encoding: images[j].编码”\ n \ n”;

  mhtmlBottom=images[j].数据”\ n \ n”;

  }

  mhtmlBottom= -下一个。项目边界-;

  //TODO:从包含的样式表加载钢性铸铁

  //var styles=/* Font Definitions */@ Font-face { Font-family:宋体;panose-1:2 1 6 0 3 1 1 1 1 1;MSO-font-alt:SimSun;MSO-font-charset:134;MSO-通用-字体-家庭:汽车;mso字体间距:变量;MSO-字体-签名:3 680460288 22 0 262145 0;} @ font-face { font-family: Cambria Math ;panose-1:2 4 5 3 5 4 6 3 2 4;MSO-font-charset:1;MSO-通用-字体-家庭:罗马;mso字体格式:其他;mso字体间距:变量;MSO-字体-签名:0 0 0 0 0 0;} @font-face{font-family:\@宋体;panose-1:2 1 6 0 3 1 1 1 1 1;MSO-font-charset:134;MSO-通用-字体-家庭:汽车;mso字体间距:变量;MSO-字体-签名:3 680460288 22 0 262145 0;}/*样式定义*/p.MsoNormal,李.MsoNormal分区MSO师范{ MSO式-取消隐藏:否;mso-style-qformat:是;MSO式-家长:“”;边距0厘米边距-底部:0001磅;MSO-分页:寡妇-孤儿;字体大小:14.0磅;字体系列:宋体;mso-bidi-font-family:宋体;李MsoHeader,div .MsoHeader{mso-style-noshow:是;MSO风格的-优先级:99; mso-style-link:页眉char ;边距0厘米边距-底部:0001磅;文本对齐:居中;MSO-分页:寡妇-孤儿;布局-网格-模式:字符字体大小:9.0磅;字体系列:宋体;mso-bidi-font-family:宋体;李MsoFooter分区MSO奥特{ MSO式——不秀:是;MSO风格的-优先级:99; mso-style-link:页脚char ;边距0厘米边距-底部:0001磅;MSO-分页:寡妇-孤儿;布局-网格-模式:字符字体大小:9.0磅;字体系列:宋体;mso-bidi-font-family:宋体;}p.MsoAcetate,李100 . MsoAcetate分区MsoAcetate{mso-style-noshow:是;MSO风格的-优先级:99; mso-style-link:批注框文本char ;边距0厘米边距-底部:0001磅;MSO-分页:寡妇-孤儿;字体大小:9.0磅;字体系列:宋体;mso-bidi-font-family:宋体;}span .Char{mso-style-name:页眉char ;mso-style-noshow:是;MSO风格的-优先级:99;MSO-style-取消隐藏:否;mso样式锁定:是;友邦样式链接:页眉;字体系列:宋体;MSO-ascii-字体系列:宋体;mso-fareast-font-family:宋体;MSO-汉斯-字体系列:宋体;}span .Char0{mso-style-name:页脚char ;mso-style-noshow:是;MSO风格的-优先级:99;MSO-style-取消隐藏:否;mso样式锁定:是;友邦样式链接:页脚;字体系列:宋体;MSO-ascii-字体系列:宋体;mso-fareast-font-family:宋体;MSO-汉斯-字体系列:宋体;}span .Char1{mso-style-name:批注框文本char ;mso-style-noshow:是;MSO风格的-优先级:99;MSO-style-取消隐藏:否;mso样式锁定:是;友邦样式链接:批注框文本;字体系列:宋体;MSO-ascii-字体系列:宋体;mso-fareast-font-family:宋体;MSO-汉斯-字体系列:宋体;}p.msochpdefault,li.msochpdefault,div。msochpdefault { MSO式-名称:msochpdefault;MSO-style-取消隐藏:否;MSO-保证金-顶-alt:自动;右边距:0 cmmso-margin-bottom-alt:auto;左边距:0cmMSO-分页:寡妇-孤儿;字体大小:10.0磅;字体系列:宋体;mso-bidi-font-family:宋体;} span。msonormal 0 { MSO式名称:msonormal;MSO-style-取消隐藏:否;}.MsoChpDefault{mso-style-type:仅导出;MSO-默认-属性:是;字体大小:10.0磅;MSO-ansi-font-size:10.0磅;MSO-比迪-字体大小:10.0磅;MSO-ascii-font-family: Times New Roman ;MSO-汉斯-font-family: Times New Roman ;MSO-字体-字距:0pt}/*页面定义*/@ Page words section 1 { size:595.3 pt 841.9 pt;边距:72.0 pt 90.0 pt 72.0 pt 90.0 ptMSO-标题-保证金:42.55点;MSO-页脚-边距:49.6磅;MSO-纸-来源:0;}div .word section 1 { page:word section 1;};

  var styles=

  //将文件的各个部分聚合在一起

  var文件内容=静态。mhtml。顶端。替换( _ html _ ),静态。mhtml。头。替换( _ styles _ ,styles)静态。mhtml。身体。替换( _ body _ ),标记。html()))mhtmlBottom;

  //用文件内容创建一个一滴

  var blob=新斑点([文件内容],{

  类型:应用程序/ms word;charset=utf-8

  });

  另存为(blob,文件名。doc’);

  };

  })($);

  }否则{

  if (typeof $===undefined) {

  控制台。错误( jQuery Word Export:缺少依赖项(jQuery));

  }

  if(另存为类型===未定义){

  控制台。错误( jQuery Word导出:缺少依赖项(文件保护程序。js));

  }

  }

  

第三步:组件使用

  注意:只能写行内样式

  模板

  div class=home

  button @click=exportWord 导出/按钮

  div id=word_demo

  p style= font-size:20px;颜色:红色;评标区/p

  h1 style= font-size:20px;颜色:蓝色;标题/h1

  img alt=Vue logo src=./assets/logo.png /

  /div

  /div

  /模板

  从" jquery "中导入$

  要求( @/assets/js/jquery.wordexport )

  导出默认值{

  姓名:家,

  方法:{

  exportWord() {

  setTimeout(function() {

  $(#word_demo ).wordExport(word文档)

  }, 300)

  },

  },

  }

  

vue导出Word文件(模板方式)

  扩展

  jquery.wordexport.js源码

  if(jQuery的类型!==未定义类型的另存为!==未定义){

  (函数($) {

  $.fn.wordExport=函数(文件名){

  文件名=文件名类型!==未定义?文件名:“jQuery-Word-Export”;

  变量静态={

  mhtml: {

  顶部:“Mime版本:1.0 \ n内容库:”位置。href \ n content-Type:Multipart/related;boundary=\ 下一个。项目边界\ ;type=\text/html\\n\n -下一步。项目边界\ n内容类型:text/html;charset=\ utf-8 \ \ n content-Location: Location。href \ n \ n! DOCTYPE html\nhtml\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 ,

  正文: body_body_/body

  }

  };

  定义变量选项={

  最大宽度:624

  };

  //在操纵所选元素之前克隆它

  定义变量加价=$(这个).clone();

  //从输出中移除隐藏元素

  markup.each(function () {

  var self=$(这个);

  if (self.is(:hidden ))

  自我。移除();

  });

  //使用数据统一资源定位器嵌入所有图像

  var images=Array();

  var img=标记。find( img );

  for(var I=0;我。图像长度;i ) {

  //计算输出图像的尺寸

  var w=Math.min(img[i].宽度,选项。maxwidth);

  var h=img[i].高度* (w/img[i]).宽度);

  //创建用于将图像转换为数据统一资源定位器的画布

  var CANVAS=文档。createelement(“CANVAS”);

  画布。宽度=w;

  画布。高度=h;

  //将图像绘制到画布

  var context=画布。获取上下文(“2d”);

  context.drawImage(img[i],0,0,w,h);

  //获取图像的数据统一资源定位器编码

  var uri=canvas。toda taurl( image/png/jpg );

  $(img[i]).attr(src ,img[i].src);

  img[i].宽度=w;

  img[i].高度=h;

  //将编码图像保存到数组

  图像[i]={

  类型:uri。子字符串(uri。(“:”)1的索引,uri。的索引(“;”))),

  编码:uri。子字符串(uri。的索引(“;”))1,uri.indexOf(,),

  位置:$(img[i]).attr(src ),

  data: uri.substring(uri.indexOf(,)1)

  };

  }

  //用图像数据准备单个文件网页文件的底部

  var mhtmlBottom= \ n

  for(var I=0;我图像。长度;i ) {

  mhtmlBottom= -下一个。项目边界\ n ;

  mhtmlBottom= Content-Location: images[I].位置”\ n”;

  mhtmlBottom= Content-Type: images[I].键入”\ n”;

  mhtmlBottom= Content-Transfer-Encoding: images[I].编码”\ n \ n”;

  mhtmlBottom=images[i].数据”\ n \ n”;

  }

  mhtmlBottom= -下一个。项目边界-;

  //TODO:从包含的样式表加载钢性铸铁

  //var styles=/* Font Definitions */@ Font-face { Font-family:宋体;panose-1:2 1 6 0 3 1 1 1 1 1;MSO-font-alt:SimSun;MSO-font-charset:134;MSO-通用-字体-家庭:汽车;mso字体间距:变量;MSO-字体-签名:3 680460288 22 0 262145 0;} @ font-face { font-family: Cambria Math ;panose-1:2 4 5 3 5 4 6 3 2 4;MSO-font-charset:1;MSO-通用-字体-家庭:罗马;mso字体格式:其他;mso字体间距:变量;MSO-字体-签名:0 0 0 0 0 0;} @font-face{font-family:\@宋体;panose-1:2 1 6 0 3 1 1 1 1 1;MSO-font-charset:134;MSO-通用-字体-家庭:汽车;mso字体间距:变量;MSO-字体-签名:3 680460288 22 0 262145 0;}/*样式定义*/p.MsoNormal,李.MsoNormal分区MSO师范{ MSO式-取消隐藏:否;mso-style-qformat:是;MSO式-家长:“”;边距0厘米边距-底部:0001磅;MSO-分页:寡妇-孤儿;字体大小:14.0磅;字体系列:宋体;mso-bidi-font-family:宋体;李MsoHeader,div .MsoHeader{mso-style-noshow:是;MSO风格的-优先级:99; mso-style-link:页眉char ;边距0厘米边距-底部:0001磅;文本对齐:居中;MSO-分页:寡妇-孤儿;布局-网格-模式:字符字体大小:9.0磅;字体系列:宋体;mso-bidi-font-family:宋体;李MsoFooter分区MSO奥特{ MSO式——不秀:是;MSO风格的-优先级:99; mso-style-link:页脚char ;边距0厘米边距-底部:0001磅;MSO-分页:寡妇-孤儿;布局-网格-模式:字符字体大小:9.0磅;字体系列:宋体;mso-bidi-font-family:宋体;}p.MsoAcetate,李100 . MsoAcetate分区MsoAcetate{mso-style-noshow:是;MSO风格的-优先级:99; mso-style-link:批注框文本char ;边距0厘米边距-底部:0001磅;MSO-分页:寡妇-孤儿;字体大小:9.0磅;字体系列:宋体;mso-bidi-font-family:宋体;}span .Char{mso-style-name:页眉char ;mso-style-noshow:是;MSO风格的-优先级:99;MSO-style-取消隐藏:否;mso样式锁定:是;友邦样式链接:页眉;字体系列:宋体;MSO-ascii-字体系列:宋体;mso-fareast-font-family:宋体;MSO-汉斯-字体系列:宋体;}span .Char0{mso-style-name:页脚char ;mso-style-noshow:是;MSO风格的-优先级:99;MSO-style-取消隐藏:否;mso样式锁定:是;友邦样式链接:页脚;字体系列:宋体;MSO-ascii-字体系列:宋体;mso-fareast-font-family:宋体;MSO-汉斯-字体系列:宋体;}span .Char1{mso-style-name:批注框文本char ;mso-style-noshow:是;MSO风格的-优先级:99;MSO-style-取消隐藏:否;mso样式锁定:是;友邦样式链接:批注框文本;字体系列:宋体;MSO-ascii-字体系列:宋体;mso-fareast-font-family:宋体;MSO-汉斯-字体系列:宋体;}p.msochpdefault,li.msochpdefault,div。msochpdefault { MSO式-名称:msochpdefault;MSO-style-取消隐藏:否;MSO-保证金-顶-alt:自动;右边距:0 cmmso-margin-bottom-alt:auto;左边距:0cmMSO-分页:寡妇-孤儿;字体大小:10.0磅;字体系列:宋体;mso-bidi-font-family:宋体;} span。msonormal 0 { MSO式名称:msonormal;MSO-style-取消隐藏:否;}.MsoChpDefault{mso-style-type:仅导出;MSO-默认-属性:是;字体大小:10.0磅;MSO-ansi-font-size:10.0磅;MSO-比迪-字体大小:10.0磅;MSO-ascii-font-family: Times New Roman ;MSO-汉斯-font-family: Times New Roman ;MSO-字体-字距:0pt}/*页面定义*/@ Page words section 1 { size:595.3 pt 841.9 pt;边距:72.0 pt 90.0 pt 72.0 pt 90.0 ptMSO-页眉-页边距:42.55磅;MSO-页脚-边距:49.6磅;MSO-纸-来源:0;}div .word section 1 { page:word section 1;};

  var styles=

  //将文件的各个部分聚合在一起

  var文件内容=静态。mhtml。顶端。替换( _ html _ ),静态。mhtml。头。替换( _ styles _ ,styles)静态。mhtml。身体。替换( _ body _ ),标记。html()))mhtmlBottom;

  //用文件内容创建一个一滴

  var blob=新斑点([文件内容],{

  类型:应用程序/ms word;charset=utf-8

  });

  另存为(blob,文件名。doc’);

  };

  })(jQuery);

  }否则{

  if(jQuery的类型=== undefined ){

  控制台。错误( jQuery Word Export:缺少依赖项(jQuery));

  }

  if(另存为类型===未定义){

  控制台。错误( jQuery Word导出:缺少依赖项(文件保护程序。js));

  }

  }

  FileSaver.js源码

  /* FileSaver.js

  *另存为()文件保护程序实现。

  * 1.3.2

  * 2016-06-16 18:25:19

  *

  *作者伊莱格雷,http://eligrey.com

  *许可证:麻省理工学院

  *参见https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md

  */

  /*全局自我*/

  /*jslint bitwise: true,indent: 4,laxbreak: true,laxcomma: true,smarttabs: true,plusplus: true */

  /*!@ source http://purl。伊莱.格雷。com/github/文件保护程序。js/blob/master/file saver。js */

  var saveAs=saveAs (函数(视图){

  使用严格的;

  //IE 10是显式不支持的

  如果(视图类型===未定义 导航类型!==undefined /MSIE [1-9]\ ./.测试(navigator.userAgent)) {

  返回;

  }

  定义变量

  文档=视图。文档

  //仅在Blob.js尚未覆盖统一资源定位器的情况下,在必要时获取统一资源定位器

  ,get_URL=function () {

  返回视图URL view.webkitURL view

  }

  ,save _ link=doc。createelementns( http://www。w3。org/1999/XHTML , a )

  ,can _ use _ save _ link= download in save _ link

  ,点击=功能(节点){

  var event=新的鼠标事件( click );

  node.dispatchEvent(事件);

  }

  ,is_safari=/constructor/i.test(查看. HTMLElement)

  ,is_chrome_ios=/CriOS\/[\d] /.测试(navigator.userAgent)

  ,throw_outside=function (ex) {

  (查看。设置即时 视图。settimeout)(函数(){

  扔ex;

  }, 0);

  }

  ,force _ saveable _ type= application/octet-stream

  Blob API从根本上被破坏,因为没有要订阅的"下载完成"事件

  ,任意_撤销_超时=1000 * 40 //毫秒

  ,撤销=函数(文件){

  var revoker=function () {

  if(文件类型=== string ){//文件是一个对象统一资源定位器

  get_URL().revokeObjectURL(文件);

  } else { //file是一个文件

  文件。移除();

  }

  };

  setTimeout(revoker,arbitrary _ revoke _ time out);

  }

  ,调度=功能(文件保存器,事件类型,事件){

  event_types=[].concat(event _ types);

  var i=event _ types.length

  while (i - ) {

  var listener=file saver[ on event _ types[I]];

  if(侦听器类型===函数){

  尝试{

  listener.call(filesaver,event file saver);

  } catch (ex) {

  throw _ outside(ex);

  }

  }

  }

  }

  ,auto_bom=function (blob) {

  //为UTF-8 XML和文本/*类型(包括HTML)预设月初(beginning of month的缩写)

  //注意:您的浏览器会自动将UTF-16 U FEFF转换为字节

  如果(/^\s*(?text \/\ S * application \/XML \ S * \/\ S * \ XML)\ S *;* charset \ s *=\ s * utf-8/I . test(blob。类型)){

  返回新的blob([字符串。from charcode(0x feff),blob],{ type:Blob。type });

  }

  返回一滴

  }

  ,FileSaver=function (blob,name,no_auto_bom) {

  如果(!no_auto_bom) {

  blob=auto _ BOM(blob);

  }

  //首先尝试下载,然后是网文件系统,然后是对象统一资源定位器

  定义变量

  filesaver=this

  ,type=blob.type

  ,force=type===force _ saveable _ type

  ,对象_url

  ,dispatch_all=function () {

  dispatch(filesaver,写入开始进度写入写入结束 .拆分("");

  }

  //在任何filesys上,错误恢复为使用对象统一资源定位器保存

  ,fs_error=function () {

  if((is _ chrome _ IOs (force is _ safari))查看FileReader) {

  //游猎不允许下载blob urls

  var reader=new FileReader();

  reader.onloadend=function () {

  var url=is_chrome_ios?读者。结果:reader.result.replace(/^data:[^;]*;/,数据:附件/文件;);

  var popup=view.open(url, _ blank );

  如果(!弹出)视图。位置。href=URL

  url=未定义;//调度前释放引用

  filesaver.readyState=filesaver .搞定;

  dispatch _ all();

  };

  读者。readasdataurl(blob);

  filesaver.readyState=filesaver .初始化

  返回;

  }

  //不要创建多余的对象统一资源定位器

  如果(!object_url) {

  object_url=get_URL().createObjectURL(blob);

   }

   if (force) {

   view.location.href = object_url;

   } else {

   var opened = view.open(object_url, "_blank");

   if (!opened) {

   // Apple does not allow window.open, see https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.html

   view.location.href = object_url;

   }

   }

   filesaver.readyState = filesaver.DONE;

   dispatch_all();

   revoke(object_url);

   }

   ;

   filesaver.readyState = filesaver.INIT;

   if (can_use_save_link) {

   object_url = get_URL().createObjectURL(blob);

   setTimeout(function () {

   save_link.href = object_url;

   save_link.download = name;

   click(save_link);

   dispatch_all();

   revoke(object_url);

   filesaver.readyState = filesaver.DONE;

   });

   return;

   }

   fs_error();

   }

   , FS_proto = FileSaver.prototype

   , saveAs = function (blob, name, no_auto_bom) {

   return new FileSaver(blob, name blob.name "download", no_auto_bom);

   }

   ;

   // IE 10+ (native saveAs)

   if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) {

   return function (blob, name, no_auto_bom) {

   name = name blob.name "download";

   if (!no_auto_bom) {

   blob = auto_bom(blob);

   }

   return navigator.msSaveOrOpenBlob(blob, name);

   };

   }

   FS_proto.abort = function () { };

   FS_proto.readyState = FS_proto.INIT = 0;

   FS_proto.WRITING = 1;

   FS_proto.DONE = 2;

   FS_proto.error =

   FS_proto.onwritestart =

   FS_proto.onprogress =

   FS_proto.onwrite =

   FS_proto.onabort =

   FS_proto.onerror =

   FS_proto.onwriteend =

   null;

   return saveAs;

  }(

   typeof self !== "undefined" && self

   typeof window !== "undefined" && window

   this.content

  ));

  // `self` is undefined in Firefox for Android content script context

  // while `this` is nsIContentFrameMessageManager

  // with an attribute `content` that corresponds to the window

  if (typeof module !== "undefined" && module.exports) {

   module.exports.saveAs = saveAs;

  } else if ((typeof define !== "undefined" && define !== null) && (define.amd !== null)) {

   define([], function () {

   return saveAs;

   });

  }

  

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

  1.安装依赖

  -- 安装 docxtemplater

  npm install docxtemplater pizzip --save

  -- 安装 jszip-utils

  npm install jszip-utils --save

  -- 安装 jszip

  npm install jszip --save

  -- 安装 FileSaver

  npm install file-saver --save

  2.创建exportFile.js(导出word方法)

  import PizZip from pizzip

  import docxtemplater from docxtemplater

  import JSZipUtils from jszip-utils

  import { saveAs } from file-saver

  /**

   * 将base64格式的数据转为ArrayBuffer

   * @param {Object} dataURL base64格式的数据

   */

  function base64DataURLToArrayBuffer (dataURL) {

   const base64Regex = /^data:image\/(pngjpgjpegsvgsvg\+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,支持图片

   * @param {Object} tempDocxPath 模板文件路径

   * @param {Object} wordData 导出数据

   * @param {Object} fileName 导出文件名

   * @param {Object} imgSize 自定义图片尺寸

   */

  export const exportWord = (tempDocxPath, wordData, fileName, imgSize) => {

   // 这里要引入处理图片的插件

   var ImageModule = require(docxtemplater-image-module-free);

   const expressions = require("angular-expressions");

   // 读取并获得模板文件的二进制内容

   JSZipUtils.getBinaryContent(tempDocxPath, function (error, content) {

   if (error) {

   throw error;

   }

   expressions.filters.size = function (input, width, height) {

   return {

   data: input,

   size: [width, height],

   };

   };

   // function angularParser (tag) {

   // const expr = expressions.compile(tag.replace(//g, ""));

   // return {

   // get (scope) {

   // return expr(scope);

   // },

   // };

   // }

   // 图片处理

   let opts = {}

   opts = {

   // 图像是否居中

   centered: false

   };

   opts.getImage = (chartId) => {

   // console.log(chartId);//base64数据

   // 将base64的数据转为ArrayBuffer

   return base64DataURLToArrayBuffer(chartId);

   }

   opts.getSize = function (img, tagValue, tagName) {

   // console.log(img);//ArrayBuffer数据

   // console.log(tagValue);//base64数据

   // console.log(tagName);//wordData对象的图像属性名

   // 自定义指定图像大小

   if (imgSize.hasOwnProperty(tagName)){

   return imgSize[tagName];

   } else {

   return [600, 350];

   }

   }

   // 创建一个PizZip实例,内容为模板的内容

   let zip = new PizZip(content);

   // 创建并加载docxtemplater实例对象

   let doc = new docxtemplater();

   doc.attachModule(new ImageModule(opts));

   doc.loadZip(zip);

   doc.setData(wordData);

   try {

   // 用模板变量的值替换所有模板变量

   doc.render();

   } catch (error) {

   // 抛出异常

   let e = {

   message: error.message,

   name: error.name,

   stack: error.stack,

   properties: error.properties

   };

   console.log(JSON.stringify({

   error: e

   }));

   throw error;

   }

   // 生成一个代表docxtemplater对象的zip文件(不是一个真实的文件,而是在内存中的表示)

   let out = doc.getZip().generate({

   type: "blob",

   mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"

   });

   // 将目标文件对象保存为目标类型的文件,并命名

   saveAs(out, fileName);

   });

  }

  3.组件调用

  <template>

    <a-form-model

      ref="ruleForm"

      :model="form"

      :rules="rules"

      :label-col="labelCol"

      :wrapper-col="wrapperCol"

    >

      <a-form-model-item label="名称" prop="name">

        <a-input-number v-model="form.name" style="width:100%;"/>

      </a-form-model-item>

      <a-form-model-item label="日期" prop="date">

        <a-input v-model="form.date" />

      </a-form-model-item>

      <a-form-model-item label="文件">

        <a-input v-model="form.imgUrl" read-only/>

        <a-upload name="file" :showUploadList="false" :customRequest="customRequest">

          <a-button type="primary" icon="upload">导入图片</a-button>

        </a-upload>

      </a-form-model-item>

      <a-form-model-item label="操作">

        <a-button type="primary" icon="export" @click="exportWordFile">导出word文档</a-button>

      </a-form-model-item>

    </a-form-model>

  </template>

  <script>

  import {exportWord} from @/assets/js/exportFile.js

  export default {

    name: ExportFile,

    data () {

      return {

        labelCol: { span: 6 },

        wrapperCol: { span: 16 },

        form: {},

        rules: {

          name: [

            { required: true, message: 请输入名称!, trigger: blur },

          ],

          date:[

            { required: true, message: 请输入日期!, trigger: blur },

          ],

        },

      };

    },

    created (){},

    methods: {

      customRequest (data){

        //图片必须转成base64格式

        var reader = new FileReader();

        reader.readAsDataURL(data.file);

        reader.onload = () => {

          // console.log("file 转 base64结果:" + reader.result);

          this.form.imgUrl = reader.result; //imgUrl必须与模板文件里的参数名一致

        };

        reader.onerror = function (error) {

          console.log("Error: ", error);

        };

      },

      exportWordFile (){

        let imgSize = {

          imgUrl:[65, 65], //控制导出的word图片大小

        };

        exportWord("./static/test.docx", this.form, "demo.docx", imgSize);

        //参数1:模板文档 

        //参数2:字段参数

        //参数3:输出文档

        //参数4:图片大小

      }

    },

  };

  </script>

  4.创建test.docx文档模板。注:使用vue-cli2的时候,放在static目录下;使用vue-cli3的时候,放在public目录下。

  模板参数名需与字段一致,普通字段:{字段名},图片字段:{%字段名}

  文档内容:

  5.导出demo.docx结果

  以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: