在Java Web开发中,经常需要导出大量的数据到Excel,使用POI、JXL直接生成Excel,很容易就造成内存溢出了。
1、有一种方式,就是把数据写成csv格式文件。
1)csv文件可以直接用Excel打开。
2)写csv文件的效率和写txt文件的效率一样高。
3)同样的数据内容,生成的csv文件的大小远远小于生成的Excel文件。
从以上优点就可以看出生成csv文件消耗的内存绝对小于生成Excel文件。
2、按一定的格式去生成csv文件,在Excel中打开的时候就是完整的行和列格式。
例如:在Excel中的格式:
那么,在csv文件中格式就必须为:
就是说,列和列之间,需要用英文输入法状态下的逗号","间隔:风云第一刀,古龙。
3、在Struts2中导出数据到Excel,一个简单的例子。
CsvAction,生成csv文件,并且将生成的csv文件完整路径传递到下载Action。
package cn.luxh.struts2.action;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import cn.luxh.struts2.entity.Novel;
import com.opensymphony.xwork2.ActionSupport;
/**
* 导出数据到csv文件
* @author Luxh
*/
public class CsvAction extends ActionSupport {
private static final long serialVersionUID = -2862629695443964658L;
/**
* 包含完整路径的文件名
* 传递给下载Action进行下载
*/
private String fileName;
/**
* 导出数据
*/
public String exportData2CSV() {
List<Novel> novels = getNovels();
fileName = "D:/novels.csv";
writeData2CSV(novels,fileName);
return SUCCESS;
}
/**
* 构造一些数据
* 实际上可能是从数据库中把大量的数据查出来
*/
private List<Novel> getNovels() {
List<Novel> novels = new ArrayList<Novel>();
Novel novel1 = new Novel("风云第一刀","古龙",new Date());
Novel novel2 = new Novel("书剑恩仇录","金庸",new Date());
Novel novel3 = new Novel("陆小凤传奇","古龙",new Date());
Novel novel4 = new Novel("鹿鼎记","金庸",new Date());
novels.add(novel1);
novels.add(novel2);
novels.add(novel3);
novels.add(novel4);
return novels;
}
/**
* 把数据按一定的格式写到csv文件中
* @param novels 数据集合
* @param fileName csv文件完整路径
*/
public void writeData2CSV(List<Novel> novels,String fileName) {
FileWriter fw = null;
try {
fw = new FileWriter(fileName);
//输出标题头
//注意列之间用","间隔,写完一行需要回车换行"\r\n"
String title = "序号,小说名称,作者,出版日期\r\n";
fw.write(title);
String content = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
for(int i=0;i<novels.size();i++) {
Novel novel = novels.get(i);
//注意列之间用","间隔,写完一行需要回车换行"\r\n"
content =(i+1)+","+novel.getName()+","+novel.getAuthor()+","+sdf.format(novel.getPublishDate())+"\r\n";
fw.write(content);
}
}catch(Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}finally {
try {
if(fw!=null) {
fw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
配置文件:
<!--将csv文件路径传递到公共的下载Action进行下载 -->
<action name="exportData2CSV" class="cn.luxh.struts2.action.CsvAction" method="exportData2CSV">
<result type="redirectAction">
<param name="actionName">download</param>
<param name="nameSpace">/download</param>
<!--附件的完整路径 ,传递给下载Action -->
<param name="fileName">${fileName}</param>
</result>
</action>
4、看一下同样的数据内容,csv文件和Excel文件的大小对比:
分享到:
相关推荐
由于项目需要对大量Excel数据进行输入输出处理,在使用JXL,POI后发现很容易出现OOM,最后在网上找到阿里的开源...经过大量的调试优化,现通过JAVA生成104万行20列的数据并写入到Excel文件的Sheet中只需要70秒的时间。
java 使用 poi 解析导入大数据量(几万数据量+)时,报出OOM。这是使用POI 第二种处理方法,解决大数据量导入内存溢出问题,并提升效率
主要为大家详细介绍了Java实现excel大数据量导入,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
轻松解决普通poi形式导出Excel的中出现的栈溢出问题,此资源可实现千万级数据分批导出csv文件,csv大数据量导出(千万级别,不会内存溢出),多线程导出 ,生产环境已经很稳定的使用着
用开源 Apache POI 技术导出Excel,解决导出大数据出现OOM、栈溢出问题,此资源可实现百万级数据多线程分批导出Excel文件,不会内存溢出,生产环境已很稳定的使用者,所以用到的技术很核心、值得参考
usermodel模式对excel操作前需要将文件全部转入内存,对较大文件来说内存开销很大。但是其使用简单。 eventusermodel模式采用事件模型,对文件边读取边处理,内存消耗较低,效率高,因为不用等待文件全部装入内存。...
poi读取大量数据会造成gc内存溢出的报错,由于垃圾回收机制无法将大量的对象及时的回收,而这些对象又会保存在内存中,会导致内存不够用的情况,这时候我们就需要使用新的方法,读取为cvs即可.此解决方案可支持千万数据的...
开发测试时候导入数据遇到大数据导入的问题,整理了下,需要的朋友可以参考下
主要为大家详细介绍了java导出大批量即百万以上数据的excel文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
前言 最近有个项目在生产环境做数据导入时,发现开始执行导入任务会出现cpu狂飙的情况。几番定位查找发现是在...这种方式POI会把文件的所有内容都加载到内存中,读取大的excel文件时很容易占用大量内存导致oom的发生
透视报告功能有助于管理大量数据。 支持 Excel X4J 的主要输入/输出格式是 XLSX,Excel 用作设计来编辑模板。 引擎也将报告导出为其他格式的能力有限:pdf、csv、html、xml。 引擎通常用于实现以 Excel 表格为源数据...
Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。 commons-logging.jar: Apache Commons包中的一个,包含日志功能 commons-io.jar Apache Commons包中的一个,java.io...
这种技术可以帮助我们快速、准确地将大量数据导入到Excel中进行进一步处理和分析。 接下来,我将分享导出Excel技术的优势和应用场景。通过导出Excel技术,我们可以轻松地从各种数据源中提取数据,并将其导入到Excel...
使用POI、JXL导出大量的数据到Excel很容易造成内存溢出,而CSV采用流的方式将大数据分批并压缩导出
用2003导出大量数据时会报数据异常,原因是2003不支持大数据处理。现在2007-2013是可以处理大数据的,但是有时会出现内存溢出的情况,因为数据过多,内存被写满了,所以内存溢出。本案例亲测可以导出280W以上,只要...
适合做大量文本数据或日志文件入库的场景,大文本被拆分成多个线程处理,速度快。 批量插入MongoDB,存在则更新,不存在则自动新增。 包含Main方法调用案例,基于接口的通用设计,业务模块可自定义实现具体逻辑。
静态编译后的易语言EXE/DLL之间不能再共享譬如窗口、窗口组件等类似资源,对于已经静态连接到一个EXE/DLL中的支持库,该支持库中的数据或资源将不能再被其它EXE/DLL中所使用的同名支持库访问。这是因为代码被分别...
在处理大数据集时,我们可能需要查看不同时间范围的数据。Highstock 提供了范围选择器,方便的用它来选择预设范围的时间,例如 1个月、一季度、1年等,你可以通过时间输入框来选择自己想要查看数据范围。 滚动条和...
用Java处理excel大量数据时必须要引用的Jar包 不知道为什么摘要要多于五十字节
银行和大型金融机构使用功能强大的计算机以极快的速度处理大量订单。 因此,数以千计的买卖订单在几分之一秒内启动。 那为什么看不到呢? 高频数据分析器,是一个创新的程序,可帮助您分析高频数据,以增加您对市场...