大量数据的excel导出
对于大型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导出的更多相关文章
- 利用Aspose.Cells完成easyUI中DataGrid数据的Excel导出功能
我准备在项目中实现该功能之前,google发现大部分代码都是利用一般处理程序HttpHandler实现的服务器端数据的Excel导出,但是这样存在的问题是ashx读取的数据一般都是数据库中视图的数据, ...
- 数据库数据用Excel导出的3种方法
将数据库数据用Excel导出主要有3种方法:用Excel.Application接口.用OleDB.用HTML的Tabel标签 方法1——Excel.Application接口: 首先,需要要Exce ...
- Django+python实现网页数据的excel导出
一直都想做一个网页的excel导出功能,最近抽时间研究了下,使用urllib2与BeautifulSoup及xlwt模块实现 urllib2这个模块之前有用过,关于BeautifulSoup模块,可参 ...
- .NET使用Office Open XML导出超大数量数据到 Excel
我相信很多人在做项目的都碰到过Excel数据导出的需求,我从最开始使用最原始的HTML拼接(将需要导出的数据拼接成TABLE标签)到后来happy的使用开源的NPOI, EPPlus等开源组件导出EX ...
- .NET使用Office Open XML导出大量数据到 Excel
我相信很多人在做项目的都碰到过Excel数据导出的需求,我从最开始使用最原始的HTML拼接(将需要导出的数据拼接成TABLE标签)到后来happy的使用开源的NPOI, EPPlus等开源组件导出EX ...
- 1.ASP.NET MVC使用EPPlus,导出数据到Excel中
好久没写博客了,今天特地来更新一下,今天我们要学习的是如何导出数据到Excel文件中,这里我使用的是免费开源的Epplus组件. 源代码下载:https://github.com/caofangshe ...
- 导出数据到Excel --使用ExcelReport有感
先看图,这是几个月前用NPOI写的导出数据到Excel,用了上百行代码,而且难控制,导出来也比较难看 excel打开的效果 下面是我用ExcelReport类库导出到Excel的操作 1.首先引用Ex ...
- 使用Open xml 操作Excel系列之二--从data table导出数据到Excel
由于Excel中提供了透视表PivotTable,许多项目都使用它来作为数据分析报表. 在有些情况下,我们需要在Excel中设计好模板,包括数据源表,透视表等, 当数据导入到数据源表时,自动更新透视表 ...
- Dynamics CRM导出数据到Excel
原创地址:http://www.cnblogs.com/jfzhu/p/4276212.html 转载请注明出处 Pivot Table是微软BI的一个重要工具,所以这里讲一下Dynamics CRM ...
随机推荐
- iOS进阶之使用 NSURLProtocol 拦截 HTTP 请求(转载)
这篇文章会提供一种在 Cocoa 层拦截所有 HTTP 请求的方法,其实标题已经说明了拦截 HTTP 请求需要的了解的就是 NSURLProtocol. 由于文章的内容较长,会分成两部分,这篇文章介绍 ...
- js 获取屏幕或元素宽高...
窗口相对于屏幕顶部距离 window.screenTop 窗口相对于屏幕左边距离 window.screenLeft, 屏幕分辨率的高 window.screen.height, 屏幕分辨率的宽 wi ...
- 文件和IO流
摘要:本文主要介绍了Java的文件处理以及常用的IO流操作. 文件操作 概念 File是数据源(保存数据的地方)的一种,可以表示一个文件,也可以表示一个文件目录. File类只能对文件和文件夹进行创建 ...
- C# 为所有 CheckBox 添加事件
C# 为 form 窗体中的所有相同组件循环添加相同事件,这样减少了代码量. private void Form2_Load(object sender, EventArgs e) { foreach ...
- kube-liveboard: kubernetes集群可视化工具
kube-liveboard 随着kubernetes 集群的增大,对于集群数据选取恰当的形式进行展示有助于直观反映集群的状态,方便发现集群的短板,了解集群的瓶颈.因此,笔者做了kube-livebo ...
- RocketMq 集群搭建 部署
原文链接:https://blog.csdn.net/weixin_40533111/article/details/84451219 作者小太阳^_^,转载请注明出处,谢谢 前言本文基于最新版roc ...
- java中annotation
什么是annotation(注解)? java.lang.annotation,接口Annotation.对于Annotation,是Java5的新特性,JDK5引入了Metadata(元数据)很容易 ...
- 通过反射将request中的参数封装到对象中
import java.beans.PropertyDescriptor; import java.lang.reflect.Method; import java.text.SimpleDateFo ...
- 【转】java线上程序排错经验2 - 线程堆栈分析
前言 在线上的程序中,我们可能经常会碰到程序卡死或者执行很慢的情况,这时候我们希望知道是代码哪里的问题,我们或许迫切希望得到代码运行到哪里了,是哪一步很慢,是否是进入了死循环,或者是否哪一段代码有问题 ...
- Java解析XML文件的常用方法介绍
XML是一个可扩展标记语言.很多时候我们需要进行数据交换,同时也存在跨平台使用,XML文件对这些需求提供了很好的帮助! 对于Java来说,XML常见的用途就是保存数据和配置,这就涉及了对XML文件的增 ...