当前位置: 首页 > 后端技术 > Node.js

nodejs(officegen)+vue(axios)客户端导出word文档

时间:2023-04-03 17:00:34 Node.js

前言我的项目中有一个需求:点击按钮生成可编辑的word文档订单详情信息。我使用的前端框架是Vue.js,后台我使用node.jsnode.js生成和导出word文档。参考了下面两篇文章,写的很好(github上的文章也有node.js生成word、excel、ppt的例子,具体需要看里面)http://blog.csdn.net/liyanhui...https://github.com/Ziv-Barber...上面两篇关于node.js的文章已经讲的很好了。但是我在实现的过程中还是遇到了一个问题:我可以在后端生成一个完整的word文档,但是返回到前端下载的时候遇到了问题。一开始一直以为是node.js后台的代码导致的。毕竟是第一次写^_^,但是在不断的测试中发现:1.点击按钮,在vue中使用axios请求localhost:8081/order/getDoc并没有直接生成word文档,查看返回的数据console.log(res),发现获取到的数据是一堆乱码2,但是在浏览器地址栏请求相同的后台界面,发现可以生成一整篇word文档!当我对问题的根源有所了解时,我开始上网搜索。发现ajax接受的类型只能是string字符串,不能是stream类型,所以无法实现文件下载。ajax请求的数据只能存放在javascipt内存空间,可以通过javascript访问,但是不能保存到硬盘,因为javascript不能直接和硬盘交互,否则会存在安全问题。axios是第一个第三方ajax库,所以也是一样的。解决方案解决方案我参考了一篇文章前端axios下载excel(二进制)https://www.cnblogs.com/xueji...解决方案:使用blob对象,blob对象可以看作是存储二进制数据的一个容器,也就是二进制大对象,是一个可以存放二进制文件的容器。方法:{handleClick(row){console.log(row);varorderId=row.orderId+row.oid.toString();console.log(orderId);this.$ajax({method:"get",url:"http://localhost:8081/order/getDoc",responseType:'blob'}).then((res)=>{//这里是res.data是返回的blob对象varblob=newBlob([res.data],{type:'application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=utf-8'});//application/vnd.openxmlformats-officedocument.wordprocessingml.document这里表示doc类型vardownloadElement=document.createElement('a');varhref=window.URL.createObjectURL(blob);//创建下载链接downloadElement.href=href;downloadElement.download=orderId+'.docx';//下载后的文件名为document.body.appendChild(downloadElement);downloadElement.click();//点击下载document.body.removeChild(下载元素);//下载完成后移除元素window.URL.revokeObjectURL(href);//释放blob对象})}}