`
dyllove98
  • 浏览: 1382486 次
  • 性别: Icon_minigender_1
  • 来自: 济南
博客专栏
73a48ce3-d397-3b94-9f5d-49eb2ab017ab
Eclipse Rcp/R...
浏览量:38332
4322ac12-0ba9-3ac3-a3cf-b2f587fdfd3f
项目管理checkList...
浏览量:78642
4fb6ad91-52a6-307a-9e4f-816b4a7ce416
哲理故事与管理之道
浏览量:131791
社区版块
存档分类
最新评论

java大数据处理-大量数据到Excel

阅读更多

 

在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文件的大小对比: 

                                        

 

 

 

 

52
30
分享到:
评论
32 楼 juluren 2013-02-04  
http://apidoc.cn/archives/47http://apidoc.cn/archives/47
海量数据请参考这个
31 楼 yugenning 2012-11-08  
c.zhiwu 写道
果然大数据.
引用

1)csv文件可以直接用Excel打开。
2)写csv文件的效率和写txt文件的效率一样高。
3)同样的数据内容,生成的csv文件的大小远远小于生成的Excel文件。

1)csv文件可以直接用Excel打开。
excel理论上一个sheet只能存放65535条记录


2)写csv文件的效率和写txt文件的效率一样高。
3)同样的数据内容,生成的csv文件的大小远远小于生成的Excel文件。

这有可比性吗? 本身的文件格式就完全不同.



65535 的限制是Excel2003的限制,在Excel2007 就没有这个限制了;
30 楼 chaodilei 2012-08-15  
用户要是想看报表,当然是希望导出来的结果更直观,操作更方便。如果到处成csv格式,就满足不到用户的这个需求了。如果导出来只是有表格形式并且需要用excel再次打开的文件,那用户为什么不直接看网页上的表格?
29 楼 Allen_Wang 2012-07-16  
兄弟,导出csv不叫导出excel,只能叫导出csv文件你用excel打开,完全是两个不同的概念。
28 楼 jimzhao 2012-07-14  
纯粹导出数据可以用这种方法。
稍微对excel格式有点要求的就不行了。
27 楼 c.zhiwu 2012-07-14  
果然大数据.
引用

1)csv文件可以直接用Excel打开。
2)写csv文件的效率和写txt文件的效率一样高。
3)同样的数据内容,生成的csv文件的大小远远小于生成的Excel文件。

1)csv文件可以直接用Excel打开。
excel理论上一个sheet只能存放65535条记录


2)写csv文件的效率和写txt文件的效率一样高。
3)同样的数据内容,生成的csv文件的大小远远小于生成的Excel文件。

这有可比性吗? 本身的文件格式就完全不同.


26 楼 xiaohuafyle 2012-07-13  
哦,最多能处理多大的数据量呢?
25 楼 zengjz88 2012-07-13  
有一分钱的关系...
24 楼 HelloJimmy 2012-07-13  
这跟大数据量有一分钱的关系?!
23 楼 bingufo 2012-07-13  
不错,学习了
22 楼 liulijun.cn.2011 2012-07-12  
qcyycom 写道
如果要减少内在占用的话,可以每100条记录输出一次

大数据量下减少内存占用应该使用多线程,或者Iterator方式。
每100条输出一次效果不是很大。
21 楼 qcyycom 2012-07-12  
如果要减少内在占用的话,可以每100条记录输出一次
20 楼 test_touch 2012-07-12  
复杂表头的可以实现吗?
19 楼 mixer_a 2012-07-12  
有没有考虑数据量达到50w的情况?
18 楼 o_o_0 2012-07-12  
mark~
17 楼 yuanyannan 2012-07-12  
不错,针对海量数据导出,很实用
16 楼 onelee 2012-07-11  
POI 的 SXSSFWorkbook(100); // 只在内存中保留100行记录
15 楼 laobi1987 2012-07-11  
我以为是上百万的数据量呢....
14 楼 dmdongming 2012-07-11  
    
13 楼 wcgchen 2012-07-11  
这里缺少考虑一种情况:复杂表结构的问题;
csv面对合并单元格、复杂表结构的形式,就不能够满足需要了

相关推荐

Global site tag (gtag.js) - Google Analytics