最近有一个需求是:

将jqGrid表格中的数据生成报表Excel文件返回给用户。

我的想法是获取jqGrid中的数据然后生成json数据,传给后端,生成文件流,响应到前端,保存为excel文件。

ajax为什么不能够实现下载文件

ajax的返回值类型是json,text,html,xml类型,或者可以说ajax的接收类型只能是string字符串,不是流类型,所以无法实现文件下载。

但用ajax仍然可以获得文件的内容,该文件将被保留在内存中,无法将文件保存到磁盘。这是因为JavaScript无法和磁盘进行交互,否则这会是一个严重的安全问题,js无法调用到浏览器的下载处理机制和程序,会被浏览器阻塞。

并且 我用ajax实现的时候出现了很多bug。

在网上参考好多博客,经过不断的调试,我还是选择了原生的XMLHttpRequest对象进行post请求。

blob(HTML5 新特性)

二进制大对象,是一个可以存储二进制文件的容器。

作用

Js一直以来都没有比较好的可以直接处理二进制的方法。而Blob的存在,允许我们可以通过JS直接操作二进制数据。

Blob对象可以看做是存放二进制数据的容器,此外还可以通过Blob设置二进制数据的MIME类型。

BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。

重点应用
  • 目前做的通过URL下载文件。
  • 分片上传文件(将大文件分片,轮询向后台提交各文件片段)。

后端代码

/*** 生成Excel报表* Error:存在问题* 1. 前端表格中没有Student对象的一些属性,生成报表时不必要显示的属性字段在Excel中显示。*    solve:加判断控制。* 2. (由于blob是HTML5新出的)兼容性问题:chrome、firefox、opera无问题,* 3. 检测grid表格中有无字段名称冲突问题。*    solve:细心检查即可* 4. 下载完Excel,打开出现"文件已损坏 无法打开"问题,这是因为office受保护试图导致(安全问题)*    solve:在office选项里边修改一下即可(客户端问题)* @param list* @param response*/
@RequestMapping(value = "/exstudent",consumes = "application/json;charset=utf-8")
public void export (@RequestBody List<Student> list, HttpServletResponse  response){OutputStream out = null;String name = "学生信息管理表";for (Student stu:list) {System.out.println(stu.getStudentname());}try {response.setHeader("content-type", "application/octet-stream");response.setContentType("application/octet-stream");response.setHeader("Content-Disposition", "attachment;filename=" +URLEncoder.encode(name, "UTF-8")+".xlsx");out = response.getOutputStream();//调用老师自己写的库,本篇文章不详细说生成Excel文件的事情。TExcel.exportExcel(name,Student.class,list,out);System.out.println("下载ok");out.flush();out.close();} catch (Exception e) {e.printStackTrace();}finally{}
}

前端代码:

//导出按钮被点击之后,将按钮制为无效(防止多次生成)
function abideBtn(){console.log("禁止按钮......");$("#download").attr({"href":"#"});$("#download").css("cursor","not-allowed");
}
//下载过程中出错误,
function downloadError(){console.log("发生错误,下载失败");alert("下载中出现错误!请重试");$("#download").attr({"href":"javascript:exportData();"});$("#download").css("cursor","pointer");
}
//导出表格数据
//注意:下面获取jqGrid中所有行数据的前提是分页在前端,而不是后端。
//如果你是在后端分页,那么你会发现,你会将所有数据都显示出来。
function exportData() {var grid = jQuery("#grid");//获取当前显示的数据var rowNum = grid.jqGrid('getGridParam', 'rowNum'); //获取显示配置记录数量var total = grid.jqGrid('getGridParam', 'records'); //获取查询得到的总记录数量//设置rowNum为总记录数量并且刷新jqGrid,使所有记录现出来调用getRowData方法才能获取到所有数据grid.jqGrid('setGridParam',{rowNum: total,}).trigger('reloadGrid');var rows = o.jqGrid('getRowData');grid.jqGrid('setGridParam',{rowNum: rowNum,}).trigger('reloadGrid');postToPOM(rows);
}
//发送post请求
function postToPOM(rows) {console.log(rows);var url = "../student/exstudent";var xhr = new XMLHttpRequest();xhr.open('POST',url,true);xhr.responseType = "blob";xhr.setRequestHeader("Content-Type", "application/json;charset=utf-8");//添加监听事件。xhr.addEventListener("load",abideBtn,false);xhr.addEventListener("error",downloadError,false);xhr.onload = function (){if(this.status === 200){//创建Bolb对象var blob = this.response;//html5新出的var reader = new FileReader();reader.readAsDataURL(blob);reader.onload = function(e){//创建a标签,构造下载弹窗var a = document.createElement("a");a.id = "downloadTag";a.download = '学生信息管理表.xlsx';a.href = e.target.result;$("body").append(a);a.click();$("#downloadTag").remove();console.log("下载完成!");//恢复按钮$("#download").attr({"href":"javascript:exportData();"});$("#download").css("cursor","pointer");}}};xhr.send(JSON.stringify(rows));
}

转载于:https://www.cnblogs.com/yjz6/p/9799593.html

获取jqGrid中的所有数据导出并生成Excel文件流供用户下载(post请求实现文件下载)...相关推荐

  1. 自动更新开奖数据的excel文件,供大家下载

    自动更新开奖数据的excel文件,供大家下载 2010-03-14 20:22 228492人阅读打印来源:乐彩网 作者:eren 很多人拥有自制excel电子表格,常要更新最基本的开奖信息.如有多期 ...

  2. python连接数据库,处理数据结果后生成excel文件

    # _*_coding:utf-8 _*_ import time import xlwt import os import pymysql import sys import datetime fr ...

  3. 针对大量数据,MATLAB生成EXCEL文件并进行排版处理的源码

    #MATLAB生成EXCEL文件并进行排版处理的源码 项目要求:给定某海洋站潮位数据在一年之年的每分钟潮位数据(一共有24×60×365=525600个数),txt格式,要求制作出海洋站该年份的潮汐表 ...

  4. javaSE中的数据导出到Excel表、javaEE中后台生成Excel文件到浏览器端下载

    整个项目中导出数据到.Excel的源码 import java.io.BufferedOutputStream; import java.io.FileInputStream; import java ...

  5. 办公自动化:轻松提取PDF页面数据,并生成Excel文件(代码实战)

    发现网上有专门做文档格式转换的网站,不过是要充会员才可以.今天来做一篇PDF转换成Excel文档的代码实战,希望大佬喜欢,哈哈,话不多说,马上进入实战环节. [阅读全文] 首先,我们一如既往的介绍一下 ...

  6. PhpSpreadsheet 基本使用和导入 导出 模版生成Excel文件

    一. 基本使用 <?phpuse PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Worksheet\Dra ...

  7. java中的各行换色_java生成excel文件并且隔行换色。

    实体类实例: @Data @Table(name = "test_user") @Entity @ExcelTarget(value = "userDO") / ...

  8. 智能视频内容生产中专业视频数据导出工具的研发

    点击上方"LiveVideoStack"关注我们 随着智能视频生产时代的到来,专业视频的制作将会变得更智能.更简单.智能视频生产中主要包含三大模块,他们分别是:视频SDK底层能力. ...

  9. JSP、EL和JSTL-学习笔记03【EL介绍和运算符、EL获取域中存储的数据】

    Java后端 学习路线 笔记汇总表[黑马程序员] JSP.EL和JSTL-学习笔记01[JSP基础语法] JSP.EL和JSTL-学习笔记02[MVC] JSP.EL和JSTL-学习笔记03[EL介绍 ...

最新文章

  1. 【Alpha 冲刺】 10/12
  2. 写代码有什么该注意的
  3. Linux监控平台搭建( zabbix监控)
  4. 入门C语言20问20答
  5. 如何编写用户操作手册
  6. 为什么我要选择erlang+go进行server架构(2)
  7. 题解P3745期末考试
  8. PointDSC: Robust Point Cloud Registration using Deep Spatial Consistency (PointDSC) 论文学习笔记小结
  9. 增加javascript的 trim函数
  10. 【实习日报】2019年6月上半月 前端开发实习工作日报汇总
  11. 定了!自考还没有报名的每人补贴8000元!政策扶持,名额有限,速看!!!!...
  12. 香肠派对手游怎么在电脑上玩 香肠派对电脑版玩法教程
  13. 烧写工具DNW的使用
  14. Excel中Chart对象成员表
  15. 别把激励员工变成收买员工
  16. 广东移动魔百盒M411A _905L3_线刷固件包
  17. C++刷过的笔试题知识点
  18. vue中使用wangeditor富文本编辑器(含图片上传和回显)
  19. 计算几何基础【用图来助你理解几何算法】
  20. H.264转码加速:NVENC大战Quick Sync

热门文章

  1. 关于VScode设置护眼色的方法
  2. php utf-8正则匹配汉字,php utf-8编码 正则匹配中文
  3. CC1310有关GPIO外设的配置过程
  4. $axios.post 表单序列化 URLSearchParams
  5. 使用触发器进行表数据备份
  6. 基于以太坊区块链的物联网/IoT设备管理【论文及源码】
  7. 万彩脑图大师教程 | 新手入门帮助
  8. 防火卷帘门算料计算公式
  9. 全景视频播放器代码分析
  10. 总结:那些热门的开源游戏服务器框架,还不看你就out了