2025-02-10

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

                                       

 作者:張慧

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *