导出大量数据到Excel的一种方式

导出大量数据到Excel的一种方式

在Java Web开发中,经常需要导出大量的数据到Excel,使用POI、JXL直接生成Excel,很容易就造成内存溢出了。

  1、有一种方式,就是把数据写成csv格式文件。

  1)csv文件可以直接用Excel打开。

  2)写csv文件的效率和写txt文件的效率一样高。

  3)同样的数据内容,生成的csv文件的大小远远小于生成的Excel文件。

  从以上优点就可以看出生成csv文件消耗的内存绝对小于生成Excel文件。

  2、按一定的格式去生成csv文件,在Excel中打开的时候就是完整的行和列格式。

  例如:在Excel中的格式:

                                   导出大量数据到Excel的一种方式_第1张图片

  那么,在csv文件中格式就必须为:

                                  导出大量数据到Excel的一种方式_第2张图片

  就是说,列和列之间,需要用英文输入法状态下的逗号","间隔:风云第一刀,古龙。

  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 >

  提供下载功能的Action参考http://www.cnblogs.com/luxh/archive/2012/07/01/2571778.html

  4、看一下同样的数据内容,csv文件和Excel文件的大小对比: 

                                        

 

 

 

 

 

 

 

  



更多信息请访问 java教程网 www.itchm.com

你可能感兴趣的:(导出大量数据到Excel的一种方式)