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

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

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

    張慧的博客

    張慧的博客

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

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

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

      1)csv文件可以直接用Excel打開(kāi)。

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

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

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

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

      例如:在Excel中的格式:

                                       

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

                                      

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

      3、在Struts2中導(dǎo)出數(shù)據(jù)到Excel,一個(gè)簡(jiǎn)單的例子。

      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進(jìn)行下載
         
    */
        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í)際上可能是從數(shù)據(jù)庫(kù)中把大量的數(shù)據(jù)查出來(lái)
         
    */
        private List<Novel> getNovels() {
            List<Novel> novels = new ArrayList<Novel>();
            
            Novel novel1 = new Novel("風(fēng)云第一刀","古龍",new Date());
            Novel novel2 = new Novel("書(shū)劍恩仇錄","金庸",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ù)按一定的格式寫(xiě)到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)題頭
                
    //注意列之間用","間隔,寫(xiě)完一行需要回車換行"\r\n"
                String title = "序號(hào),小說(shuō)名稱,作者,出版日期\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);
                    //注意列之間用","間隔,寫(xiě)完一行需要回車換行"\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進(jìn)行下載  -->
             <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文件的大小對(duì)比: 

                                            

     

     

     

     

     

     

     

      

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

    Feedback

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

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

    不過(guò),csv方式導(dǎo)出也存在問(wèn)題:
    首先,如果用excel來(lái)打開(kāi)csv,超過(guò)65536行的數(shù)據(jù)都會(huì)看不見(jiàn),這是excel程序的問(wèn)題。

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

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

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


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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 成全高清视频免费观看| 亚洲熟妇av一区二区三区漫画 | 亚洲国产aⅴ成人精品无吗| 国产美女a做受大片免费| 国产福利电影一区二区三区,免费久久久久久久精 | 亚洲伊人久久大香线蕉综合图片| 麻豆成人久久精品二区三区免费| 亚洲综合国产成人丁香五月激情| 亚洲成a人片在线观看国产| 性xxxx视频免费播放直播 | 100部毛片免费全部播放完整| 亚洲av午夜电影在线观看| 亚洲人成亚洲人成在线观看| 成人特黄a级毛片免费视频| 精品久久久久久无码免费| 亚洲国产精品久久丫| 国产AⅤ无码专区亚洲AV| 久久不见久久见免费影院| 99在线热播精品免费99热| 在线观看亚洲AV日韩AV| 久久久久久亚洲精品| 免费乱码中文字幕网站| 国产在线观看片a免费观看| 你懂的网址免费国产| 成人精品国产亚洲欧洲| 亚洲成人免费网址| 国产成人无码综合亚洲日韩| 国产精品国产午夜免费福利看| 99re免费视频| 三级黄色片免费看| 曰批免费视频播放免费| 日本亚洲色大成网站www久久 | 免费很黄无遮挡的视频毛片| 91嫩草亚洲精品| 亚洲视频免费在线观看| 国产亚洲精品线观看动态图| 日韩免费三级电影| 青苹果乐园免费高清在线| 日韩精品久久久久久免费| 你是我的城池营垒免费观看完整版| 国产精品亚洲一区二区三区在线观看|