需要提前导入easyexcel包
package com.morecom.util;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import lombok.Builder;
import lombok.Data;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
public class ExportExcel {
/**
* 一次最大写入数量
*/
private static final Integer ONCE_WRITE_MAX = 3000;
/**
* 默认sheetNo
*/
private static final Integer DEFAULT_SHEET_NO = 0;
/**
* 默认sheetName
*/
private static final String DEFAULT_SHEET_NAME = "sheet1";
@FunctionalInterface
public interface GetData<Page extends Number, Size extends Number, R extends Collection> {
R get(Page page, Size size);
}
@Data
@Builder
public static class Param {
/**
* 数据类
*/
private Class dataClass;
/**
* 一次写出多少行数据
*/
private Integer onceWriteNum;
/**
* 获取数据方法
*/
private GetData function;
/**
* 输出流
*/
private OutputStream outputStream;
}
public static void exportExcel(Param param) {
ExcelWriter excelWriter = EasyExcel.write(param.getOutputStream()).autoCloseStream(Boolean.FALSE).build();
WriteSheet writeSheet = EasyExcel.writerSheet(DEFAULT_SHEET_NO, DEFAULT_SHEET_NAME).head(param.getDataClass())
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
if (param.getOnceWriteNum() > ONCE_WRITE_MAX) {
param.setOnceWriteNum(ONCE_WRITE_MAX);
}
int page = 1;
Collection collection = param.function.get(page, param.getOnceWriteNum());
while (collection != null && collection.size() > 0) {
excelWriter.write(new ArrayList(), writeSheet);
if(collection.size() != param.getOnceWriteNum()){ break; }
collection = param.function.get(page++, param.getOnceWriteNum());
}
excelWriter.write(Arrays.asList(collection), writeSheet);
excelWriter.finish();
}
}
JAVA 实现大数据量导出操作时,如果采用POI直接导出,会出现内存溢出的情况。再者EXCEL的SHEET也存在行数的限制,Excel2003版最大行数是655536行、Excel2007版最大行数是1048576行、Excel2010版最大行数是1048576行。 有人说,可以通过分Sheet存放数据啊,可即便分多个sheet也不能解决内容溢出的问题,数据仍然是在一次请求的内存中。 解决方案: ...
来源 : http://www.iteye.com/topic/422117 范例 http://devbbs.doit.com.cn/thread-72-1-1.html...
一般导出Excel可以选择POI或者JXL,poi比较方便但是处理大数据量效果不佳,jxl可以支持较大数据量,但是超过5W条也会报OOM错误。 那么如果有上百万条的数据怎么到处Excel呢? 其实Excel可以保存成HTML格式的文档(包括图片),我们可以研究html文件格式,然后用io方式往里面输出数据就可以了。 html格式如下: 在项目中,我们可以先...
maven 依赖 (版本必须一致,否则使用SXSSFworkbook 时程序会报错) HSSFworkbook,XSSFworkbook,SXSSFworkbook 三者 区别 HSSFworkbook:操作Excel2003版本,扩展名为xls XSSFworkbook:操作Excel2007版本,扩展名为xlsx SXSSFworkbook :用于大数据量导出,当数据量超过 65536后 程序...
【北京】 IT技术人员面对面试、跳槽、升职等问题,如何快速成长,获得大厂入门资格和升职加薪的筹码?与大厂技术大牛面对面交流,解答你的疑惑。《从职场小白到技术总监成长之路:我的职场焦虑与救赎》活动链接:码客 恭喜fpx,新王登基,lpl*b 我们是冠军 背景 今天需要写一个导出的Excel的功能,但是发现当数据量到3万条时,列数在23列时,内存溢出,CPU使用100%,测试环境直接炸掉。在本地测试时...
service: serviceImpl: 备注:实体类和sql根据自己实际业务书写,这里就不展示了。 结果:针对于大数据量导出以多sheet页形式,每个sheet页存储60000条,测试导出65w条数据大概在36秒左右,导出5列,sql查询速度比较快,几乎不影响导出速度,如果sql查询速度慢会影响导出效率,导出的列数多也可能会影响导出效率。 第一次写这些,不足之处还请大家多多批评指...
maven 依赖 (版本必须一致 ,否则使用SXSSFworkbook 时程序会报错) HSSFworkbook,XSSFworkbook,SXSSFworkbook 三者 区别 HSSFworkbook:操作Excel2003版本,扩展名为xls XSSFworkbook:操作Excel2007版本,扩展名为xlsx SXSSFworkbook :用于大数据量导出,当数据量超过 655...
文章目录 作者 文章推荐理由 代码实现 改进版实现 作者 物流项目组 徐连臣 文章推荐理由 项目中报表导出很常用,有的开发不注意全量导出如果数据量情况较多的情况往往会导致系统内存溢出,他这个导出是类似分页的模式,每查一页就写到文件,就规避了内存溢出的问题,而且用了反射,通用性较强。推荐人:老鹰。 代码实现 Excel导出时,如果一次性查询的数据量过大,容易造成内存溢出,导致系统服务挂了,如果Exc...
背景 今天需要写一个导出的Excel的功能,但是发现当数据量到3万条时,列数在23列时,内存溢出,CPU使用100%,测试环境直接炸掉。在本地测试时发现,导出3000条左右的数据的时候,堆内存瞬间升高500M左右。然后发现了SXSSFWorkbook这个类。 简介 SXSSFWorkbook 需要poi-ooxml包3.8及以上开始支持,我这边适使用的是3.9版本,本质是一个XSSFWorkboo...
昨天,产品提了一个紧急需求,让把十一月份已发货的商品数据导出来,写好SQL发给DBA执行之后,得到了三十多个100W数据的Excel文件。有一个属性是以JSON格式存在表中一个字段里面的,需要加工Excel文件将其单独取出来(如图的第四列)。 处理程序也在数据导出的过程中写好了,大概思路就是读入Excel构建Workbook对象,然后对指定列的值进行转换,最后写回原文件。想法很奈斯,结果很悲哀,O...