不知道大家是否使用過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上來。
它使用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人非常熱情,論壇上四處可見他的身影,給他發信他也是每信必會、有求必應,承蒙他多次幫助。而且論壇中大家多次提及中文問題,他也很重視。
轉入正題:
我貼一下一個例子:




















其中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只是在使用<ec:export>的時候才需要,不過這個功能還是很有用的。
export里面的excel和pdf默認不支持中文,需要手工修改源碼,excel的比較簡單:
修改org.extremecomponents.table.view.XlsView.java(我指的是1.0.1-M4-A14的相應代碼)
102行:





這個在使用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,并到它的目錄中,執行:


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的文件,內容如下:



















注意,其中有“@@@@@@@@@@”,因為我的實現方法很丑陋,我后面的代碼中將“@@@@@@@@@@”替換為你部署后運行的路徑,目的是字體文件等能夠跟工程一同部署,減少固定字體等文件的麻煩。
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();前面增加如下一段代碼:





































大家可以抨擊代碼的丑陋,呵呵,不過還好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上來。