Tin's Blog

          You are coming a long way, baby~Thinking, feeling, memory...

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            128 隨筆 :: 0 文章 :: 221 評論 :: 0 Trackbacks
          不知道大家是否使用過eXtremeComponent,最早知道eXtremeComponent是從www.open-open.com,去年就在用了,感覺明顯比display-tag要好用多了。
          它使用jstl,所以與webwork集成也很方便,不象display-tag那樣需要把hibernate返回的collection復制一遍再訪問。

          具體的使用方法參考官方網站好了:
          官方網站在這里:
          http://www.extremecomponents.org/extremesite/welcome.jsp
          最新的版本是1.0.1-M4-A14,可以到這里下載:
          http://www.extremecomponents.org/extremesite/public/download/
          或者直接下載:
          http://www.extremecomponents.org/extremesite/public/download/extremecomponents-1.0.1-M4-A14.zip
          但是這個snapshot版本沒有依賴lib和資源文件等,推薦去這里下一個完整版本備用,目前最新的Production Release包是eXtremeComponents-1.0.1-M3-with-dependencies.zip:
          https://sourceforge.net/project/showfiles.php?group_id=108168
          最新版本的說明書在這里,說明書用的doc book格式,寫的也很清楚:
          http://www.extremecomponents.org/extremesite/public/download/eXtremeComponents.pdf
          很多人都對他使用的doc book聲稱doc感興趣,spring和hibernate都用doc book,可是一般看不到源文件。作者很慷慨將doc book的源文件也分享了,是學習是學習使用doc book的好東西:
          http://www.extremecomponents.org/extremesite/public/download/generate-docs.zip

          資源就貼到這里,這里要提及作者Jeff Johnston人非常熱情,論壇上四處可見他的身影,給他發信他也是每信必會、有求必應,承蒙他多次幫助。而且論壇中大家多次提及中文問題,他也很重視。

          轉入正題:
          我貼一下一個例子:
          <ec:table 
          items="ecoAttrs" 
          action
          ="/jgz/tjk/eco/listTjkAttByInfId.action" 
          imagePath
          ="${pageContext.request.contextPath}/css/table/zh_CN/*.gif" 
          cellpadding
          ="1" 
          title
          ="農村經濟運行情況列表" 
          locale
          ="zh_CN" 
          rowsDisplayed
          ="30"> 
          <ec:export view="xls" fileName="jgz_zyjjzbwcqk.xls" tooltip="輸出Excel文件"/> 
          <ec:exportPdf fileName="jgz_zyjjzbwcqk.pdf" tooltip="輸出PDF文件" headerColor="blue" headerBackgroundColor="red" headerTitle="密云縣農村經濟月份經濟主要指標完成情況表"/> 
          <ec:exportCsv fileName="jgz_zyjjzbwcqk.txt" tooltip="輸出CSV文件" delimiter="|"/> 
          <ec:row> 
          <ec:column property="ofTown.name" title="鄉鎮名稱"/> 
          <ec:column property="ncJihua" title="農村計劃"/> 
          <ec:column property="ncWancheng" title="農村完成"/> 
          <ec:column property="ncQunian" title="農村去年"/> 
          <ec:column property="zongShouRuWCJH" title="完成計劃%"/> 
          <ec:column property="zongShouRuTB" title="同比+/-%"/> 
          </ec:row> 
          </ec:table> 

          其中ecoAttrs是一個collection,放入pojo。action里面寫你這個頁面的訪問方法(如我的頁面是一個action,其他的如.do或者.jsp什么的都可以)。rowsDisplayed是默認顯示條數,它可以自動實現分頁。
          下面的三個<ec:export>是導出三種格式用的,不用的話可以不寫(寫了需要在web.xml配置相應的filter)。
          <ec:column>里面放屬性,property指向pojo的相應屬性,而title是表頭顯示的信息,這個標簽需要用<ec:row>包起來(1.0.1 m4以后)(抱歉pojo比較丑,出自同事之手)。

          這里放一套我做的中文圖標:
          http://tiny.51.net/extremecomponent/zh_CN.rar
          還有我該寫了一下css,更適合使用中文,將字體該為%大小,可以定義.eXtremeTable里面的font-size,即影響所有eXtremeTable里面的字體大小,也方便寫js來動態修改大小:
          http://tiny.51.net/extremecomponent/extremecomponents.css

          貼一下我在web.xml里面的配置:
          <filter> 
          <filter-name>eXtremeExport</filter-name> 
          <filter-class> 
          org.extremecomponents.table.filter.ExportFilter 
          </filter-class> 
          </filter> 

          <filter-mapping> 
          <filter-name>eXtremeExport</filter-name> 
          <url-pattern>/*</url-pattern> 
          </filter-mapping> 

          <taglib> 
          <taglib-uri>/extremecomponents</taglib-uri> 
          <taglib-location>/WEB-INF/tld/extremecomponents.tld</taglib-location><!-- 別忘了把那個tld拷貝到相應目錄去 --> 
          </taglib> 

          其實,那個filter只是在使用<ec:export>的時候才需要,不過這個功能還是很有用的。

          export里面的excel和pdf默認不支持中文,需要手工修改源碼,excel的比較簡單:
          修改org.extremecomponents.table.view.XlsView.java(我指的是1.0.1-M4-A14的相應代碼)
          102行:
          HSSFCell hssfCell = hssfRow.createCell(cellnum); 
          hssfCell.setEncoding(HSSFCell.ENCODING_UTF_16);(就是添加這一行) 
          122行: 
          HSSFCell cell 
          = row.createCell(cellnum); 
          cell.setEncoding(HSSFCell.ENCODING_UTF_16);(就是添加這一行) 

          這個在使用UTF-8時工作正常。如果其他Unicode環境可以嘗試HSSFCell.ENCODING_COMPRESSED_UNICODE。

          編譯后將對應.class放到WEB-INF/classes相應目錄就可以了。

          pdf view的比較麻煩,還沒嘗試,解決方法參照這個帖子:
          http://extremecomponents.org/forum/viewtopic.php?t=139&highlight=chinese+filter
          http://www-128.ibm.com/developerworks/cn/xml/x-ospdf/index.html

          還有一小點:
          升級到1.0.1-M4-A14以后兩個圖片改名了,如果用1.0.1-M3的對應gif則需要該如下兩個文件名(我修改的那個ZH-CN已經重命名過了):
          searchArrow.gif -> filterArrow.gif
          search.gif -> filter.gif

          說的比較羅嗦,主要是想讓和我一樣的非常初級水平的朋友能夠比較容易上手。其實eXtremeComponent的文檔很不錯,用那個上手其實更好,我僅拋磚引玉,各位大牛多多包涵。

          下面是補充上的如何讓PDF View支持中文,這個需要點耐心。
          我是在WindowsXP里面(這個涉及到文件夾和所帶的字體)。

          1、解開fop-0.20.5.jar,啟用cmd,并到它的目錄中,執行:
          java org.apache.fop.fonts.apps.TTFReader -ttcname "SimSun" C:\WINDOWS\Fonts\simsun.ttc simsun.xml 
          java org.apache.fop.fonts.apps.TTFReader -ttcname SimHei C:\WINDOWS\Fonts\simhei.ttf simhei.xml 

          2、然后就會生成需要的兩個字體描述文件:simsun.xml、simhei.xml
          我們將我們生成的兩個xml文件和它們對應的字體simsun.ttc和simhei.ttf存儲到我們的Web項目的WEB-INF/fonts下面。
          3、然后在我們的src目錄(目的是要被部署到WEB-INF/classes目錄,也有可能是/src/conf,看你的工程的設定)創建一個名為fop-pdf-userconfig.xml的文件,內容如下:

          <?xml version="1.0" encoding="UTF-8"?> 
          <configuration> 
          <fonts> 
            
          <font metrics-file="@@@@@@@@@@fonts/simsun.xml" 
                     embed-file
          ="@@@@@@@@@@fonts/simsun.ttc" kerning="yes"> 
                      
          <font-triplet name="SimSun" style="normal" weight="normal"/> 
                      
          <font-triplet name="SimSun" style="normal" weight="bold"/> 
                      
          <font-triplet name="SimSun" style="italic" weight="normal"/> 
                      
          <font-triplet name="SimSun" style="italic" weight="bold"/> 
            
          </font> 
            
          <font metrics-file="@@@@@@@@@@fonts/simhei.xml" 
                     embed-file
          ="@@@@@@@@@@fonts/simhei.ttf" kerning="yes"> 
                      
          <font-triplet name="SimHei" style="normal" weight="normal"/> 
                      
          <font-triplet name="SimHei" style="normal" weight="bold"/> 
                      
          <font-triplet name="SimHei" style="italic" weight="normal"/> 
                      
          <font-triplet name="SimHei" style="italic" weight="bold"/> 
            
          </font> 
          </fonts> 
          </configuration>

          注意,其中有“@@@@@@@@@@”,因為我的實現方法很丑陋,我后面的代碼中將“@@@@@@@@@@”替換為你部署后運行的路徑,目的是字體文件等能夠跟工程一同部署,減少固定字體等文件的麻煩。
          4、對extremeComponent的代碼,我又修改了兩處:
          其一,對于org.extremecomponents.table.view.PdfView修改:
          將其中出現<fo:block的地方全部添加font-family=\"SimSun,SimHei\"。
          然后double colwidth = 10 / columnCount;中的10修改為20,此處修改使中文字符不會堆積在一起。
          我還將上面的sb.append(" page-width=\"11in\" ");修改為sb.append(" page-width=\"22in\" ");,這樣對于中文比較寬大的報表可以顯示完全,不過這個要自己把握。

          其二,修改org.extremecomponents.table.filter.PdfViewResolver:
          我在driver.run();前面增加如下一段代碼:
          try 
                      ClassLoader loader 
          = Thread.currentThread().getContextClassLoader(); 
                      URL url 
          = loader.getResource( 
                              
          "/org/extremecomponents/table/filter/PdfViewResolver.class"); //get the class's working folder 
                      String classPathUrl = url.toExternalForm(); 
                      String fileRoot 
          = classPathUrl.substring(0
                              classPathUrl.lastIndexOf(
          "WEB-INF")); 
                      fileRoot 
          = (fileRoot.substring(6+ "WEB-INF/"); //cut the "file:/" prefix 

                      InputStream opis 
          = loader.getResourceAsStream( 
                              
          "fop-pdf-userconfig.xml"); 
                      StringBuffer tempConfigurationStrBuf 
          = new StringBuffer(); 

                      
          byte[] buffer = new byte[4096]; 
                      
          int len; 

                      
          while ((len = opis.read(buffer)) != -1
                          String s 
          = new String(buffer, 0, len); 
                          tempConfigurationStrBuf.append(s); 
                      }
           

                      String configurationStr 
          = tempConfigurationStrBuf.toString(); 
                      configurationStr 
          = configurationStr.replaceAll("@@@@@@@@@@"
                              fileRoot); 

                      ByteArrayInputStream bais 
          = new ByteArrayInputStream(configurationStr.getBytes()); 
                      org.apache.fop.apps.Options options 
          = new org.apache.fop.apps.Options(); 
                      options.loadUserconfiguration(bais); 
                  }
           catch (FOPException fe) 
                      fe.printStackTrace(); 
                  }

          大家可以抨擊代碼的丑陋,呵呵,不過還好it works。代碼很丑陋,本來想咨詢raimundo的,他正好忙,所以畸形了,如果朋友們有其它好方法可以一同改進。
          不過要注意,我替換的/org/extremecomponents/table/filter/PdfViewResolver.class是放到WEB-INF/classes文件夾的,如果您將它替換到jar包里面,則上面內容還需要修改一下,我沒有測試,但是估計也不麻煩的。

          至此,最基本的解決Pdf export的方法就寫好了。可是正好看到差沙已經早些放出了他的修改,明顯比我這個優雅,但是他的修改無法將fonts里面的內容自動部署并檢查目錄,大家可以合并一下代碼,相信會更好一點。回去好好學習差沙分享的代碼,大家一同學習。

          相關代碼打包在這里:
          http://tiny.51.net/extremecomponent/ec_pdf_chfix.rar

          本解決方案參考了本貼:
          http://extremecomponents.org/forum/viewtopic.php?t=139&highlight=chinese+filter


          這是我在JavaEye的一篇帖子,轉到我的Blog上來。
          posted on 2006-02-16 21:10 Tin 閱讀(2965) 評論(3)  編輯  收藏 所屬分類: Other Project

          評論

          # re: eXtremeComponent在中文環境下的使用 2006-02-17 08:37 JavaXP
          寫的很不錯啊``值得學習`  回復  更多評論
            

          # re: eXtremeComponent在中文環境下的使用 2006-06-15 10:20 ybbk
          寫得是不錯

          可文擋就是下載不了 ~_~  回復  更多評論
            

          # re: eXtremeComponent在中文環境下的使用 2006-11-29 08:43 damyankee
          excel 能否給一個包?  回復  更多評論
            

          主站蜘蛛池模板: 灌南县| 遂昌县| 本溪市| 科技| 石楼县| 赣榆县| 台州市| 乐至县| 禹州市| 筠连县| 信阳市| 南和县| 拉孜县| 祁东县| 花莲市| 镇平县| 楚雄市| 通河县| 汤阴县| 酉阳| 新余市| 广西| 绥化市| 射洪县| 工布江达县| 紫金县| 申扎县| 杂多县| 栾城县| 兴安盟| 新绛县| 临城县| 望都县| 平泉县| 黄大仙区| 长治县| 通道| 自治县| 平果县| 嘉兴市| 高阳县|