天天看點

基于模闆的excel導出

産品中有很多子產品需要導出excel功能,導出excel幾乎都是把頁面已經顯示出來的資料清單導出為excel。但背景使用poi生成excel卻要1個單元格1個單元格的去編寫。每個子產品都需要單獨寫導出excel的代碼,導緻代碼裡充斥了createRow,createCell,setCellValue的代碼。但這不是要命的,要命的是目前台資料清單格式變了的時候,背景生成excel代碼的修改非常麻煩,特别是當産品經理要求在excel中也要保留WEB樣式的時候(背景色,字型色,寬度),就隻能oh shit!

HTML直接另存為excel

  最開始想的解決辦法是直接把資料清單的html代碼另存為xls字尾的excel檔案,這樣是最友善,也最容易維護的方式。   可惜因為隻是改了檔案的字尾,是以當用excel打開的時候就會彈出"您嘗試打開的檔案格式與檔案擴充名指定格式不一緻。"的提示。最終放棄了該方法。  

基于模闆引擎的excel資料導出

選擇html的原因

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

     1、html對于開發人員來可讀性最強,可以說看到這段html代碼就知道生成的excel會是什麼樣子。

   2、因導出的就是前台的資料清單,是以html代碼幾乎可以直接從前台頁面中copy到模闆中就可以了,維護也比較友善,不需要額外比較多的工作量。

HTML格式       

  為了易解析和增加可讀性,要求生成的html代碼隻有table tr td标簽,而且隻能有1個table,類似下面的代碼:

<code>&lt;</code><code>table</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>tr</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>td</code> <code>colspan="7" align="center"&gt;項目名稱&lt;/</code><code>td</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>tr</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>td</code> <code>colspan="7" align="center"&gt;(導出時間:2010-08-01)&lt;/</code><code>td</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>tr</code> <code>align="center" bgcolor="#9AB0AD"&gt;</code>

<code>        </code><code>&lt;</code><code>td</code> <code>width="150"&gt;記賬人&lt;/</code><code>td</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>td</code> <code>width="100"&gt;日期&lt;/</code><code>td</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>td</code> <code>width="80"&gt;金額&lt;/</code><code>td</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>tr</code> <code>bgcolor="#ABCDC1" color="#14645E"&gt;</code>

<code>        </code><code>&lt;</code><code>td</code> <code>color="#00000"&gt;x1&lt;/</code><code>td</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>td</code><code>&gt;2010-08-01&lt;/</code><code>td</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>td</code><code>&gt;100&lt;/</code><code>td</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>tr</code> <code>bgcolor="#ABCDC1" color="#14645E"&gt;</code>

<code> </code><code>&lt;/</code><code>table</code><code>&gt;</code>

模闆引擎   

  要根據一些資料生成上面的html代碼,當然需要使用模闆引擎,當然選擇什麼模闆引擎就看自己了,我們選擇了freemarker

html代碼轉excel

   對于html代碼的解析,因為我們要求html代碼隻能有1個table,可以看出我們的html代碼也是符合xml格式的,是以我們就使用xml庫解析html代碼。

通過xml解析循環所有tr,td标簽,并調用對應的createRow,createCell就能生成excel了,這裡不貼出所有代碼,有興趣的自己研究下,隻說說poi的幾個問題。

    1、合并單元格    

    當html中出現colspan的時候,就需要用到合并單元格,HSSFSheet.addMergedRegion 支援合并單元格    

   

  2、設定顔色    

    poi設定顔色比較麻煩,不能直接設定自定義的顔色值,預設隻能使用内置的一些顔色。如果要使用自定義的顔色,需要先把内置的一些顔色替換成自定義顔色。建議先選出一些不常用的poi内置顔色(我們選了15個,應該夠用了),當發現有自定義顔色的時候,就循環進行替換這些不常用的顔色。    

  3、設定寬度    

    這個在poi文檔中沒看到很詳細的介紹,因為 HSSFSheet.setColumnWidth 方法,使用的并不是像素機關,也不知道是什麼機關。經過嘗試發現把像素寬度*40,導出的excel列寬剛好是像素寬度。  

本文轉自BearRui(AK-47)部落格園部落格,原文連結:  http://www.cnblogs.com/BearsTaR/archive/2010/08/04/freemarker_excel_export.html  ,如需轉載請自行聯系原作者