摘要:之前项目中导出价格表是由后端实现,前端只需要调用接口下载word即可,后来业务改变比较大,word模版需要一直改动,后端改起来相对麻烦,后来直接前端自己定义模版,实现下载word文档。

一、需要安装的依赖

1、docxtemplater

介绍:docxtemplater是一种邮件合并工具,它以编程方式使用,处理条件、循环,并且可以扩展为表格、HTML、图像等。

安装方法:cnpm i docxtemplater@^3.9.1

2、FileSaver

介绍:FileSaver.js 是在客户端保存文件的解决方案,非常适合需要生成文件,或者保存不应该发送到外部服务器的敏感信息的应用。

安装方法:cnpm i file-saver@^1.3.8

3、jszip

介绍:jszip是一个用于创建、读取和编辑.zip文件的JavaScript库,且API的使用也很简单。

安装方法:cnpm i jszip@^2.6.1

4、jszip-utils

介绍:jszip-utils是与jszip一起使用的跨浏览器的工具库

安装方法:cnpm i jszip-utils@^0.0.2

二、创建word模版

介绍:根据自己的业务需求创建需要导出的word模版,变量数据使用{变量名}代替,表格内容数据需要使用{#参数名}开始{/参数名}结尾,具体如下图:

注意点:1.模板文件使用vue-cli2的时候,放在static目录下。使用vue-cli3的时候,放在public目录下。

2.文件须以docx结尾。

不然可能出现的问题:提示Uncaught Error: Corrupted zip: missing 7124 bytes.

vue-cli3示例位置如图:

三、html代码编写

定义下载事件downloadprice

下载价格表

四、script代码编写

1.使用的页面中导入需要的插件:

import Docxtemplater from 'docxtemplater';

import { saveAs } from 'file-saver';

import JSZip from 'jszip';

import JSZipUtils from 'jszip-utils';

2.定义接口数据(这里为定义好的数据,正常情况下通过接口获取需要在word文档上展示的数据):

data() {

return {

// 导出价格表全部信息

exportPriceObj: {

actualPayFee: '179.55',

deliveryFee: '0.00',

discountActualFee: '179.55',

discountFee: '9.45',

discountRatio: '95',

nickName: '张三',

retailTotalFee: '0.00',

totalFee: '189.00',

},

// 导出价格表商品信息

exportPriceListOne: [

{

productColor: '白色',

productName: '0909测试商品',

productNo: 1,

productSize: '4XL(58)',

productSkuId: 'teydnkn',

sellingPrice: '10.00',

},

{

productColor: '白色',

productName: '1955测试商品',

productNo: 2,

productSize: 'XL(52)',

productSkuId: 'teydoja',

sellingPrice: '40.00',

}

],

}

}

3.下载word文档点击事件方法:

// 下载价格表

downloadprice() {

let _this = this;

// 判断有无附加商品来选择word模版

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

JSZipUtils.getBinaryContent('pricenew.docx', function(error, content) {

console.log('-----', content);

// input.docx是模板。我们在导出的时候,会根据此模板来导出对应的数据

// 抛出异常

if (error) {

throw error;

}

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

let zip = new JSZip(content);

console.log('+++++', zip);

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

let doc = new Docxtemplater();

console.log('/', doc);

doc.loadZip(zip);

console.log('=====', doc);

// 设置模板变量的值

doc.setData({

// 导出价格表全部信息

..._this.exportPriceObj,

// 导出价格表商品信息

tableone: _this.exportPriceListOne,

});

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, _this.exportPriceObj.nickName + '的价格表.docx');

});

},

4.点击下载后可能会出现的问题:

一、提示Uncaught Error: Corrupted zip: missing 7124 bytes.

错误方法如图:

可能产生的原因是:1.模版文件word放置的位置获取不到;

2.word文档格式出现错误;

解决方法:1.模板文件使用vue-cli2的时候,放在static目录下。使用vue-cli3的时候,放在public目录下。

2.文件须以docx结尾。

正确方法如图:

二、提示Uncaught Error: Can't find end of central directory : is this a zip file ?

错误方法如图:

可能产生的原因是:1.你项目里面引用了mockjs文件,它的原理是重写了XMLHttpRequest,导致你上报插件找不到对应的方法;

解决方法:上线时把项目中引入的mock注释掉,// import '@/mock';

原理分析:mockjs是一个模拟后台接口的JS库,它的原理是重写了XMLHttpRequest,它可以在接口没出来时非常方便的模拟数据,上线之后      不引用它即可。一般上报插件中会使用原生XMLHttpRequest,而原生XMLHttpRequest已被mockjs覆盖找不到相应的方法,所以会   出错。除了mockjs之外,zonejs、oboejs、fetchjs也有自己的的XMLHttpRequest库,请慎用。

正确方法如图:

五、导出结果

导出结果如图:

有问题欢迎留言,带上问题和代码截图,看到后第一时间回复帮忙解答,谢谢!

标签:价格表,vue,word,zip,导出,jszip,error,bug

来源: https://www.cnblogs.com/hejun26/p/13647927.html

js 前端导出报错 格式不正确_vue项目前端导出word文件(bug解决)相关推荐

  1. vue 插入word模板 项目_vue项目前端导出word文件(bug解决)

    摘要:之前项目中导出价格表是由后端实现,前端只需要调用接口下载word即可,后来业务改变比较大,word模版需要一直改动,后端改起来相对麻烦,后来直接前端自己定义模版,实现下载word文档. 一.需要 ...

  2. ajax文件上传报400,js ajaxfileupload.js上传报错的解决方法

    相信大家在工作中经常用到文件上传的操作,因为我是搞前端的,所以这里主要是介绍ajax在前端中的操作.代码我省略的比较多,直接拿js那里的 $.ajaxFileUpload({ url:'www.cod ...

  3. 11g导出报错:EXP-00106: Invalid Database Link Passwords

    11g导出报错:EXP-00106: Invalid Database Link Passwords 服务器端:11.2.0.4.0 : 导出客户端:11.2.0.2 报错提示: About to e ...

  4. Eclipse正确配置Tomcat之后仍然报错Type Target runtime Apache Tomcat v8.0 is not defined解决方式

    Eclipse正确配置Tomcat之后仍然报错Type Target runtime Apache Tomcat v8.0 is not defined解决方式 虽然项目能正常运行,但是看着这个红叉叉 ...

  5. 使用exp导出报错EXP-00091

    用exp导出数据时出现如下报错信息: 1)查询数据库的字符集 select userenv('language') from dual; 2)方案一: 设置Linux操作系统的NLS_LANG环境变量 ...

  6. 关于前端接口报错500原因

    关于前端接口报错500原因 1.前端与后端入参有出入 2.前端请求头与后端有出入造成, 下面展示一些 内联代码片. Content-Type: application/x-www-form-urlen ...

  7. SourceTree提交vue前端代码报错git -c diff.mnemonicprefix=false -c core.quotepath=false commit -q -F C:\Users\

    完整报错如下: git -c diff.mnemonicprefix=false -c core.quotepath=false commit -q -F C:\Users\honry.guan\Ap ...

  8. oracle导出报错04063,导出报错:ORA-04063:packagebody“DMSYS.DBMS_DM_MODEL_EXP”hase

    导出报错:ORA-04063: package body DMSYS.DBMS_DM_MODEL_EXP has errors Oracle 11.2.0.2 , EBS R12.1.3 因为是升级的 ...

  9. powershell中 find 命令报参数格式不正确

    在cmd命令行中查看本地网络连接数 netstat -ant |find /C "192"             //注意必须加上引号,否则包参数格式不正确 同样的命令在powe ...

最新文章

  1. 看看那些来自电路造型挑战赛中的作品
  2. 如何从Angular的ActivatedRoute数据结构中获得运行时路由信息
  3. Python高能小技巧:不要在for与while循环后面写else块
  4. 培养逻辑思维的app_久趣数学思维V1.4.1-久趣数学思维APP下载
  5. pp to write
  6. python抓取天气预报_抓取天气预报的代码(Python)
  7. java 语言的介绍
  8. Excel常用函数:汇总计算与统计
  9. 如何在Tomcat中配置二级域名
  10. 适合学生党上手测试的免费云服务器推荐
  11. web前端学习135-144(盒子模型---网页布局,盒子模型组成,边框,表格细线边框,盒子实际大小,内边距)
  12. 第三方支付公司怎么收取手续费
  13. Android Studio配置gradle时或导入别人项目时提示Could not find com.android.tools.build:gradle
  14. 【日常】SpringBoot缓存注解器及整合redis实现(附近期一些python零碎的内容)
  15. 图片识别软件有哪些?盘点三款好用的识别工具
  16. 将一根木棍分成三段,求这三段构成三角形的概率
  17. java项目斗地主介绍_详解java_ 集合综合案例:斗地主
  18. 掉头发最该补的东西竟然是它?99%的人都不知道!
  19. 零入门kubernetes网络实战-3->Underlay网络与Overlay网络总结
  20. 内网渗透(七十二)之域权限维持之伪造域控

热门文章

  1. OpenGL4.0学习5.1--纹理(Targa图片贴图)
  2. word插入题注以及将编号由一.1改为1.1
  3. Android10+无法获取IMEI、IOS10+关闭广告跟踪IDFA解决方法
  4. kettle连接数据库报错:Error connecting to database: (using class org.gjt.mm.mysql.Driver) Could not create
  5. java秀恩爱代码_Android表白秀恩爱源码
  6. 为您的DC/DC 转换器选择最佳开关频率
  7. 一个神奇的分布式计算框架:jini
  8. 爬取豆瓣电影短评并使用词云简单分析top50
  9. MySQL-查询权限索引约束
  10. Tossing Bad Mupd Msg Pid In The Alert.Log