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

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

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

    posts - 36, comments - 419, trackbacks - 0, articles - 0
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    基于模板的excel導(dǎo)出

    Posted on 2010-08-03 21:18 BearRui(AK-47) 閱讀(4403) 評(píng)論(5)  編輯  收藏 所屬分類: Java

        產(chǎn)品中有很多模塊需要導(dǎo)出excel功能,導(dǎo)出excel幾乎都是把頁(yè)面已經(jīng)顯示出來(lái)的數(shù)據(jù)列表導(dǎo)出為excel。但后臺(tái)使用poi生成excel卻要1個(gè)單元格1個(gè)單元格的去編寫。每個(gè)模塊都需要單獨(dú)寫導(dǎo)出excel的代碼,導(dǎo)致代碼里充斥了createRow,createCell,setCellValue的代碼。但這不是要命的,要命的是當(dāng)前臺(tái)數(shù)據(jù)列表格式變了的時(shí)候,后臺(tái)生成excel代碼的修改非常麻煩,特別是當(dāng)產(chǎn)品經(jīng)理要求在excel中也要保留WEB樣式的時(shí)候(背景色,字體色,寬度),就只能oh shit!

    HTML直接另存為excel

    最開(kāi)始想的解決辦法是直接把數(shù)據(jù)列表的html代碼另存為xls后綴的excel文件,這樣是最方便,也最容易維護(hù)的方式。   可惜因?yàn)橹皇歉牧宋募暮缶Y,所以當(dāng)用excel打開(kāi)的時(shí)候就會(huì)彈出"您嘗試打開(kāi)的文件格式與文件擴(kuò)展名指定格式不一致。"的提示。最終放棄了該方法。

    基于模板引擎的excel數(shù)據(jù)導(dǎo)出
    在一次跟朋友szyicol(http://www.cnblogs.com/szyicol/)聊天中,聊起該問(wèn)題,他也碰見(jiàn)了類似的問(wèn)題,目前也是每個(gè)模塊都寫單獨(dú)的導(dǎo)出excel代碼。但他說(shuō)想使用xls模板+xml映射文件(類似與hibernate的映射文件)來(lái)做通用導(dǎo)出excel。經(jīng)他提醒,我最終選擇使用模板引擎生成html代碼,然后把html代碼通過(guò)poi生成為excel。這樣開(kāi)發(fā)人員以后導(dǎo)出excel只需要編寫html模板就行。

    選擇html的原因

       選擇通過(guò)html代碼(而不是xml或者其他)生成excel的原因有下:

        1、html對(duì)于開(kāi)發(fā)人員來(lái)可讀性最強(qiáng),可以說(shuō)看到這段html代碼就知道生成的excel會(huì)是什么樣子。
      2、因?qū)С龅木褪乔芭_(tái)的數(shù)據(jù)列表,所以html代碼幾乎可以直接從前臺(tái)頁(yè)面中copy到模板中就可以了,維護(hù)也比較方便,不需要額外比較多的工作量。

     

    HTML格式       

    為了易解析和增加可讀性,要求生成的html代碼只有table tr td標(biāo)簽,而且只能有1個(gè)table,類似下面的代碼:

    <table>
        
    <tr>
            
    <td colspan="7" align="center">項(xiàng)目名稱</td>
        
    </tr>
        
    <tr>
            
    <td colspan="7" align="center">(導(dǎo)出時(shí)間:2010-08-01)</td>
        
    </tr>
        
    <tr align="center" bgcolor="#9AB0AD">
            
    <td width="150">記賬人</td>
            
    <td width="100">日期</td>
            
    <td width="80">金額</td>
        
    </tr>
        
    <tr bgcolor="#ABCDC1" color="#14645E">
            
    <td color="#00000">x1</td>
            
    <td>2010-08-01</td>
            
    <td>100</td>
        
    </tr>
      
    <tr bgcolor="#ABCDC1" color="#14645E">
            
    <td color="#00000">x1</td>
            
    <td>2010-08-01</td>
            
    <td>100</td>
        
    </tr>
    </table>

     

    模板引擎   

    要根據(jù)一些數(shù)據(jù)生成上面的html代碼,當(dāng)然需要使用模板引擎,當(dāng)然選擇什么模板引擎就看自己了,我們選擇了freemarker

    html代碼轉(zhuǎn)excel
      對(duì)于html代碼的解析,因?yàn)槲覀円骽tml代碼只能有1個(gè)table,可以看出我們的html代碼也是符合x(chóng)ml格式的,所以我們就使用xml庫(kù)解析html代碼。
    通過(guò)xml解析循環(huán)所有tr,td標(biāo)簽,并調(diào)用對(duì)應(yīng)的createRow,createCell就能生成excel了,這里不貼出所有代碼,有興趣的自己研究下,只說(shuō)說(shuō)poi的幾個(gè)問(wèn)題。

       1、合并單元格    

    當(dāng)html中出現(xiàn)colspan的時(shí)候,就需要用到合并單元格,HSSFSheet.addMergedRegion 支持合并單元格    

      2、設(shè)置顏色    

    poi設(shè)置顏色比較麻煩,不能直接設(shè)置自定義的顏色值,默認(rèn)只能使用內(nèi)置的一些顏色。如果要使用自定義的顏色,需要先把內(nèi)置的一些顏色替換成自定義顏色。建議先選出一些不常用的poi內(nèi)置顏色(我們選了15個(gè),應(yīng)該夠用了),當(dāng)發(fā)現(xiàn)有自定義顏色的時(shí)候,就循環(huán)進(jìn)行替換這些不常用的顏色。    

     具體可看:http://poi.apache.org/spreadsheet/quick-guide.html#CustomColors    

      3、設(shè)置寬度    

    這個(gè)在poi文檔中沒(méi)看到很詳細(xì)的介紹,因?yàn)?HSSFSheet.setColumnWidth 方法,使用的并不是像素單位,也不知道是什么單位。經(jīng)過(guò)嘗試發(fā)現(xiàn)把像素寬度*40,導(dǎo)出的excel列寬剛好是像素寬度。



    [作者]:BearRui(AK-47)
    [博客]: http://m.tkk7.com/bearrui/
    [聲明]:本博所有文章版權(quán)歸作者所有(除特殊說(shuō)明以外),轉(zhuǎn)載請(qǐng)注明出處.
    英雄,別走啊,幫哥評(píng)論下:  

    精彩推薦 好文要頂 水平一般 看不懂 還需努力

    評(píng)論

    # re: 基于模板的excel導(dǎo)出  回復(fù)  更多評(píng)論   

    2010-08-04 09:27 by 遲宏澤
    好文章,頂一下!

    # re: 基于模板的excel導(dǎo)出  回復(fù)  更多評(píng)論   

    2010-08-04 09:29 by BearRui(AK-47)
    @遲宏澤
    謝謝支持!

    # re: 基于模板的excel導(dǎo)出  回復(fù)  更多評(píng)論   

    2010-08-05 09:17 by heqs
    樓主的思路講的很清晰,不過(guò)還是很想看到代碼啊。呵呵

    # re: 基于模板的excel導(dǎo)出  回復(fù)  更多評(píng)論   

    2010-08-05 09:33 by BearRui(AK-47)
    @heqs
    謝謝支持,不過(guò)代碼還是不放出來(lái)了,因?yàn)闆](méi)經(jīng)過(guò)公司同意,不好意思。^_^

    # re: 基于模板的excel導(dǎo)出  回復(fù)  更多評(píng)論   

    2010-08-05 12:10 by 一杯清茶
    博主還需努力啊!
    主站蜘蛛池模板: 日本不卡免费新一区二区三区| 国产特黄特色的大片观看免费视频| 毛片免费在线观看| 亚洲日韩中文字幕在线播放| 伊人久久国产免费观看视频| 日韩一卡2卡3卡4卡新区亚洲| 老妇激情毛片免费| 国产成人亚洲精品影院| xxxxxx日本处大片免费看| 亚洲伊人色欲综合网| 永久免费不卡在线观看黄网站| 久久精品国产亚洲香蕉| 日本免费高清视频| 亚洲成a人片在线观看中文app| 5g影院5g天天爽永久免费影院| 亚洲天堂一区在线| 最近中文字幕免费mv视频7| 香港经典a毛片免费观看看| 久久久久国产成人精品亚洲午夜 | 青青青国产在线观看免费| 亚洲中文字幕久久精品无码VA| 岛国大片免费在线观看| 美女的胸又黄又www网站免费| 亚洲国产成人久久一区久久| 二个人看的www免费视频| 亚洲精品成人网站在线播放| 免费看无码自慰一区二区| 香蕉国产在线观看免费| 亚洲av无码一区二区三区网站| 国产精品免费观看| 亚洲AV无码成人精品区狼人影院 | 国产亚洲成av片在线观看| 精品香蕉在线观看免费| 亚洲AV无码专区在线厂| 国产亚洲一区二区手机在线观看| 99精品视频在线免费观看| 国产亚洲精品VA片在线播放| 亚洲综合色区在线观看| 2020久久精品国产免费| 久久高潮一级毛片免费| 亚洲欧洲日韩国产一区二区三区|