大量数据的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 ...
随机推荐
- 使用CA签发的服务器证书搭建Tomcat双向SSL认证服务
第一部分,先说证书的申请. 这步是要到正规的CA公司申请正式的设备证书必须走的步骤. 1.先生成证书的密钥对 打开命令行,切换到某个自己新建的目录下,执行如下命令 keytool -genkey -k ...
- Linux 链路聚合
Linux 链路聚合 链路聚合与双网卡绑定几乎相同,可以实现多网卡绑定主从荣誉,负载均衡,提高网络访问流量.但链路聚合与双网卡绑定技术(bond)不同点就在于,双网卡绑定只能使用两个网卡绑定,而链路聚 ...
- Tomcat在Window控制台下启动时乱码的两种解决办法
在命令提示符中启动Tomcat时,日志窗口出现乱码: 乱码的原因肯定是日志解码错误引起的,因此就有一系列问题: 1.这个窗口的文本编码是什么? 窗口的文本编码查看:右击窗口>选项 可以看到窗口的 ...
- 通过KSoap三方插件解析WebService接口方法
话不多说,正文如下: 1.在lib中放入ksoap2的jar包并导入 2.在xml 配置文件中加入: <!-- 访问网络的权限 --> <uses-permission androi ...
- web.xml的学习
web.xml 文件提供有关包含 Web 应用程序的 Web 组件的配置和部署信息. Java Servlet 规范根据 XML 模式文档来定义 web.xml 部署描述符文件.为了获取向后兼容性,W ...
- ArrayList迭代器源码分析
集合的遍历 Java集合框架中容器有很多种类,如下图中: 对于有索引的List集合可以通过for循环遍历集合: List<String> list = new ArrayList<& ...
- Docker Swarm Mode 学习笔记(创建 Swarm 集群)
Swarm 集群由管理节点与工作节点组成. 初始化集群 使用命令:docker swarm init 如果你的 Docker 主机有多个网卡, 拥有多个 IP 地址, 必须使用 --advertise ...
- Descriptio Resource Path LocationType Archive for required library: 'D:/apache-maven/apache-maven-3.6.0/mavenrepository/org/springframework/spring-aspects/4.3.7.RELEASE/spring-aspects-4.3.7.RELEASE.
eclipse创建了一个maven项目后,在导入依赖包后返现项目有个红色刺眼的感叹号,再看控制台有个Problem提示 Descriptio Resource Path LocationType Ar ...
- UI组件--element-ui--Upload多组件自定义上传
需求: 提交详细信息的表单, 并上传对应图片(如下图), 后台接口要求表单数据和图片需要一次上传完成.. 分析: 实际上, 每个element-ui Upload组件都应发送一次请求, 很明显不符合我 ...
- Asp.net core Identity + identity server + angular 学习笔记 (第五篇)
ABAC (Attribute Based Access Control) 基于属性得权限管理. 属性就是 key and value 表达力非常得强. 我们可以用 key = role value ...