<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    張慧的博客

    張慧的博客

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      45 Posts :: 0 Stories :: 24 Comments :: 0 Trackbacks

    在Java Web開發(fā)中,經(jīng)常需要導(dǎo)出大量的數(shù)據(jù)到Excel,使用POI、JXL直接生成Excel,很容易就造成內(nèi)存溢出了。

      1、有一種方式,就是把數(shù)據(jù)寫成csv格式文件。

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

      2)寫csv文件的效率和寫txt文件的效率一樣高。

      3)同樣的數(shù)據(jù)內(nèi)容,生成的csv文件的大小遠(yuǎn)遠(yuǎn)小于生成的Excel文件。

      從以上優(yōu)點就可以看出生成csv文件消耗的內(nèi)存絕對小于生成Excel文件。

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

      例如:在Excel中的格式:

                                       

      那么,在csv文件中格式就必須為:

                                      

      就是說,列和列之間,需要用英文輸入法狀態(tài)下的逗號","間隔:風(fēng)云第一刀,古龍。

      3、在Struts2中導(dǎo)出數(shù)據(jù)到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;


    /**
     * 導(dǎo)出數(shù)據(jù)到csv文件
     * 
    @author Luxh
     
    */
    public class CsvAction extends ActionSupport {

        private static final long serialVersionUID = -2862629695443964658L;
        
        /**
         * 包含完整路徑的文件名
         * 傳遞給下載Action進行下載
         
    */
        private String fileName;
        
        
        /**
         * 導(dǎo)出數(shù)據(jù)
         
    */
        public String exportData2CSV() {
            List<Novel> novels = getNovels();
            fileName = "D:/novels.csv";
            writeData2CSV(novels,fileName);
            return SUCCESS;
            
        }
        
        /**
         * 構(gòu)造一些數(shù)據(jù)
         * 實際上可能是從數(shù)據(jù)庫中把大量的數(shù)據(jù)查出來
         
    */
        private List<Novel> getNovels() {
            List<Novel> novels = new ArrayList<Novel>();
            
            Novel novel1 = new Novel("風(fēng)云第一刀","古龍",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;
        }
        
        /**
         * 把數(shù)據(jù)按一定的格式寫到csv文件中
         * 
    @param novels     數(shù)據(jù)集合
         * 
    @param fileName  csv文件完整路徑
         
    */
        public void writeData2CSV(List<Novel> novels,String fileName) {
            FileWriter fw = null;
            try {
                fw = new FileWriter(fileName);
                //輸出標(biāo)題頭
                
    //注意列之間用","間隔,寫完一行需要回車換行"\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();
                }
            }
        }

    }

    復(fù)制代碼

      配置文件:

    <!--將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、看一下同樣的數(shù)據(jù)內(nèi)容,csv文件和Excel文件的大小對比: 

                                            

     

     

     

     

     

     

     

      

    posted on 2012-07-10 00:43 張慧 閱讀(7379) 評論(1)  編輯  收藏

    Feedback

    # re: 導(dǎo)出大量數(shù)據(jù)到Excel的一種方式 2012-07-10 09:00 Niko7
    導(dǎo)出excel確實有些麻煩,不能流式處理,導(dǎo)致占用比較大的內(nèi)存,很容易導(dǎo)致內(nèi)存溢出;并且excel的數(shù)據(jù)量是有限制的,不能超過65536行。
    一旦超過,將無法生成excel文件。

    用csv方式導(dǎo)出,則可以像導(dǎo)出txt一樣,以文本流的方式進行流式處理,不但能導(dǎo)出海量信息,而且流式處理占用內(nèi)存極低,服務(wù)器對瀏覽器的響應(yīng)也是非常迅速的。輕松導(dǎo)出幾百萬行數(shù)據(jù),理論上是不限量的。

    不過,csv方式導(dǎo)出也存在問題:
    首先,如果用excel來打開csv,超過65536行的數(shù)據(jù)都會看不見,這是excel程序的問題。

    其次,如果你要導(dǎo)出一個身份證號碼,手機號碼,郵政編碼等,純數(shù)字構(gòu)成的字符串,在excel中打開csv時,這些字段很容易被識別成數(shù)字,造成誤解。
    解決方法是在字符串前加“'”(單引號),然而這樣處理后,excel打開scv時會看到這個“'”,又不對了,并且單擊該單元格再離開后,這個單引號會自動消失,這是'在excel中的特殊用途導(dǎo)致的,如果此時再保存文件,文件中的'會丟失,如果再打開該csv文件,問題就更嚴(yán)重了,編碼全成數(shù)字了(因為'丟了)!
    看來這也是excel的問題。

    上面兩個問題按下不說的話,那么csv文件還是有些基本規(guī)則的,比如用""括起來那么里面的","不會作為分隔符等轉(zhuǎn)義操作。

    總體而言,我也傾向于csv格式,它可以流式處理。  回復(fù)  更多評論
      


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 一色屋成人免费精品网站| 久久久久亚洲av无码专区喷水| 88xx成人永久免费观看| 亚洲av无码兔费综合| 亚洲美免无码中文字幕在线| 亚洲乱码国产一区网址| 午夜视频免费观看| 最近中文字幕国语免费完整| 久久国产精品免费| 国产天堂亚洲国产碰碰| 久久亚洲国产成人影院| 久久精品国产精品亚洲毛片| AV在线亚洲男人的天堂| 亚洲av无码不卡私人影院| 德国女人一级毛片免费| 精品香蕉在线观看免费| 精品在线免费观看| 国产午夜无码片免费| 日本视频免费观看| 午夜亚洲国产精品福利| 亚洲国产高清国产拍精品| 精品丝袜国产自在线拍亚洲| 亚洲韩国在线一卡二卡| 亚洲AV乱码久久精品蜜桃 | 亚洲人和日本人jizz| 亚洲av无码av制服另类专区| 中文字幕亚洲激情| 亚洲色偷拍区另类无码专区| 免费在线观看a级毛片| 国产成人高清精品免费鸭子| 国产成人青青热久免费精品| 国产麻豆剧传媒精品国产免费| 人妻视频一区二区三区免费| 台湾一级毛片永久免费| 久久不见久久见中文字幕免费| 99久久99久久精品免费看蜜桃| 久久久久久精品成人免费图片| 久久九九兔免费精品6| 国产免费看JIZZ视频| 中国在线观看免费高清完整版| 曰批视频免费40分钟试看天天|