- 浏览: 540731 次
- 性别:
- 来自: 天津
文章分类
- 全部博客 (230)
- java (87)
- c/c++/c# (39)
- ASP.net MVC (4)
- eclipse/visual studio (3)
- tomcat/weblogic/jetty (13)
- linux/unix/windows (20)
- html/javascript/jquery/kendo/bootstrap/layui/vue/react (31)
- hibernate/struts/spring/mybatis/springboot (21)
- lucene/solr/ELK (2)
- shiro (0)
- oracle/sqlserver/mysql/postgresql (23)
- shell/python/ruby (6)
- android (0)
- maven/ant (1)
- freemarker/thymeleaf/velocity (1)
- open source project (41)
- cache/memcached/redis (0)
- nosql/hadoop/hbase/mongodb (0)
- system architecture/dubbo/zookeeper (0)
- software testing (0)
- system optimization (0)
- system security (0)
- tcp/udp/http (2)
- roller/wordpress (2)
- 工具收藏 (8)
- 文摘 (4)
- 生活 (0)
最新评论
-
coconut_zhang:
这个demo 非常完整了,是指下面说的那个html 模版,模版 ...
flying sauser, thymeleaf实现PDF文件下载 -
a93456:
你好,你有完整的demo吗? String template这 ...
flying sauser, thymeleaf实现PDF文件下载 -
yujiaao:
fn 函数循环是没有必要的啊,可以改成
protecte ...
Java 笛卡尔积算法的简单实现 -
安静听歌:
设置了.setUseTemporaryFileDuringWr ...
使用jxl导出大数据量EXCEL时内存溢出的解决办法 -
q280499693:
写的很详细,但是我现在想知道他们是怎么定位log4j.prop ...
关于SLF4J结合Log4j使用时日志输出与指定的log4j.properties不同
POI或者JXL在导出大量数据的时候,由于它们将每一个单元格生都成一个Cell对象,所以很容易导致内存溢出。
1、通过jx1最新版本的采用临时文件写入EXCEL功能,设定临时文件的位置,可以有效的避免内存溢出:
wbSetting.setUseTemporaryFileDuringWrite(true);
wbSetting.setTemporaryFileDuringWriteDirectory(new File(excelPath));//临时文件夹的位置
2、EXCEL获取的list集合先读取数据总行数,再通过ROWNUM进行控制,设定每次读取多少行数据,比如一个List设定为50000;
wbSetting.setTemporaryFileDuringWriteDirectory(new File(excelPath));//临时文件夹的位置
2、EXCEL获取的list集合先读取数据总行数,再通过ROWNUM进行控制,设定每次读取多少行数据,比如一个List设定为50000;
WorkbookSettings wbSetting = new WorkbookSettings();
wbSetting.setUseTemporaryFileDuringWrite(true);
wbSetting.setTemporaryFileDuringWriteDirectory(new File(excelPath));//临时文件夹的位置
workbook = Workbook.createWorkbook(new File(fullPath),wbSetting);
int returnCount=0;
if(null!=pager)
{
returnCount = BrasDatabase.getReturnCount(pager.getStartTime(),
pager.getEndTime(), pager);
}
if (returnCount > 0) {
pager.setPageSize(50000);
pager.setTotalRows(returnCount);// 获取总行数
pager.setNewTotalPages(pager.getTotalRows()); // 总页数
for (int i = 1; i <= pager.getTotalPages(); i++) {
pager.setCurrentPage(i); // 当前页面d
List<BrasAuth> list = BrasDatabase
.getBrasAuthResultByIpToExcelList(pager
.getStartTime(), pager.getEndTime(), pager);
this.createExcel(list,excelFilePath);
list.clear();
}
}
3、在写入EXCEL的时候,将读取的LIST分割,每50000条数据生成一个EXCEL的sheet(一个sheet最多能存储60000多行数据),再写入,写入的时候,如果设置了采用临时文件写入的话,jx1会自动采用生成临时文件的方式写入EXCEL:
wbSetting.setUseTemporaryFileDuringWrite(true);
wbSetting.setTemporaryFileDuringWriteDirectory(new File(excelPath));//临时文件夹的位置
workbook = Workbook.createWorkbook(new File(fullPath),wbSetting);
int returnCount=0;
if(null!=pager)
{
returnCount = BrasDatabase.getReturnCount(pager.getStartTime(),
pager.getEndTime(), pager);
}
if (returnCount > 0) {
pager.setPageSize(50000);
pager.setTotalRows(returnCount);// 获取总行数
pager.setNewTotalPages(pager.getTotalRows()); // 总页数
for (int i = 1; i <= pager.getTotalPages(); i++) {
pager.setCurrentPage(i); // 当前页面d
List<BrasAuth> list = BrasDatabase
.getBrasAuthResultByIpToExcelList(pager
.getStartTime(), pager.getEndTime(), pager);
this.createExcel(list,excelFilePath);
list.clear();
}
}
3、在写入EXCEL的时候,将读取的LIST分割,每50000条数据生成一个EXCEL的sheet(一个sheet最多能存储60000多行数据),再写入,写入的时候,如果设置了采用临时文件写入的话,jx1会自动采用生成临时文件的方式写入EXCEL:
for(int i=1;i<=list.size();i++)
{
if(i%50000==0)
{
sheetName=format.format(new Date());
toExcel(list.subList(reNum, i),sheetName);
reNum=i;
}
}
{
if(i%50000==0)
{
sheetName=format.format(new Date());
toExcel(list.subList(reNum, i),sheetName);
reNum=i;
}
}
------------------------------------------------------------------------------------------------------------------------------
写文本格式的Excel文件,而不是用POI等生成二进制的文件, 可以避免创建大批量的对象时内存溢出.代码如下可以作为参考:
第一种格式,CSV,最简单的,格式最差,最基本的行列,不能合并,不能设置着色,
第二种,HTML格式的,如:"<TABLE>....</TABLE>"这样的文本,后辍名改为XLS就可以了,可以设置跨行列的合并,可以着色,图片没试过,估计是可以的,还可以设置单元格对齐,单元格的格式等
第一种格式,CSV,最简单的,格式最差,最基本的行列,不能合并,不能设置着色,
第二种,HTML格式的,如:"<TABLE>....</TABLE>"这样的文本,后辍名改为XLS就可以了,可以设置跨行列的合并,可以着色,图片没试过,估计是可以的,还可以设置单元格对齐,单元格的格式等
public static boolean createExcelFileByStream(String path, List list) {
try {
//定义表头
String userxlsinfo = "序号\t用户ID\t姓名\t手机\t留言信息";
File file = new File("c:\\streamExcel.xls");
if (file.isFile()) {
file.mkdir();
}
FileOutputStream out = new FileOutputStream(file);
OutputStreamWriter osw = new OutputStreamWriter(out, "GB2312");
BufferedWriter bw = new BufferedWriter(osw);
// 创建表头
String sheader = userxlsinfo;
sheader += "\r\n";
bw.write(sheader);
if (list != null) {
// List list 此处可以遍历list对象
for (int i = 0; i < 5; i++) {
StringBuffer mess = new StringBuffer();
// 用户信息
mess.append((i + 1) + "\t");
mess.append((i + 1) + "\t");
mess.append((i + 1) + "\t");
mess.append((i + 1) + "\t");
mess.append((i + 1) + "\t");
mess.append("\r\n");
System.out.println(i);
bw.write(mess.toString());
}
}
bw.close();
osw.close();
out.close();
return true;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
注意:表头部分和数据部分的间隔一定要用'\t ' 如果改用','号则导出文件用excel打开展示会有问题.
try {
//定义表头
String userxlsinfo = "序号\t用户ID\t姓名\t手机\t留言信息";
File file = new File("c:\\streamExcel.xls");
if (file.isFile()) {
file.mkdir();
}
FileOutputStream out = new FileOutputStream(file);
OutputStreamWriter osw = new OutputStreamWriter(out, "GB2312");
BufferedWriter bw = new BufferedWriter(osw);
// 创建表头
String sheader = userxlsinfo;
sheader += "\r\n";
bw.write(sheader);
if (list != null) {
// List list 此处可以遍历list对象
for (int i = 0; i < 5; i++) {
StringBuffer mess = new StringBuffer();
// 用户信息
mess.append((i + 1) + "\t");
mess.append((i + 1) + "\t");
mess.append((i + 1) + "\t");
mess.append((i + 1) + "\t");
mess.append((i + 1) + "\t");
mess.append("\r\n");
System.out.println(i);
bw.write(mess.toString());
}
}
bw.close();
osw.close();
out.close();
return true;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
注意:表头部分和数据部分的间隔一定要用'\t ' 如果改用','号则导出文件用excel打开展示会有问题.
发表评论
-
easypoi 按照模板到出excel并合并单元格
2022-11-10 21:46 142这是entity类,注解的mergeVertical是纵向合 ... -
Java时区处理之Date,Calendar,TimeZone,SimpleDateFormat
2017-03-31 14:59 1355一、概述 1、问题描述 使用Java处 ... -
jxls操作excel文件
2017-03-03 14:51 1086JXLS是基于Jakarta POI API的Excel报表 ... -
eclipse插件Maven添加依赖查询无结果的解决方法(Select Dependency doesn't work)
2016-04-22 08:33 733在eclipse中用过maven的可能都遇到过这种情况,我 ... -
Java_Ant详解
2015-06-15 16:54 7251,什么是antant是构建工 ... -
httpClient通过代理(Http Proxy)进行请求
2014-09-16 14:18 1220httpClient通过代理(Http Proxy)进行请求 ... -
httpclient上传文件及传参数
2014-09-16 11:07 11624用到的包有commons-httpclient-3.0.1. ... -
Java文件下载的几种方式
2013-08-19 14:15 868public HttpServletResponse dow ... -
http上传文件深度解析-高性能http传输
2013-07-23 10:41 9760最近在做web服务器的时候将一些应用集成在了服务器里面,比 ... -
java servlet common-fileupload 实现的文件批量上传
2013-07-18 14:31 6415结合前辈们的代码, 写了个用servlet 和 common ... -
调用axis2 WebService三种方法
2013-06-28 13:41 1788第一:简单的使用axis2包自己实现调用 package ... -
java-jsch实现sftp文件操作
2013-06-26 13:55 3663(曾在天涯)的文章详细讲解了jsch中的函数以及用法 ht ... -
url encode的问题
2012-11-06 08:27 60221.urlencode和decode 字符的编码和解码在有中 ... -
Java集合运算(交集,并集,差集)
2012-11-02 14:59 12973在实现数据挖掘一些算法或者是利用空间向量模型来发现相似文档的时 ... -
Java 笛卡尔积算法的简单实现
2012-10-31 15:26 9595笛卡尔积算法的Java实现: (1)循环内,每次只有一列向下 ... -
java实现求一个项目集合任意元子集的通用算法
2012-10-31 15:25 4在关联规则挖掘过程中,经常涉及到求一个频繁项目集的n元子集,在 ... -
java实现求一个项目集合任意元子集的通用算法
2012-10-31 15:21 1493在关联规则挖掘过程中,经常涉及到求一个频繁项目集的n元子集,在 ... -
使用 HttpClient 和 HtmlParser 实现简易爬虫
2012-06-27 16:33 1269这篇文章介绍了 HtmlParse ... -
分布式计算开源框架Hadoop入门
2012-06-26 13:29 1984引 在SIP项 ... -
CAS集群部署的问题
2012-06-26 09:17 2896CAS单点部署时非常容易配置,且稳定性较好,非常适合中小规模应 ...
相关推荐
此外,如果数据量较大,应考虑分批写入或使用流式处理,以优化性能。 在实际项目中,你可能会遇到一些问题,如文件权限、内存溢出或线程同步等。对于这些问题,要确保正确请求存储权限,使用内存管理策略(如流或...
例如,由于Excel文件的内存占用较大,处理大量数据时可能会导致内存溢出。此时,可以考虑使用流式读写模式,以减少内存消耗。此外,jxl对Excel 2007及以后版本的xlsx格式支持有限,如果需要处理这种格式,可能需要...
总结来说,使用jxl库进行大数据量Excel导出,关键在于合理分块、优化内存管理和充分利用异步处理。通过这些策略,即使面对大量数据,也能保证导出的效率和系统的稳定性。在实际开发中,还需要根据具体业务场景进行...
注意,如果你的数据量非常大,可能需要考虑分批处理或使用流式写入以避免内存溢出。 总的来说,JXL库提供了一个方便的方式来处理Excel文件,无论是在Java应用程序还是服务器端,都能有效地进行数据导入和导出。通过...
4. **性能优化**:处理大量数据时,可能需要考虑分批读取和写入,避免一次性加载整个数据集导致内存压力过大。 5. **错误处理和异常处理**:在开发过程中,要确保捕获和处理可能出现的异常,如文件不存在、数据格式...
- 当写入大量数据时,考虑分批写入或使用流式写入以优化性能。 - JXL不支持Excel 2007及更高版本的.xlsx格式,但可以处理旧版的.xls格式。 以上就是Java使用JXL库操作Excel的基本知识。通过这些方法,你可以创建...
- 处理大数据量:当数据量较大时,为了避免内存溢出,可以使用流式写入(streaming)模式,逐行写入数据而不是一次性加载所有数据。 - 遍历读取Excel文件:Jxl也支持读取Excel文件,我们可以创建`Workbook`对象,...
- 性能优化:对于大数据量操作,可以考虑分批处理,避免一次性加载大量数据导致内存溢出。 总之,"jxl-2.6.10.rar"和"odjbc14.jar"这两个jar包组合,为Java开发者提供了一个有效工具集,用于在Oracle数据库和Excel...
当数据量较大时,为了避免内存溢出,可以使用`WritableWorkbook`的流式写入模式,即`Workbook.createWorkbook(OutputStream)`,这允许数据逐行写入,而不是一次性加载所有数据。 8. **读取Excel文件**: `jxl....
这是因为这些库在内存中构建整个工作簿模型,当数据量过大时,所需内存会迅速增加,可能导致Java虚拟机(JVM)崩溃。为了解决这个问题,可以采取分批导出策略。 分批导出是指将大数据集分割成若干小块,逐批处理和...
尽管JXL库非常实用,但处理大量数据时可能性能较低。对于大型Excel文件,可以考虑使用Apache POI等其他库,它们提供了更高效的内存管理和多线程处理。 8. **异常处理**: 使用JXL进行Excel操作时,需要注意可能...
通过使用EasyExcel,我们不仅解决了处理大量Excel数据时可能出现的内存溢出问题,还大大提高了数据处理的速度。对于104万行20列的大规模Excel文件,EasyExcel能够在70秒内完成处理,极大地提高了工作效率。未来,...
6. **数据流处理**:JXL提供了处理大量数据的能力,通过数据流模型,可以有效地处理大文件,避免内存溢出问题。 7. **错误处理和版本兼容**:JXL库能够处理读取和写入不同版本的Excel文件(从Biff8到Excel 2007的...
6. **性能优化**: 当处理大数据量时,JXL提供流式处理模式,避免一次性加载所有数据导致内存溢出,提高程序效率。 7. **兼容性与版本控制**: JXL库支持多种Excel文件版本,从早期的BIFF5到最新的XLSX格式,确保了与...
- **内存管理**:为了避免一次性加载大量数据导致内存溢出,可以使用`StreamingReader`来按需读取数据。 - **缓冲区**:使用缓冲区可以减少磁盘I/O次数,提高读写速度。 - **批处理**:对于大规模数据,可以分批...
5. **流式处理**: 对于大数据量的报表,Apache POI提供了流式处理模式,可以减少内存消耗,避免内存溢出问题。 6. **性能比较**: 相比jxl,Apache POI提供了更广泛的支持和更好的性能,尤其是在处理复杂Excel格式和...
EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。 EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知...
在Java编程环境中,导出数据到Excel是一种常见的需求,特别是在数据...此外,如果你的数据量非常大,可能需要分批写入,以避免内存溢出。在处理大量数据时,可以考虑使用流式处理或者Apache POI的SXSSF API来提高性能。
poi 和 jxl 对内存的消耗很大,在处理大批量的数据时,容易造成内存溢出。比如处理一个 3M 的 Excel,poi 和 jxl 可能需要上百兆的内存,但 easyexcel 可能只需要几百或几千 KB(内存消耗对比有些夸张)。在性能这...