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 管理的 ...
随机推荐
- nginx响应超时upstream timed out 问题处理
环境介绍 服务器:centos7.2 应用:tomcat集群 服务:nginx 代理 问题描述: 这段时间,听项目组项目经理和业务需求人员跟我反馈,线上业务人员在操作业务交易时,有时会出现nginx错 ...
- 12c DG broker DMON自动重启过程分析
一.知识点 1.强烈建议大家管理dataguard使用broker. 2.broker的日志要知道在哪里,会看日志是学习的第一步. 3.体系结构需要看官方文档. 二.测试过程 1.查看DMON进程 & ...
- Vim Operations
Vim有三种模式:输入模式.命令模式和末行命令模式. 输入模式用来输入文字,命令模式用来下达编排文件的操作指令,末行命令模式用来进行文件存档.离开编辑器等操作. 进入及离开 末行模式下: :w 保存当 ...
- 信息竞赛进阶指南--递归法求中缀表达式的值,O(n^2)(模板)
// 递归法求中缀表达式的值,O(n^2) int calc(int l, int r) { // 寻找未被任何括号包含的最后一个加减号 for (int i = r, j = 0; i >= ...
- VS Code 全部快捷键一览表(巨TM全)
常用 General 按 Press 功能 Function Ctrl + Shift + P,F1 显示命令面板 Show Command Palette Ctrl + P 快速打开 Quick O ...
- 数学--数论--hdu 6216 A Cubic number and A Cubic Number (公式推导)
A cubic number is the result of using a whole number in a multiplication three times. For example, 3 ...
- badboy 录制脚本
第一步:介绍badboy工具 1.1: 页面功能分析: 1. 界面视图,模拟浏览器,能够进行操作 2. 需要录制脚本的URL 3. 点击运行URL 4. Summary:运行的各指标,响应时间,成功事 ...
- 9) drf JWT 认证 签发与校验token 多方式登陆 自定义认证规则反爬 admin密文显示
一 .认证方法比较 1.认证规则图 django 前后端不分离 csrf认证 drf 前后端分离 禁用csrf 2. 认证规则演变图 数据库session认证:低效 缓存认证:高效 jwt认证:高效 ...
- [译]ANDROID 11: BETA 计划
当我们开始计划 Android 11 的时候,我们没有预料到这些变化会发生在我们所有人身上,几乎遍及世界上的每一个地区. 这些挑战要求我们保持灵活性,寻找新的合作方式,特别是与我们的开发者社区合作. ...
- OKR新手入门指南 (第一部分)
什么是OKR? OKR(目标和关键结果)是Google和其他公司使用的目标系统.这是一个简单的工具,围绕可衡量的目标进行调整和互动. OKR:Google的目标设定方法 与传统的规划方法有何不同? O ...