前端vue项目-关于下载文件pdf/excel(三)
最近在做一些需求,需要下载一些文件信息,最频繁的就是下载excel文件到本地了
看过了很多方法,做个整理吧哈哈哈哈
参考的文章链接:
https://www.cnblogs.com/jiangweichao/p/9620940.html
https://www.jianshu.com/p/56680ce1cc97
https://www.cnblogs.com/jasmine-95/p/6054652.html
https://www.cnblogs.com/duke-peng/p/8862773.html
一、 将页面中的html信息转换为PDF文档,下载到本地
先将html生成为图片,再将图片转为pdf文档
var target = document.getElementById('policy-information');// 是将target指向需要被生成的html内容
例如:(vue中)
<span v-html="emailContent" id="emailContentId"></span> //emailContent是定义好的html内容,并且在return里定义了 emailContent
此时的target为: var target = document.getElementById('emailContentId');
使用此方式时,vue需要安装模块:
npm install html2canvas jspdf --save
downPdf() {
var that = this;
var target = document.getElementById("policy-information");//policy-information是html的id信息
//target.style.background = "#FFFFFF";
html2canvas(target, {
"imageTimeout": 0,
'scale': 2,
}).then(canvas => {
var contentWidth = canvas.width;
var contentHeight = canvas.height;
//一页pdf显示html页面生成的canvas高度;
var pageHeight = contentWidth / 592.28 * 841.89;
//未生成pdf的html页面高度
var leftHeight = contentHeight;
//页面偏移
var position = 0;
//a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
var imgWidth = 595.28;
var imgHeight = 592.28 / contentWidth * contentHeight;
var pageData = canvas.toDataURL('image/jpeg', 1.0);
var pdf = new jspdf('', 'pt', 'a4'); //有两个高度需区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
//当内容未超过pdf一页显示的范围,无需分页
if(leftHeight < pageHeight) {
pdf.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
} else {
while(leftHeight > 0) {
pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
leftHeight -= pageHeight;
position -= 841.89;
//避免添加空白页
if(leftHeight > 0) {
pdf.addPage();
}
}
}
var name = 'content-' + that.plcNo + '.pdf'; // 定义生成的pdf的文件名字
pdf.save(name);
});
},
二、获取后台返回的流数据,并下载pdf zip xlsx word ...
(这种方法我尝试的时候发现它能下载excel,但是打不开,总是报错... 由于当时在解决问题 就换了种方式去实现了 仅供参考)
/** 后台返回的字节流 下载 */
downloadPDF () {
let that = this;
$.ajax({
url:'http://localhost:8080/download' //后台下载信息的请求链接
type: "GET",
responseType: 'arraybuffer',
success: function(response){ //response为后台返回的流数据信息
//msword pdf zip // application/vnd.openxmlformats-officedocument.spreadsheetml.sheet这里表示xlsx类型
var blob = new Blob([response], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'});
var downloadElement = document.createElement('a');
var href = window.URL.createObjectURL(blob); // 创建下载的链接
downloadElement.href = href;
downloadElement.download = '表格'+'.xlsx'; // 下载后文件名
document.body.appendChild(downloadElement);
downloadElement.click(); // 点击下载
document.body.removeChild(downloadElement); // 下载完成移除元素
window.URL.revokeObjectURL(href); // 释放掉blob对象
},
error: function(data) {
alert("下载失敗"+data);
}
});
},
三、后台生成Excel,前端直接获取并下载Excel
这大概是最简单的方式吧,直接使用请求去访问后台,然后使用window.open打开就可以了
3.1 get方式请求后台,直接使用window.open打开请求结果。
downLoadExcel(){
window.open('http://localhost:8080/ens-notify/excelDownload?batchcode='+this.batchCode);
}
3.2 Form表单方式请求后台,直接下载excel文件
exportAllExcel() {
var tt = new Date().getTime();
var url ="http://localhost:8080"+"/excelDownload"; /**
* 使用form表单来发送请求
* 1.method属性用来设置请求的类型——post还是get
* 2.action属性用来设置请求路径。
*
*/
var form=$("<form>");//定义一个form表单
form.attr("style","display:none");
form.attr("target","");
form.attr("method","post"); //请求类型 如果是get请求可以改为get
form.attr("action",url); //请求地址
$("body").append(form);//将表单放置在web中 /**
* input标签主要用来传递请求所需的参数:
*
* 1.name属性是传递请求所需的参数名.
* 2.value属性是传递请求所需的参数值.
*
* 3.当为get类型时,请求所需的参数用input标签来传递,直接写在URL后面是无效的。
* 4.当为post类型时,queryString参数直接写在URL后面,formData参数则用input标签传递
* 有多少数据则使用多少input标签
*
*/
var input1=$("<input>");input1.attr("type","hidden");input1.attr("name","batchcode"); input1.attr("value",'2018120601');form.append(input1);
var input2=$("<input>");input2.attr("type","hidden");input2.attr("name","msgState"); input2.attr("value",'0');form.append(input2);
var input3=$("<input>");input3.attr("type","hidden");input3.attr("name","businessType"); input3.attr("value",'P');form.append(input3);
var input4=$("<input>");input4.attr("type","hidden");input4.attr("name","origin"); input4.attr("value",'222');form.append(input4);
var input5=$("<input>");input5.attr("type","hidden");input5.attr("name","createDate"); input5.attr("value",tt);form.append(input5); form.submit();//表单提交
},
3.3 Ajax异步交互
$.ajax({
url: "http://localhost:8080"+"/excelDownload",
type: "GET", //请求方式可变为post
contentType: "application/json",
data: {
batchcode:this.batchCode,
msgState:this.msgState,
businessType:this.businessType,
origin:this.origin,
createDate:this.createDate
},
success: function(response) {
var blob = new Blob([response], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'});
var downloadElement = document.createElement('a');
var href = window.URL.createObjectURL(blob); // 创建下载的链接
downloadElement.href = href;
downloadElement.download = '111.xlsx'; // 下载后文件名
document.body.appendChild(downloadElement);
downloadElement.click(); // 点击下载
window.URL.revokeObjectURL(href); // 释放掉blob对象 }
});
四、.根据页面的table数据导出Excel
使用这种方式导出Excel,需要再vue中安装三个插件,并且导入两个js文件放在src下
npm install -S file-saver xlsx npm install -D script-loader
并且从网上下载js文件: Blob.js和Export2Excal.js
放在项目的src/excel_plugin 目录下 exportChooseExcel: function() { // 兼容ie10哦!
require.ensure([], () => {
const { export_json_to_excel } = require('../excel_plugin/Export2Excel'); // 引入文件
//消息號 PDF 生成批次號 保單號 客戶號 消息類型 業務分類 接收人類型 模板 ID 消息創建者 創建時間 狀態
const tHeader = ['消息號', 'PDF 生成批次號', '保單號', '客戶號', '業務分類' ,'模板 ID', '狀態' ,'創建時間', 'printFileId']; //Excel的列名称信息定义
const filterVal = ['msgId', 'batchCode', 'biztypeno', 'custno', 'businessType' ,'templateId', 'msgstate' ,'createdDate', 'printFileId']; //
const list = this.multipleSelection; //这是表格中的数据内容 (需要导出的数据内容信息 tableData)
const data = this.formatJson(filterVal, list);
export_json_to_excel(tHeader, data, '列表excel'); //列头信息 数据内容 导出的excel文件名字
}) },
formatJson(filterVal, jsonData) {
return jsonData.map(v => filterVal.map(j => v[j]))
}
前端vue项目-关于下载文件pdf/excel(三)的更多相关文章
- java 的在线下载文件 .pdf
java 的在线下载文件 .pdf 1.下载资源的本地位置 2.设置响应头 3.下载代码 1 PeriodicalResource periodicalResource = periodicalR ...
- 团队开发前端VUE项目代码规范
团队开发前端VUE项目代码规范 2018年09月22日 20:18:11 我的小英短 阅读数 1658 一.规范目的: 统一编码风格,命名规范,注释要求,在团队协作中输出可读性强,易维护,风格一致 ...
- vue项目的各个文件作用
vue项目的各个文件作用: build:放置的是webpack配置文件,一般不动,修改了必须重启服务器才能生效 config:放置针对开发环境和线上环境的配置文件,一般不动 修改后需重启 node_m ...
- Vue项目中的文件/文件夹命名规范
Vue项目中的文件/文件夹命名规范 0.2262018.09.21 16:01:09字数 820阅读 6979 文件或文件夹的命名遵循以下原则: index.js 或者 index.vue,统一使用小 ...
- 如何在启用JWT Token授权的.NET Core WebApi项目中下载文件
背景 前几天,做项目的时候遇到一个文件下载的问题.当前系统是一个前后端分离的项目,前端是一个AngularJs项目, 后端是一个.NET Core WebApi项目.后端的Api项目使用了Jwt To ...
- 前端Vue项目——首页/课程页面开发及Axios请求
一.首页轮播图 1.elementUI走马灯 elementUI中 Carousel 走马灯,可以在有限空间内,循环播放同一类型的图片.文字等内容. 这里使用指示器样式,可以将指示器的显示位置设置在容 ...
- 前端Vue项目——登录页面实现
一.geetest滑动验证 geetest官方文档地址:https://docs.geetest.com/ 产品——极速验证:基于深度学习的人机识别应用.极验「行为验证」是一项可以帮助你的网站与APP ...
- Java浏览器下载文件为excel(springMVC方式)
action中的方法 /** * Excel文件下载处理 * @return */ @RequestMapping("/downloanExcel") public ModelAn ...
- vue项目中一些文件的作用
原文 简书原文:https://www.jianshu.com/p/38749e5bec3c 大纲 1.vue项目结构 2.主要的配置文件 2.1.package.json 2.2.dev-serve ...
随机推荐
- 小程序for循环给里面单独的view加单独的样式
效果图如下: 上面是个列表从数据库拿下来所有的信息:在视图层直接一个for循环展示下来,现在麻烦来了前三个和后面的额不一样,小程序不允许dom操作,那怎么解决呢? 解决办法: wx:for和wx:if ...
- ajax和iframe区别
ajax和iframe https://segmentfault.com/a/1190000011967786 ajax和iframe的区别 1.都是局部刷新 2.iframe是同步的,而ajax是异 ...
- 关于ascii码的一些内容
1.通过C#程序输出tab(制表符)内容. 1.1常用方式我们可以是 //测试输出\t到文件 File.WriteAllText("test.txt", "a\tb\tc ...
- G711编解码
http://blog.csdn.net/rightorwrong/article/details/4209467 搞语音对讲几天了,播放时声音干扰太大了.拖得时间久有两个原因: 1.每次采样的位数这 ...
- BGP - 2,BGP报文和BGP状态
1,BGP报文 Open:建邻居,交换version.AS号.holdtime.BGP identifier(即RouterID).可选参数长度.可选参数. Keepalive:保 ...
- LeetCode--004--寻找两个有序数组的中位数(java)
转自https://blog.csdn.net/chen_xinjia/article/details/69258706 其中,N1=4,N2=6,size=4+6=10. 1,现在有的是两个已经排好 ...
- 原生JS实现瀑布流布局
瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部. 1.首先瀑布流所有的图片应该保持宽度一致,高 ...
- Html Email 邮件html页编写指南
前言 写过邮件的html的童学应该都知道,邮件的html一般都用table来布局,为什么呢?原因是大多数的邮件客户端(比如Outlook和Gmail),会过滤HTML设置,让邮件面目全非. 经过多次的 ...
- Watto and Mechanism CodeForces - 514C (字典树,哈希)
大意: 给定字符串集$S$, 每次询问给出字符串$a$, 求$S$中是否存在一个字符串恰好与$a$相差一个字符. 直接建字典树暴力复杂度是$O(n\sqrt{n})$, 也可以用set维护所有哈希值, ...
- Anya and Cubes CodeForces - 525E (双端搜索)
大意: 给定$n$元素序列$a$, 可以任选不超过$k$个$a_i$变换为$a_i!$, 求变换后任选若干元素和为S的方案数. 分成两块暴搜, 复杂度$O(3^{\frac{n}{2}})$ #inc ...