对于大型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. 14: linux实用命令

    1.1 基本实用命令整理 1.查找大文件文件 du -sh ./*|grep G                 # 查看当前目录下个文件大于1G的文件夹 2.查找日志文件中 5xx数量,并进行排序 ...

  2. GOQTTemplate3的多线程化改造

    GOQTTemplate3作为一个QT+OpenCV的平台,希望能够为使用者提供基础的跨平台的图像处理框架.图像处理算法和GUI两个线程的隔离,是必然需要的.在之前的版本中,都采用了OnTimer的方 ...

  3. StreamReader 和 StreamWriter 简单调用

    /* ######### ############ ############# ## ########### ### ###### ##### ### ####### #### ### ####### ...

  4. Java静态代码块与非静态代码块

    静态代码块,格式是 static{ },随着类的加载而加载,且只执行一次. 在程序中,执行的优先级最高. 非静态代码块,格式是{ },在创建对象的时候运行(即new一个对象的时候),每创建一次对象就执 ...

  5. WinForm 绑定到嵌套对象上的属性

    WinFrom 绑定到嵌套对象上的属性 关键字: Windows Forms, DataBindings, Nested Class, 嵌套类 在 WinForm 中很早就已经支持数据绑定, 使用数据 ...

  6. [转载]使用IEDriverServer.exe驱动IE11,实现自动化测试

    转自:https://www.cnblogs.com/feiquan/p/8531618.html 下载地址: http://dl.pconline.com.cn/download/771640-1. ...

  7. Python中的反转字符串问题

    按单词反转字符串是一道很常见的面试题.在Python中实现起来非常简单. def reverse_string_by_word(s): lst = s.split() # split by blank ...

  8. MySQL中select、insert、update批量操作语句

    项目中经常的需要使用批量操作语句对数据进行操作,使用批量语句的时候需要注意MySQL数据库的条件限制,这里主要是数据的大小限制,这里对批量插入.批量查找及批量更新的基础操作进行下简单的汇总. 1.批量 ...

  9. Struts2---动态action以及应用

    为了处理各种逻辑业务,根据execute方法来判断请求哪种业务,然后将请求转发到对应的业务处理上, 通过动态请求action对象中的方法,实现某个单一的业务逻辑处理. 动态action的应用 //创建 ...

  10. Hadoop之HDFS概述

    一.HDFS产生背景及定义 1.HDFS产生背景 随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文 ...