对于大型excel的创建且不会内存溢出的,就只有SXSSFWorkbook了。它的原理很简单,用硬盘空间换内存(就像hash map用空间换时间一样)。

private void writeToAlarmExcel(List<Map<String, Object>> list,String alarmTime, String subCenterName,HttpServletResponse response) throws Exception {
String excelName = subCenterName+"电气火灾预警统计表";
response.addHeader("Content-Disposition",
"attachment;filename=" + new String(excelName.getBytes("gb2312"), "ISO8859-1") + ".xlsx"); // 设置文件的名称
response.setContentType("application/msexcel;charset=gb2312");// 设置下载类型
OutputStream out = response.getOutputStream();
try {
// 声明一个工作簿
XSSFWorkbook wb = new XSSFWorkbook();
SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(wb, 100);//内存中保留 1000 条数据,以免内存溢出,其余写入 硬盘
// 创建HSSFCellStyle单元格样式
CellStyle cellStyle = wb.createCellStyle();
// 设置水平对齐的样式为居中对齐;
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 生成一个表格
Sheet sheet = wb.createSheet("sheet1");
// 在sheet里创建第一行,参数为行索引(excel的行),可以是0~65535之间的任何一个
Row row0 = sheet.createRow((int) 0);
// 创建单元格(excel的单元格,参数为列索引,可以是0~255之间的任何一个
Cell cell = row0.createCell(0);
// 设置单元格内容
String newTime="";
if (StringUtils.isNotBlank(alarmTime)) {
if (alarmTime.trim().length() == 4) {//
newTime = alarmTime+"年";
} else if (alarmTime.trim().length() == 7) {// 2018-06
String[] aStrings = alarmTime.split("-");
newTime = Integer.parseInt(aStrings[0])+"年"+Integer.parseInt(aStrings[1])+"月";
} else if (alarmTime.trim().length() == 10) {// 2018-07-02
String[] aStrings = alarmTime.split("-");
newTime = Integer.parseInt(aStrings[0])+"年"+Integer.parseInt(aStrings[1])+"月"+Integer.parseInt(aStrings[2])+"日";
}
}else {
newTime = DateUtils.DateToString(new Date(), "yyyy年MM月");
}
//设置字体样式
Font beforefont = wb.createFont();
beforefont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗提显示
beforefont.setFontHeightInPoints((short)18);
cellStyle.setFont(beforefont);
cell.setCellValue(excelName);
// 将样式应用于单元格
cell.setCellStyle(cellStyle);
// 合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 7));
Cell cell2 = row0.createCell(8);
// 创建HSSFCellStyle单元格样式
CellStyle cellStyle3 = sxssfWorkbook.createCellStyle();
// 设置字体样式
Font afterfont = sxssfWorkbook.createFont();
afterfont.setFontHeightInPoints((short) 10);
cellStyle3.setFont(afterfont);
cell2.setCellValue("(统计时间:" + newTime + ")");
cell2.setCellStyle(cellStyle3);
Row row1 = sheet.createRow((int) 1);
//设置字体样式
CellStyle cellStyle2 = wb.createCellStyle();
Font font2 = wb.createFont();
font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示
font2.setFontHeightInPoints((short)11);
cellStyle2.setFont(font2);
row1.createCell(0).setCellValue("序号");
row1.getCell(0).setCellStyle(cellStyle2);
row1.createCell(1).setCellValue("单位");
row1.getCell(1).setCellStyle(cellStyle2);
row1.createCell(2).setCellValue("预警设施");
row1.getCell(2).setCellStyle(cellStyle2);
row1.createCell(3).setCellValue("预警地址");
row1.getCell(3).setCellStyle(cellStyle2);
row1.createCell(4).setCellValue("预警次数");
row1.getCell(4).setCellStyle(cellStyle2);
row1.createCell(5).setCellValue("首次预警时间");
row1.getCell(5).setCellStyle(cellStyle2);
row1.createCell(6).setCellValue("最后一次预警时间");
row1.getCell(6).setCellStyle(cellStyle2);
row1.createCell(7).setCellValue("预警状态");
row1.getCell(7).setCellStyle(cellStyle2);
int rowNum = 2;
int num = 1;
for (Map<String, Object> b : list) {
int cellNo = 0;
row1 = sheet.createRow(rowNum);
row1.createCell(cellNo++).setCellValue(num++);
row1.createCell(cellNo++).setCellValue(b.get("unitName") == null ? "" : b.get("unitName").toString());
row1.createCell(cellNo++)
.setCellValue(b.get("deviceName") == null ? "" : b.get("deviceName").toString());
row1.createCell(cellNo++)
.setCellValue(b.get("deviceAddress") == null ? "" : b.get("deviceAddress").toString());
row1.createCell(cellNo++).setCellValue(b.get("warnNum") == null ? "" : b.get("warnNum").toString());
row1.createCell(cellNo++)
.setCellValue(b.get("firstWarnTime") == null ? "" : b.get("firstWarnTime").toString());
row1.createCell(cellNo++)
.setCellValue(b.get("lastWarnTime") == null ? "" : b.get("lastWarnTime").toString());
row1.createCell(cellNo++)
.setCellValue(b.get("operationState") == null ? "" : b.get("operationState").toString());
rowNum++;
}
wb.write(out);
} catch (Exception e) {
e.printStackTrace();
throw new Exception("写入失败!");
}
}

大量数据的excel导出的更多相关文章

  1. 利用Aspose.Cells完成easyUI中DataGrid数据的Excel导出功能

    我准备在项目中实现该功能之前,google发现大部分代码都是利用一般处理程序HttpHandler实现的服务器端数据的Excel导出,但是这样存在的问题是ashx读取的数据一般都是数据库中视图的数据, ...

  2. 数据库数据用Excel导出的3种方法

    将数据库数据用Excel导出主要有3种方法:用Excel.Application接口.用OleDB.用HTML的Tabel标签 方法1——Excel.Application接口: 首先,需要要Exce ...

  3. Django+python实现网页数据的excel导出

    一直都想做一个网页的excel导出功能,最近抽时间研究了下,使用urllib2与BeautifulSoup及xlwt模块实现 urllib2这个模块之前有用过,关于BeautifulSoup模块,可参 ...

  4. .NET使用Office Open XML导出超大数量数据到 Excel

    我相信很多人在做项目的都碰到过Excel数据导出的需求,我从最开始使用最原始的HTML拼接(将需要导出的数据拼接成TABLE标签)到后来happy的使用开源的NPOI, EPPlus等开源组件导出EX ...

  5. .NET使用Office Open XML导出大量数据到 Excel

    我相信很多人在做项目的都碰到过Excel数据导出的需求,我从最开始使用最原始的HTML拼接(将需要导出的数据拼接成TABLE标签)到后来happy的使用开源的NPOI, EPPlus等开源组件导出EX ...

  6. 1.ASP.NET MVC使用EPPlus,导出数据到Excel中

    好久没写博客了,今天特地来更新一下,今天我们要学习的是如何导出数据到Excel文件中,这里我使用的是免费开源的Epplus组件. 源代码下载:https://github.com/caofangshe ...

  7. 导出数据到Excel --使用ExcelReport有感

    先看图,这是几个月前用NPOI写的导出数据到Excel,用了上百行代码,而且难控制,导出来也比较难看 excel打开的效果 下面是我用ExcelReport类库导出到Excel的操作 1.首先引用Ex ...

  8. 使用Open xml 操作Excel系列之二--从data table导出数据到Excel

    由于Excel中提供了透视表PivotTable,许多项目都使用它来作为数据分析报表. 在有些情况下,我们需要在Excel中设计好模板,包括数据源表,透视表等, 当数据导入到数据源表时,自动更新透视表 ...

  9. Dynamics CRM导出数据到Excel

    原创地址:http://www.cnblogs.com/jfzhu/p/4276212.html 转载请注明出处 Pivot Table是微软BI的一个重要工具,所以这里讲一下Dynamics CRM ...

随机推荐

  1. Java的流

    Java中的流主要是用来读写文件的.只要明确你是读文件还是写文件就可以确定使用哪种流了.读:read   写:writer 1.读文件:filereader这个类,顾名思义就知道是读文件了. 2.写文 ...

  2. springboot整合mybatis(使用MyBatis Generator)

    引入依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> ...

  3. java微信公众号支付示例

    开始之前,先准备好:appid.商家号.商户密匙. 工具类: MD5Util.java package com.yiexpress.core.utils.wechat; import java.sec ...

  4. 硬件笔记之MacMini开启HiDPI

    0x00 概述 先科普一下,有关retina和HiDPI那点事 ,Macmini在2k显示器的显示太小了,看起来费眼,没办法,苹果原生HiDPI是支持4k显示器的,所以以后买显示器,直接买4k的一步到 ...

  5. 基于OpenCV做“三维重建”(4)--相机姿态还原和实现三维重建

    v当我们构建成功了viz,就可以使用3维效果给我们提供的便利,进一步进行一些3维的操作. 在这个动画中,注意图片后面的那个黑线,对应的是相机的位置. /*----------------------- ...

  6. chrome浏览器导出文件提示病毒扫描失败

    转自https://zhidao.baidu.com/question/758059392558639324.html 1.windows+R,打开运行 2.输入regedit.exe,确定,打开注册 ...

  7. elasticsearch_.net_client_nest2.x_到_5.x常用方法属性差异

    目录: Elasticsearch .net client NEST 5.x 使用总结 elasticsearch_.net_client_nest2.x_到_5.x常用方法属性差异 Elastics ...

  8. buaacoding_2018算法期末上机G题.地铁建设题解

    // 标注:本文旨在为博主确立一种题解的基本范式,以避免博主的题解流于AC代码的粘贴.此基本范式为:完整而简洁明了的思路及其推导说明,力图触及问题的本质并衍生对同类问题的思路分析,使得题解具有泛用性, ...

  9. bzoj2054疯狂的馒头——线段树

    中文题面,一排有n个馒头,用刷子把整个连续的区间刷成一种颜色.因为颜色会覆盖掉之前的.所以我们可以用线段树来反着处理.如果这段区间之前刷到过就不要再遍历进去了,因为这次已经被上次刷的颜色给覆盖了.最后 ...

  10. Xilinx Vivado的使用详细介绍(4):Zedboard+vivado之流水灯(加SDK)

    Vivado+zedboard之初学流水灯 Author:zhangxianhe 环境:vivado 2016.3(已验证适用于2015.4) 开发板:Zedboard version xc7z020 ...