SXSSFWorkbook的简单使用
在工作中使用到SXSSFWorkbook来导出Excel,写一篇博客记录一下SXSSFWorkbook的使用方法
1.介绍
SXSSFWorkbook是apache的开源项目,从其官网上可以看出SXSSFWorkbook实现了Workbook接口
Streaming version of XSSFWorkbook implementing the "BigGridDemo" strategy.
This allows to write very large files without running out of memory as
only a configurable portion of the rows are kept in memory at any one time.
SXSSFWorkbook是实现“BigGridDemo”策略的XSSFWorkbook的流媒体版本。SXSSFWorkbook允许编写非常大的文件而不会耗尽内存,
因为在任何时候,只有可配置的一部分行保存在内存中。
2.使用
首先我们定义一个列的实体类,包含列的名称,样式等
import org.apache.poi.ss.usermodel.CellStyle; /**
* @describe 定义excel列
*
*/
public class ExcelColumnInfo {
private String columnName;
private String columnCode;
/**
* 单元格样式
*/
private CellStyle cellStyle;
} public ExcelColumnInfo(String columnName, String columnCode) {
super();
this.columnName = columnName;
this.columnCode = columnCode;
} public ExcelColumnInfo(String columnName, String columnCode, CellStyle cellStyle) {
super();
this.columnName = columnName;
this.columnCode = columnCode;
this.cellStyle = cellStyle;
} public String getColumnName() {
return columnName;
}
public void setColumnName(String columnName) {
this.columnName = columnName;
}
public String getColumnCode() {
return columnCode;
}
public void setColumnCode(String columnCode) {
this.columnCode = columnCode;
} public CellStyle getCellStyle() {
return cellStyle;
} public void setCellStyle(CellStyle cellStyle) {
this.cellStyle = cellStyle;
} }
再定义一个Excel写入单元格数据的工具类
/**
* Excel辅助类
*/
public class ExcelUtil { public static void setCell(Cell cell, Object obj) {
if (obj == null) {
cell.setCellValue("");
} else if (obj instanceof Integer) {
cell.setCellValue((int) obj);
} else if (obj instanceof BigDecimal) {
cell.setCellValue(((BigDecimal) obj).doubleValue());
} else if (obj instanceof String) {
cell.setCellValue((String) obj);
} else if (obj instanceof Double) {
cell.setCellValue((double) obj);
} else if (obj instanceof Long) {
cell.setCellValue((long) obj);
}
} public static void setCell(Cell cell, Object obj, CellStyle cellStyle) {
cell.setCellStyle(cellStyle);
if (obj instanceof Integer) {
cell.setCellValue((int) obj);
} else if (obj instanceof BigDecimal) {
cell.setCellValue(((BigDecimal) obj).doubleValue());
} else if (obj instanceof String) {
cell.setCellValue((String) obj);
} else if (obj instanceof Double) {
cell.setCellValue((double) obj);
} else if (obj instanceof Long) {
cell.setCellValue((long) obj);
} else {
cell.setCellValue("");
}
}
}
然后开始写导出的方法
@Service
public class ExportSystemLogService{ @Autowired
private SystemLogMapper mapper; public SXSSFWorkbook exportExcel(Map<String, Object> params) throws IOException { SXSSFWorkbook wb = new SXSSFWorkbook(1000);
//获取表格列信息
LinkedHashMap<String, List<ExcelColumnInfo>> excelInfo = getExcelInfo(wb);
for(String sheetName : excelInfo.keySet()){
//创建sheet页
Sheet sheet = wb.createSheet(sheetName);
//获取该sheet页的列信息
List<ExcelColumnInfo> excelColumnInfo = excelInfo.get(sheetName);
//生成Excel数据
generateExcelData(sheet,excelColumnInfo,params);
}
return wb;
} protected LinkedHashMap<String, List<ExcelColumnInfo>> getExcelInfo(Workbook wb) {
LinkedHashMap<String, List<ExcelColumnInfo>> excelInfo = new LinkedHashMap<>();
List<ExcelColumnInfo> columns = new ArrayList<>();CellStyle wrapStyle = wb.createCellStyle();
wrapStyle.setWrapText(true); //设置自动换行 columns.add(new ExcelColumnInfo("日志编号", "LOG_ID")); //后面的columnCode与从数据库中查询出来的字段名一致
columns.add(new ExcelColumnInfo("操作时间", "CREATE_TIME"));
columns.add(new ExcelColumnInfo("操作人", "CREATE_USER"));
columns.add(new ExcelColumnInfo("操作模块", "OPERATION_MODULE"));
columns.add(new ExcelColumnInfo("操作类型", "OPERATION_TYPE"));
columns.add(new ExcelColumnInfo("详情", "OPERATION_DETAIL",wrapStyle));
columns.add(new ExcelColumnInfo("日志级别", "LOG_LEVEL"));
columns.add(new ExcelColumnInfo("备注", "REMARK",wrapStyle)); excelInfo.put("系统日志", columns);
return excelInfo;
} private void generateExcelData(Sheet sheet,List<ExcelColumnInfo> excelColumnInfo,Map<String, Object> params) {
//设置列的宽度,第一个参数为列的序号,从0开始,第二参数为列宽,单位1/256个字节
sheet.setColumnWidth(0, 12*256);
sheet.setColumnWidth(2, 16*256);
sheet.setColumnWidth(5, 12*256);
sheet.setColumnWidth(6, 26*256);
sheet.setColumnWidth(7, 26*256);
//设置开始行和开始列
int rowIndex = 0;
int columnIndex = 0;
Row row = sheet.createRow(rowIndex);
//创建表头
for (ExcelColumnInfo column : excelColumnInfo) {
ExcelUtil.setCell(row.createCell(columnIndex++), column.getColumnName());
}
//获取导出数据
List<HashMap<String, Object>> data = mapper.getSystemLog(params);
rowIndex = 1;
for (HashMap<String, Object> tmp : data) {
Row row1 = sheet.createRow(rowIndex);
columnIndex = 0;
for(ExcelColumnInfo column : excelColumnInfo){
Cell cell = row1.createCell(columnIndex);
//设置单元格样式
if (column.getCellStyle() != null) {
cell.setCellStyle(column.getCellStyle());
}
ExcelUtil.setCell(cell,tmp.get(column.getColumnCode()));
columnIndex++;
}
rowIndex++;
}
}
}
其中Mapper接口与xml文件配置如下
@Mapper
@Repository
public interface SystemLogMapper { List<HashMap<String, Object>> getSystemLog(@Param("params") Map<String, Object> params);
}
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.XXX.XXX.SystemLogMapper"> <select id="getSystemLog" parameterType="java.util.HashMap" resultType="java.util.HashMap">
SELECT
LOG_ID,
CREATE_TIME,
CREATE_USER,
OPERATION_MODULE,
OPERATION_TYPE,
OPERATION_DETAIL,
LOG_LEVEL,
REMARK
FORM SYSTEM_LOG
ORDER BY CREATE_TIME DESC
</select>
</mapper>
在调用时,只需在Controller层调用ExportSystemLogService.exportExcel(params)方法即可。
SXSSFWorkbook的简单使用的更多相关文章
- POI 海量数据/大数据文件生成SXSSFWorkbook使用简介
在之前我们知道处理xls的excel用的workbook是HSSFWorkbook,处理xlsx的excel用的是XSSFWorkbook. 上面两个类导出excel的时候数据会驻留在内存中,所以当数 ...
- POI 操作 excel表格 (简单整理)
简单的整理: import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import ...
- POI之SXSSFWorkbook大量数据导出至excel
一:简介 SXSSFWorkbook是用来生成海量excel数据文件,主要原理是借助临时存储空间生成excel, SXSSFWorkbook专门处理大数据,对于大型 ...
- Excel导入导出工具(简单、好用且轻量级的海量Excel文件导入导出解决方案.)
Excel导入导出工具(简单.好用且轻量级的海量Excel文件导入导出解决方案.) 置顶 2019-09-07 16:47:10 $9420 阅读数 261更多 分类专栏: java 版权声明:本 ...
- 七、SXSSFWorkbook生成大excle,避免内存溢出
1.SXSSFWorkbook理解: SXSSFWorkbook是用来生成海量excel数据文件,主要原理是借助临时存储空间生成excel,SXSSFWorkbook专门处理大数据,对于大型excel ...
- NPOI导出大量数据的避免OOM解决方案【SXSSFWorkbook】
一.NPOI的基本知识 碰到了导出大量数据的需求场景:从数据读取数据大约50W,然后再前端导出给用户,整个过程希望能较快的完成.如果不能较快完成,可以给与友好的提示. 大量数据的导出耗时的主要地方: ...
- java中使用 POI导出excel表格的简单实现
大概流程分7步: 1.创建工作簿 --> 2.创建sheet表 --> 3.创建row行(建议使用循环) --> 4.用row行逐一创建单元格(建议使用循环) --> 5.单元 ...
- 【造轮子】打造一个简单的万能Excel读写工具
大家工作或者平时是不是经常遇到要读写一些简单格式的Excel? shit!~很蛋疼,因为之前吹牛,就搞了个这东西,还算是挺实用,和大家分享下. 厌烦了每次搞简单类型的Excel读写?不怕~来,喜欢流式 ...
- Fabio 安装和简单使用
Fabio(Go 语言):https://github.com/eBay/fabio Fabio 是一个快速.现代.zero-conf 负载均衡 HTTP(S) 路由器,用于部署 Consul 管理的 ...
随机推荐
- 记一次痛苦的Django报错调试经历:
开发的程序在我的本地mac上,ubuntu上,以及树莓派上都成功实现了迁移和运行,但是当准备将运行好好地程序迁移到阿里云的服务器上的mysql数据库上时,出现了非常多的幺蛾子的问题. 具体如下: 初始 ...
- WordPress发布文章/页面时自动添加默认的自定义字段
如果你每篇文章或页面都需要插入同一个自定义字段和值,可以考虑在WordPress发布文章/页面时,自动添加默认的自定义字段.将下面的代码添加到当前主题的 functions.php 即可: 1 2 3 ...
- Muduo网络库实战(一):安装和配置
1. 参考资料 <Muduo_网络库使用手册> 2. 实战记录 1) muduo依赖项安装 centos安装cmake命令:# yum install cmake centos安装libb ...
- #Lab0 Environment Building
清华提供了实验环境的很多选项,具体可以参考README 我选择用虚拟机完成. 一.安装VirtualBox 下载链接 一路next,我的版本是6.0.4. 二.下载虚拟硬盘文件 实验所需的软件都在虚拟 ...
- CF--思维练习--CodeForces - 220C Little Elephant and Shifts (STL模拟)
ACM思维题训练集合 The Little Elephant has two permutations a and b of length n, consisting of numbers from ...
- HDOJ 4699 Editor 对顶栈模拟
Editor Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Subm ...
- 图论--SCC强连通缩点--Tarjan
强连通缩点与双连通缩点大同小异,也就是说将强连通分支缩成一个点之后,没有强连通,成为有向无环图,在对图进行题目的操作. // Tarjan算法求有向图强连通分量并缩点 #include<iost ...
- Spring源码阅读 之 搭建源码阅读环境(IDEA)
检出源码: GitHub:https://github.com/spring-projects/spring-framework.git 可以按如下步骤:(须确保Git已正确安装) Git正确安装后, ...
- SQL语言概况(4.1)
SQL语言概况(4.1) 目录 SQL语言概况(4.1) 4.1 SQL语言概况 4.1.1 历史及标准简介 4.1.2 SQL语言定义及特点 4.1.3 使用说明 参考资料: 数据库原理及设计(第3 ...
- Coursera课程笔记----Write Professional Emails in English----Week 3
Introduction and Announcement Emails (Week 3) Overview of Introduction & Announcement Emails Bas ...