2019独角兽企业重金招聘Python工程师标准>>>

思路:需要2次请求,第一次ajax请求把数据查询出来,按照1000条数据一个sheet,在后台生成临时文件,并把文件名称返回给web,第二次请求直接下载临时文件下载完成后,删除临时文件

代码如下web端:

// 导出
function cmd_toExcel() {$.messager.progress({ title: '请等待', msg: "<span style='color:green'>人生若只如初见</span>", text: '努力下载中.......' });$.ajax({type : "post",url : cmd.toexport,data : formToObject('.searchBox'),dataType : "json",success : function(data) {location.href = _ctx + "/rest/download/getfile?name=" + data + "&originFileName=" + "车辆统计.xls";$.messager.progress('close');}});
}

后台服务端,生成临时文件接口:

/*** 导出* * @throws Exception*/@RequestMapping(value = "/toexport", method = { RequestMethod.POST, RequestMethod.GET })@ResponseBodypublic String export(HttpServletRequest request, String area, Integer trans, String org, String no,AnalysisDate analysisdate, @RequestParam(required = false, defaultValue = "VEH_ID") String sort,@RequestParam(required = false, defaultValue = "asc") String order) throws Exception {Pageable pageable = new PageRequest(0, 1000000, new Sort("asc".equalsIgnoreCase(order) ? Direction.ASC: Direction.DESC, sort, "VEH_ID"));List<Map<String, Object>> list = manager.statistics(area, trans, org, no, analysisdate,SpringSecurityUtils.getCurrentUserArea(), pageable).getContent();String title = "车辆统计表";String[] rowsName = new String[] {"序号", "道路运输证号", "车牌", "企业名称", "所属区域", "运输行业分类", "车辆类型", "上线时长", "断开时长", "报警次数"};List<Object[]> dataList = new ArrayList<Object[]>();Object[] objs = null;for (int i = 0; i < list.size(); i++) {Map<String, Object> man = list.get(i);objs = new Object[rowsName.length];objs[0] = i;objs[1] = man.get("RTPN");objs[2] = man.get("VEH_ID") == null ? "" : man.get("VEH_ID");objs[3] = man.get("ORG_NAME") == null ? "" : man.get("ORG_NAME");objs[4] = man.get("AREANAME");objs[5] = man.get("TRANS_TYPE");objs[6] = man.get("VTYPE");objs[7] = durationFormatter(((BigDecimal)man.get("ONLINE_TIME")).intValue());objs[8] = durationFormatter(((BigDecimal)man.get("OFF_TIME")).intValue());objs[9] = man.get("WARN_AMOUNT");dataList.add(objs);}ExportExcel ex = new ExportExcel(title, rowsName, dataList, request);return ex.export();}
package com.wttech.gnss.utils;import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;import javax.servlet.http.HttpServletRequest;import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellRangeAddress;
import org.apache.poi.hssf.util.HSSFColor;/*** 导出Excel公共方法* **/
public class ExportExcel {// 显示的导出表的标题private String title;// 导出表的列名private String[] rowName;private List<Object[]> dataList = new ArrayList<Object[]>();HttpServletRequest request;// 构造方法,传入要导出的数据public ExportExcel(String title, String[] rowName, List<Object[]> dataList, HttpServletRequest request) {this.request = request;this.dataList = dataList;this.rowName = rowName;this.title = title;}/** 导出数据*/@SuppressWarnings("deprecation")public String export() throws Exception {String uuid = "/temp_" + UUID.randomUUID().toString() + ".xls";String filename = Properties.UPLOAD_ADDRESS + uuid;try {HSSFWorkbook workbook = new HSSFWorkbook(); // 创建工作簿对象int sheets = dataList.size() / 50000 + 1;for (int m = 0; m < sheets; m++) {HSSFSheet sheet = workbook.createSheet(title + m); // 创建工作表// 产生表格标题行HSSFRow rowm = sheet.createRow(0);HSSFCell cellTiltle = rowm.createCell(0);// sheet样式定义【getColumnTopStyle()/getStyle()均为自定义方法 - 在下面 - 可扩展】HSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook);// 获取列头样式对象HSSFCellStyle style = this.getStyle(workbook); // 单元格样式对象HSSFCellStyle headerStyle = getHeaderStyle(workbook);sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, (rowName.length - 1)));cellTiltle.setCellStyle(headerStyle);cellTiltle.setCellValue(title);// 定义所需列数int columnNum = rowName.length;HSSFRow rowRowName = sheet.createRow(2); // 在索引3的位置创建行(最顶端的行开始的第3行)// 将列头设置到sheet的单元格中for (int n = 0; n < columnNum; n++) {HSSFCell cellRowName = rowRowName.createCell(n); // 创建列头对应个数的单元格cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING); // 设置列头单元格的数据类型HSSFRichTextString text = new HSSFRichTextString(rowName[n]);cellRowName.setCellValue(text); // 设置列头单元格的值cellRowName.setCellStyle(columnTopStyle); // 设置列头单元格样式}// 将查询出的数据设置到sheet对应的单元格中List<Object[]> sub = dataList.subList(m * 50000, (m + 1) * 50000 < dataList.size() ? (m + 1) * 50000: dataList.size());for (int i = 0; i < sub.size(); i++) {Object[] obj = sub.get(i);// 遍历每个对象HSSFRow row = sheet.createRow(i + 3);// 创建所需的行数for (int j = 0; j < obj.length; j++) {HSSFCell cell = null; // 设置单元格的数据类型if (j == 0) {cell = row.createCell(j, HSSFCell.CELL_TYPE_NUMERIC);cell.setCellValue(i + 1);} else {cell = row.createCell(j, HSSFCell.CELL_TYPE_STRING);if (obj[j] != null) {cell.setCellValue(obj[j].toString()); // 设置单元格的值} else {cell.setCellValue(""); // 设置单元格的值}}cell.setCellStyle(style); // 设置单元格样式}}// 让列宽随着导出的列长自动适应for (int colNum = 0; colNum < columnNum; colNum++) {switch (colNum) {case 0:sheet.setColumnWidth(colNum, 6 * 256);break;default:sheet.setColumnWidth(colNum, 20 * 256);break;}}}if (workbook != null) {try {File file = new File(filename);// 以流的形式下载文件。BufferedOutputStream fis = new BufferedOutputStream(new FileOutputStream(file));workbook.write(fis);fis.flush();// 刷新流fis.close();// 关闭流} catch (IOException e) {e.printStackTrace();}}} catch (Exception e) {e.printStackTrace();}return uuid;}/** 表头单元格样式*/public HSSFCellStyle getHeaderStyle(HSSFWorkbook workbook) {// 设置字体HSSFFont font = workbook.createFont();// 设置字体大小font.setFontHeightInPoints((short) 11);// 字体加粗font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 设置字体名字font.setFontName("Courier New");// 设置样式;HSSFCellStyle style = workbook.createCellStyle();// 在样式用应用设置的字体;style.setFont(font);// 设置自动换行;style.setWrapText(false);// 设置水平对齐的样式为居中对齐;style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 设置垂直对齐的样式为居中对齐;style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);return style;}/** 表头单元格样式*/public HSSFCellStyle getRightStyle(HSSFWorkbook workbook) {// 设置字体HSSFFont font = workbook.createFont();// 设置字体大小font.setFontHeightInPoints((short) 11);// 字体加粗font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 设置字体名字font.setFontName("Courier New");// 设置样式;HSSFCellStyle style = workbook.createCellStyle();// 在样式用应用设置的字体;style.setFont(font);// 设置自动换行;style.setWrapText(false);// 设置水平对齐的样式为居中对齐;style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);// 设置垂直对齐的样式为居中对齐;style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);return style;}/** 列头单元格样式*/public HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) {// 设置字体HSSFFont font = workbook.createFont();// 设置字体大小font.setFontHeightInPoints((short) 11);// 字体加粗font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 设置字体名字font.setFontName("Courier New");// 设置样式;HSSFCellStyle style = workbook.createCellStyle();// 设置底边框;style.setBorderBottom(HSSFCellStyle.BORDER_THIN);// 设置底边框颜色;style.setBottomBorderColor(HSSFColor.BLACK.index);// 设置左边框;style.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 设置左边框颜色;style.setLeftBorderColor(HSSFColor.BLACK.index);// 设置右边框;style.setBorderRight(HSSFCellStyle.BORDER_THIN);// 设置右边框颜色;style.setRightBorderColor(HSSFColor.BLACK.index);// 设置顶边框;style.setBorderTop(HSSFCellStyle.BORDER_THIN);// 设置顶边框颜色;style.setTopBorderColor(HSSFColor.BLACK.index);// 在样式用应用设置的字体;style.setFont(font);// 设置自动换行;style.setWrapText(false);// 设置水平对齐的样式为居中对齐;style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 设置垂直对齐的样式为居中对齐;style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);return style;}/** 表头单元格样式*/public HSSFCellStyle getFootStyle(HSSFWorkbook workbook) {// 设置字体HSSFFont font = workbook.createFont();// 设置字体大小font.setFontHeightInPoints((short) 11);// 字体加粗font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 设置字体名字font.setFontName("Courier New");// 设置样式;HSSFCellStyle style = workbook.createCellStyle();// 在样式用应用设置的字体;style.setFont(font);// 设置自动换行;style.setWrapText(false);// 设置水平对齐的样式为居中对齐;style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);// 设置垂直对齐的样式为居中对齐;style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);return style;}/** 列数据信息单元格样式*/public HSSFCellStyle getStyle(HSSFWorkbook workbook) {// 设置字体HSSFFont font = workbook.createFont();// 设置字体大小// font.setFontHeightInPoints((short)10);// 字体加粗// font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 设置字体名字font.setFontName("Courier New");// 设置样式;HSSFCellStyle style = workbook.createCellStyle();// 设置底边框;style.setBorderBottom(HSSFCellStyle.BORDER_THIN);// 设置底边框颜色;style.setBottomBorderColor(HSSFColor.BLACK.index);// 设置左边框;style.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 设置左边框颜色;style.setLeftBorderColor(HSSFColor.BLACK.index);// 设置右边框;style.setBorderRight(HSSFCellStyle.BORDER_THIN);// 设置右边框颜色;style.setRightBorderColor(HSSFColor.BLACK.index);// 设置顶边框;style.setBorderTop(HSSFCellStyle.BORDER_THIN);// 设置顶边框颜色;style.setTopBorderColor(HSSFColor.BLACK.index);// 在样式用应用设置的字体;style.setFont(font);// 设置自动换行;style.setWrapText(false);// 设置水平对齐的样式为居中对齐;style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 设置垂直对齐的样式为居中对齐;style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);return style;}
}

接口2下载临时文件,并删除

@RequestMapping(value = "/getfile")@ResponseBodypublic void getfile(HttpServletRequest request,HttpServletResponse response,String name,String originFileName) throws ParseException {String path =  Properties.UPLOAD_ADDRESS + name ;File file = new File(path);// 以流的形式下载文件。InputStream fis;try {fis = new BufferedInputStream(new FileInputStream(path));byte[] buffer = new byte[fis.available()];fis.read(buffer);fis.close();response.reset();response.addHeader("Content-Disposition", "attachment;filename=" +URLEncoder.encode(originFileName, "UTF-8"));response.setCharacterEncoding("utf-8");response.addHeader("Content-Length", "" + file.length());OutputStream toClient = new BufferedOutputStream(response.getOutputStream());response.setContentType("application/octet-stream");toClient.write(buffer);toClient.flush();toClient.close();if (name.contains("temp")) {file.delete();}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

转载于:https://my.oschina.net/chuibilong/blog/845053

WEB下载数据量大的EXCEL解决方案相关推荐

  1. 历史数据如何处理_数据库表数据量大读写缓慢如何优化(1)【冷热分离】

    今天讨论的内容是冷热分离,也许概念并不陌生,对其使用场景也比较熟悉,但涉及锁的内容时仍然需要认真思考,这部分内容在我们实际开发中的"坑"还是不少的. 业务场景一 曾经经历过供应链相 ...

  2. 面试官问单表数据量大一定要分库分表吗?我们用六个字和十张图回答

    1 文章概述 在业务发展初期单表完全可以满足业务需求,在阿里巴巴开发手册也建议:单表行数超过500万行或者单表容量超过2GB才推荐进行分库分表,如果预计三年后数据量根本达不到这个级别,请不要在创建表时 ...

  3. 我艹,MySQL数据量大时,delete操作无法命中索引。

    来自:Java面试那些事儿 最近,在脉脉上看到一个楼主提出的问题:MySQL数据量大时,delete操作无法命中索引:并且还附上了相关案例截图. 最终,楼主通过开启MySQL分析优化器追踪,定位到是优 ...

  4. mysql给数据量大的表添加索引的办法

    有一个问题,一张表有3百万条记录,随着时间的增加,记录量会更多,此时查询速度很慢.在创建此表前没有未相应字段添加索引,所以此时需要为表添加索引.但是因为数据量大的原因,索引添加不成功,想了很多办法,终 ...

  5. 解决Mysql数据量大的时候 分页优化(使用limit)的问题

    解决Mysql数据量大的时候 分页优化(使用limit)的问题 参考文章: (1)解决Mysql数据量大的时候 分页优化(使用limit)的问题 (2)https://www.cnblogs.com/ ...

  6. Echars 折线图 自动向右平移显示数据(数据量大的时候适应)

    <!DOCTYPE html> <html><head><meta charset="utf-8"><title>Ech ...

  7. Java List数据量大, 需要分片批次操作

    很久前,写过关于list数据量大,分批处理的相关介绍文章(自定义的java代码实现): SSM Mybatis 批量插入 采用分批处理一次500条_默默不代表沉默-CSDN博客_mybatis分批插入 ...

  8. form 提交 无法显示该网页 数据量大提交Post too large错误

    如果form表单提交数据量大的时候会出现无法显示该网页. 解决办法1: 在 $TOMCAT_HOME$/conf/server.xml中找到 <Connector port="8080 ...

  9. nginx下载限速,解决下载并发量大导致带宽占满

    nginx下载限速,解决下载并发量大导致带宽占满 原因:文件服务和业务服务在同一台机器上,下载病区视频导致带宽被占满(97M/100M) 解决方式:现在单个请求的带宽 修改nginx配置文件nginx ...

最新文章

  1. VS2017 安装程序清单签名验证失败
  2. Guava之RateLimiter的设计
  3. 【Arduino】按键按下执行不同模式程序
  4. 使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件
  5. 应用层(知识架构图)
  6. 基于visual Studio2013解决C语言竞赛题之0705矩阵转置
  7. 设计灵感|如何让你的海报更吸睛?
  8. php foreach 不等于_你不知道的接口测试之简单的开始
  9. 吉吉影音官网版 v2.7.2.8_p2p播放器​
  10. 实验11 B样条曲面生成
  11. 小鹏G3/G3i/P7/P5维修手册电路图用户手册维修诊断拆装技术资料
  12. 柯桥在PPT中如何制作翻书动画?
  13. python就业方向
  14. 如何修改PDF并调整页面尺寸大小
  15. 聊城大学计算机2014高数试题,高数真题14-15.docx
  16. 高等数学强化6:二重积分
  17. sku设计mysql_如何设计SKU表结构
  18. ReactNative bug:Application has not bean registered.This is either due to require()error dur
  19. 新连接?新商业 一场关于商业变革的活动正在进行
  20. CODECHEF Oct. Challenge 2014 Children Trips

热门文章

  1. 如何大幅提高 Django 网站加载速度
  2. 记录::Opencv调用tensorflow2.x-Keras模型
  3. WinRAR 被曝严重安全漏洞;苹果预计推出跨平台应用
  4. 数据分类分级 数据识别-实现部分敏感数据识别
  5. 基于Lumerical的光子晶体谐振腔滤波器仿真模拟
  6. Python开发资源速查表
  7. php微信绑定银行卡_微信开发企业支付到银行卡PHP
  8. attempted an unsupported operation 、an unsupported operation was attempted [尝试不支持的操作]错误的三种解决方案
  9. 静态图片怎么做成gif图?如何将静态图做成动态图
  10. BUUCTF Misc 隐藏的钥匙