置頂隨筆
#
簡表(JOR),是一款開源的報表工具,完全java實現,核心代碼來自于國內一線報表工具品牌杰表.2008 。
提起開源的報表工具,不能不說說jaspereport,jasperreport作為著名的開源報表工具,在java程序員中一直享有盛名。但由于其設計主要是針對西式的簡單報表,設計起復雜的中式報表來,有點力不從心,所以,在國內的項目中能成功應用的例子并不多。JOR,作為能做復雜報表的開源報表工具,可以彌補jasperreport的不足。
下載地址:
http://www.jatools.com/jor
java實現的olap服務器,完全自主產權,純java實現. cube架構,性能優,占用空間小.
分析模型設計器
通過圖片介紹java報表開發過程中,經常遇到的一些報表類型,統計圖,及可視化的設計等.下面以 杰表.2008 為例介紹之.
一、支持報表類型
主從報表

套打報表

標簽報表

分欄報表

計算比去年增長數

計算比去年同期增長數

補足空行的表格報表

多表合并.不同的數據集,做成一個相連的報表.

公式分組報表.按字段值,進行分類,分級

排行榜(Top N)報表

按匯總值大小排序的分組

多級分組

計算占比

顯示排名

交叉表折頁處理



層次不等的交叉表

行列并行分組的交叉表

多數據集的交叉表

靜態表格中的公式計算

二、javabean數據源
使用java數組
假設項目組其他成員已經編寫了一個Student類,如下圖(a),該類定義四個方法,分別獲取其姓名,年齡,性別,分數。由腳本構造一個包含三個Student對象的數組,如圖(b),要求你做成下圖(c)所示報表。

嵌套的java對象數據源
假設你有下圖(a)所示的兩個類Student和Person,你可以使用Student的getMembers()方法,取得該學生的家庭成員列表,每個家庭成員用一個Person對象表示,該對象包含與該學生的關系、姓名、性別等信息。

ResultSet數據源

指定sql查詢一個報表

三、統計圖與條碼
插入統計圖對象

設置統計圖背景及立體效果

設置統計圖輸出格式為Flash

從統計圖鉆取另一個明細報表
你可以在統計圖的某一個數據區放置一個超鏈接,使用戶雙擊該區時,跳轉到另一個子報表或網頁,如,有一個柱形圖,顯示各產品的庫存量,點擊某個產品的柱面,就可以打開該產品相關的銷售記錄。

餅圖

以時間為橫軸的統計圖

混合類型統計圖

雙軸統計圖

創建甘特圖

特殊統計圖








創建條形碼對象
日常生活中條形碼隨處可見,條形碼用幾何圖形表示數據,并可以被專門設備識別。杰表可支持的13種條形碼,分別是codabar、code39、code128、2of5、postnet、ean-128、ean-13、ean-8、upc-a、upc-e、royal-mail-cbc、pdf417、datamatrix,其中最后兩種是二維條形碼。
一維碼
二維碼 
設置圖片背景

顯示數據庫字段上的圖片

三、特殊的報表效果
凍結窗口效果

點擊表頭排序

使用超鏈接子報表
當你瀏覽報表時,可能需要了解更詳細的信息,比如,我們在瀏覽一個訂單列表時,希望了解該訂單中各貨物的銷售數量。這時,你可以在訂單列表中,加一個超鏈接,使用戶在點擊該鏈接后,可以跳轉到顯示該訂單明細的一個報表。
你可以在主表中,點擊訂單ID,即可瀏覽該訂單出售的所有貨物明細,如下圖所示:

熱點提示

復雜匯總

顏色警告

斑馬條

創建頁小計、頁累計報表

四、可視化設計器
設計參數表單
杰表.2008配備了一個可視化參數表單設計器,使用這個設計器,你可以不離開報表設計器環境,輕松制作查詢表單。表單設計器有豐富的web控件,檢驗,事件偵聽,css樣式機制,你也可以使用javascript腳本擴展表單功能,同時,也實現了常用的多個下拉框聯動功能。

可視化的報表設計器

報表預覽面板

本文試圖對市面上流行的純java實現的web報表工具,jasperreport 、 stylereport 、杰表、潤乾報表、快逸、finererport為例,分析各報表工具采用的web打印技術的異同、優劣、及對用戶需求的適應性,供大家參考。
打印是報表工具的基本功能之一,有些報表工具就是從一個專門的打印程序中發展而來,如用友華表。因為想當然地簡單,所以,在報表工具選型時用戶常常忽略這個問題,特別是有些報表工具廠商,明知自己的打印方案在滿足某些需求時,存在缺陷,但沒有盡明確告知義務,而故意事先做好花里胡哨的有關打印方面的文檔,欺騙客戶。我曾不至一次地聽說,有些開發商選用的報表工具,其打印功能不能滿足需求,不得不另外找打印工具的事情,實在是吃盡苦頭。
報表打印在c/s時代,確實非常簡單,vb,vc,Delphi,pb,都有很好用的打印api,有的甚至用報表控件方式,搞定打印更是分分秒的事情,但今天是b/s的天下,報表都是在網頁瀏覽器中顯示,但當今的瀏覽器打印功能一般非常弱(誰讓你叫他“瀏覽”器呢?“瀏覽”就是讓你用眼睛看,“打印”屬于兼職),要做到精確分頁打印,幾乎不可能,所以當前的報表工具,一般不會讓你使用瀏覽器的打印菜單來打印報表,都有自己的解決方案,這下可好,各報表工具廠商由是乎,八仙過海,各顯神通,各家都說自己的好,對于web打印了解不深的客戶,總有霧里看花的感覺。
歸納來說,當今java報表工具采用的打印技術不外乎三類:Applet打印、導出成pdf/excel打印、控件打印。用戶選用的重點是:盡量選擇插件小的打印軟件,因為文件小意味著安裝迅速,啟動速度快。插件大小除了插件本身的大小外,還需要考慮支持軟件的大小,如有些插件很小,支持軟件卻很大。
Applet打印
本文開始處提及的報表工具,除finereport外都支持Applet打印。之所以多數廠商支持Applet方式打印,因為Applet是java實現,與java后臺、java報表設計器的兼容性較好,代碼容易維護,實現也方便。然而,廠商省事,用戶就得多事。Applet方式打印,用戶最多的抱怨是需要安裝jre(而當前的操作系統,一般不是默認安裝的),雖然說,多數廠商已經做到可以自動安裝jre,但對于10幾M(JRE1.4有15M,JRE1.5為16M))的安裝,這意味著用戶需要較長時間的等待。
另一個問題是Applet配置復雜,使用不穩定。1995年,正是因為給人們無窮的視覺和腦力震蕩的Applet ,使人們認識了java,認識了Games Gosling。所以在b/s早期,人們為了展現html的富客戶效果,Applet是唯一之選。但現如今,Applet已經是昨日黃花,早已被ajax、flex取代,是什么原因?戰略層面的東西,我也不太說得清楚,但作為程序員,經過幾番折騰后,也不會愿意再用Applet了。如經常莫名其妙地出現“小應用程序,… notinited”的錯誤,還得清理ie緩存,對于Applet打印,還需要設置jre的安全策略等等。不是靠終端用戶能完成的,這就必須額外地增加開發商的服務成本。
Applet打印,啟動速度慢。Applet打印原理是,當你點擊打印按鈕時,瀏覽器啟動Applet,Applet根據參數訪問后臺頁面信息,后臺返回頁面,Applet加載頁面后,調用jre的打印服務進行打印。這就意味著,每次打印都需要調用后臺服務程序,就必然影響打印的響應速度。
Applet打印很安全,言下之意是ActiveX打印不安全,這是采用Applet打印的廠商津津樂道的,實際上,這是一個偽命題。Applet和ActiveX都是瀏覽器的插件,我們當然不希望下載插件后,該插件可以為所欲為,比如,刪除你磁盤里的文件,或啟動一個木馬,從這點來說,Applet確實比ActiveX安全,因為Applet是在一個受限的環境里運行,而ActiveX是不受限的。所以,當你訪問一個陌生的網站時,出于安全考慮,你可能會允許下載運行Applet,而阻止ActiveX。但當用戶訪問自己的網站系統,時,這種擔心就沒必要,這好比,當你與陌生人打交道時,很自然地會問自己,這人可信嘛?但如果你與家里人打交道,這個問題就不成其為問題了。
Applet打印,除了可以設置打印機,設置紙張頁面大小等常規打印功能外,往往也集成與打印不相關的功能,比如,打印前修改(有人說,是為了做假帳方便,中國特色,國產報表工具一般都具備,jasperreport,stylereport不支持),按行分頁,自由定位,這些本來由設計器完成的功能,挪到打印功能上來,來掩蓋上面指出的Applet的種種不足。實際上,Applet功能強弱完全取決于Applet的大小,有些報表廠商甚至用Applet或web start 的方式,提供所謂的基于web的報表設計,前提是下載 40多M的jar包,實際上,這種方案遠非一般意義上的純web 的報表設計,完全是混淆概念。作為用戶最希望常規的,他們熟悉的打印功能,不需要不相關的,理解困難的打印功能。
PDF/EXCEL打印
Pdf打印方式,就是用戶點擊打印后,瀏覽器會自動彈出adobe reader,再利用adobe的打印按鈕進行打印,由于國外adobe reader安裝非常普及,國外的java報表工具多提供這種打印方案,比如 stylereport,jasperreport,國內報表工具finereport也采用這種方式(讓人不解),pdf方式打印的好處是能做到精確打印,而且報表預覽與打印一氣呵成。但不足是需要在客戶的機子里,事先安裝有adobe reader,作為程序員,一般不太會有問題,因為程序員可能經常要瀏覽一些pdf文檔,多數已經裝了adobe reader,但國內的終端用戶,大多不知pdf是何物,更談不上安裝。
Pdf打印的另一個問題是必須彈出adobe reader,不能做到無預覽打印,這可能由于pdf缺少相應api的緣故吧。
輕量級的ActiveX打印
這里之所以強調“輕量級”,目的是與傳統意義上的ActiveX報表相區別。ActiveX技術可以說是報表工具家族里的沒落貴族,c/s時代,報表工具一般都被做成控件形式,水晶報表就是如此,在b/s時代,報表工具里仍然能看到ActiveX的身影,但風光大不如從前,如數巨,明宇,用友華表,inforeport。用ActiveX實現報表的不足,在網上你能輕易找到,在此不再詳述。ActiveX 報表雖深受詬責,但從打印功能來說,卻都是近乎完美,處理得卻非常好,非常穩定。
既然,ActiveX打印是長處,能不能揚長避短地使用ActiveX技術?有人提出這樣的問題。于是,有些廠商,比如杰表,采用了瀏覽時用html,打印時用插件的方式。這種方案的需要解決的問題是,ActiveX打印控件,不能太大,否則報表工具成了ActiveX報表了。
與Applet相比,輕量級ActiveX打印具有以下優勢:
1. 下載時間短,(大小是Applet的1/250);
2. 本地打印,打印時,不需要訪問后臺服務程序,不占用服務器資源;
3. 啟動速度快,由于控件小,且本地打印,所以打印速度是優于以上兩中打印方案,打印速度與你點擊瀏覽器打印菜單相差無幾。
采用輕量級的ActiveX打印的不足是,只有ie 5.5 及以上版本支持,其他版本的瀏覽器不支持。好在ie5.5瀏覽器已非常普及,在用戶那里應該不是大問題。
杰表采用的打印方案,用一個jatoolsPrinter的控件,大小是60k,是經過數字簽名的。這個打印控件采用ie特有的打印技術(templateprinter)實現打印功能,支持打印,預覽,邊距設置,重復打印,批量打印功能。
目前,jatoolsPrinter已經從杰表中獨立出來,任何報表工具或第三方軟件都利用該控件,實現web打印,推出至今,免費加收費用戶上萬。
下表總結三種方式的采用者及優劣對比,對于ie5.5客戶來說,我們推薦使用ActiveX打印方案.

報表廠商列表
jasperreport
Stylereport
杰表
潤乾
快逸
finererport
當我們使用報表工具,設計完一張報表時,我們同時必須為該報表設計一個查詢條件表單,使得用戶在瀏覽報表時,可以在網頁中選取查詢條件。在過去,設計表單是件令人沮喪的事情,這不僅要求你在報表設計器與開發環境之間來回切換,而且在設計表單時,還需要考慮系統的其他布局元素的關系,苦燥,繁瑣,沒有挑戰性。更進一步,如果項目要求最終用戶能夠自己設計報表,天吶,他們可能喜歡用報表設計工具來設計報表,但絕對不愿意用網頁設計工具來設計表單。
當然,也有一些報表工具,實現了參數表單的自動化,比如,按一定規則順序排列參數項,但這種自動化,用戶很難按其需求進行排版布局,所以不能徹底解決用戶的問題。
現在,杰表.2008配備了一個可視化參數表單設計器,使用這個設計器,你可以不離開報表設計器環境,輕松制作查詢表單。表單設計器有豐富的web控件,檢驗,事件偵聽,css樣式機制,你也可以使用javascript腳本擴展表單功能,同時,也實現了常用的多個下拉框聯動功能。
杰表.2008表單設計器不僅是表單設計工具的替代品,更重要的是表單設計器解決了報表設計容易,部署難的問題。我們希望,利用集成的表單設計器,你只要在設計器中設計好參數表單,并將報表模板文件和表單模板文件置于某個位置,你的用戶就可以在瀏覽器中,按條件瀏覽這張報表了,這中間不需要你再做任何其他事情。
有關表單設計的更多內容,點擊這里

作為java程序員,大家可能都聽說過,或用過birt, 據說,現在birt的東家actual,正式入駐中國市場,聯想到前些天杰表.2008的推出,今年,注定是國內的報表軟件市場不平靜的一年。
birt的最大好處是開源,不足是水土不服,做起復雜報表來不方便,復雜報表主要說的是行上,列上有多個并列分組的交叉報表,國產報表工具大都關注復雜報表需求,而洋品牌的報表軟件工具,如jasperreport,crystalreport,這方面關注不夠,所以做起復雜報表來很吃力。
做什么事情必須先有觀念,然后,付諸實現,做軟件則更進一步,必須將這些觀念結構化,即模型化。對復雜報表需求的處理,國內報表軟件廠商時下,用得最多的是類excel報表模型,即以單元格為中心報表模型,最早產品化的,是用友華表,當然它不屬于java陣營的,java陣營的現在有潤乾,finereport,杰表4.0,類excel報表模型大家都覺得,功能很強,但最大問題是,學習起來不方便,不知道你在大學里,微積分考多少,如果你90分以下,那你最好別碰那東西。
杰表.2008采用的復雜報表模型,相對來說,比excel模型容易得多,比如下圖是一個典型的復雜報表,該報表用于按不同分類方法
統計培訓學員人數,該表列上存在多個分組(培訓類型、累計培訓時間、參加培訓總人數、培訓內容、渠道類型),分組之間不存在嵌套關系的,即分組是并列的。行上存在一個按學員
行政級別為依據的分組。
復雜報表的復雜性在于結構復雜,比如上圖報表列上存在多個并列分組,不僅如此,行上也可能存在多個并行分組;不僅有多個并列分組,也可能各并列分組的嵌套數不一樣;不僅各個分組來源于同一個
數據集,也可能來自多個不同的數據集。
盡管如此,我們仍然可以把復雜的交叉報表,看作下圖所示的結構,表格包括A,B,C,D四部分,其中B,C是兩個表格,決定了交叉表的結構。B表格非常特殊,第一,該表格向右生長的,而一般我們常見向下生長,如C 表格。第二,該表格有多個并列分組,而一般報表工具中,表格對象最外圍只能有一個分組,盡管其嵌套數是可以多重的。
杰表.2008以上述結構分析為基礎,引入了超級表格對象,該對象就是通過嵌入兩個擴展方向不同的子表格,行頭表和列頭表,來完成交叉報表的結構性問題。兩表均可以有任意多的并列分組,每個分組可以有
層次不同的嵌套。下圖(a)是
設計面板中的超級表格對象,下圖(b)是該對象子部件的層次關系,其中對象3就是行頭表,對象4就是列頭表。
杰表的超級表格對象結合杰表的DOM報表數據模型,可以演化出任意復雜的多源,多組交叉表,下面試舉幾例說明之。(點擊進入查看)
列上并行分組交叉表
層次不等的交叉表
行列并行分組的交叉表
多數據集的交叉表
計算比去年增長數
計算比去年同期增長數
計算占比
顯示排名
按照匯總值排序的交叉報表
交叉表折頁處理
交叉表居中
一般java報表工具,允許用戶使用java類來作動態數據來源,但這個類必須符合工具要求的接口,如JasperReport的JRDataSource接口,杰表的BeanDataset接口。這種方式確實為用戶提供了一種在報表工具中使用java對象的途徑,但同時,因為需要實現特定接口,額外地增加了編碼工作。
有沒有一種不需要實現接口直接使用java對象的辦法呢?杰表.2008提供了這樣的方法。
假設你有下圖(a)所示的兩個類Student和Person,你可以使用Student的getMembers()方法,取得該學生的家庭成員列表,每個家庭成員用一個Person對象表示,該對象包含與該學生的關系,姓名,性別等信息。注意,這兩個類沒有實現任何額外的接口。

如果你有一個Student對象,那么,在杰表.2008中,你就可以做成如上圖(b)所示報表,上半部分列出該學生的本人信息,下面顯示該學生的家庭成員表。更多內容請參照:
使用java對象作數據源
使用java數組
java數組節點訪問
List,iterator數據源
嵌套的java對象數據源
ResultSet數據源
TableModel數據源
近年來,純java的類excel報表工具異軍突起,在國內報表工具市場中取得了初步成功。目前市場上主流的純java類excel的報表工具有潤乾、杰表4.0、finereport等。
類excel報表工具之所以受國人追捧,一方面是契合了國內用戶喜歡用格子做報表的習慣,另一方面,由于擴展的類excel報表模型的推出,比如潤乾的非線性多源分片模型,杰表4.0的超級cell模型,滿足了用戶編制復雜報表的需求。
然而,通過這幾年的應用,類excel報表工具的問題也大量暴露出來,主要集中在易用性和性能兩方面,根本原因在于類excel報表工具模型本身的不合理。用類excel報表模型去解決復雜報表需求,就像用十字鑼絲刀去開啟一字鑼絲一樣,雖然勉強能用,但終歸不是問題的正解。
現在,因為復雜報表需求概念被炒得火熱,幾乎每一個報表工具廠商都聲稱自己能做中國式的復雜報表,但你若追問一句,你們的報表工具好使嘛?需要多長時間能掌握?我估計百分之百啞口。
選用報表工具的目的是為了提高開發報表模塊的效率,如果報表工具學習起來困難,不易掌握,那么,雖然報表工具給你帶來了設計報表的便利,但也同時給你制造了不必要的學習障礙。在it企業人才流動頻繁的背景下,降低報表工具的學習難度,就等于降低項目的人工成本和風險,所以報表工具易用性是考量報表工具的一個重要指標。往極端了說,如果一個報表工具,需要有一個愛因斯坦的大腦才能使用,這樣的報表工具不用也罷。
用戶是上帝,當用戶有很多報表工具產品可供選擇之時,用戶對我們報表廠商提出了更高的要求,他們不會再滿足于問你能不能做,還會問你上手夠不夠快。面對如此新的市場要求,有些報表工具廠商沒有引起足夠重視,仍然延續著營銷亢奮,研發萎靡的做法,一個概念賣到低,不能不令人憂慮。杰表團隊堅信,一個好的產品只有持續地傾聽市場的聲音,并體現在我們提供的產品與服務上,才能取得持續的成功。
2003年,融合類excel模型的杰表推出市場,到2006年春,決定全面重寫杰表框架,停止一切主動的市場營銷活動。為什么要重寫框架呢?我們需要找到一種更易使用的報表模型。因為經過多年的市場檢驗,我們意識到類excel報表報表模型,不管是杰表4.0的超級cell模型還是潤乾的多源分片模型,都不能很好解決復雜報表問題。
類excel模型不易學習的根本原因是,沒有一個可視化的數據模型。所以你需要在非線性、多源分片、軸這些豪華概念的面前,費盡腦力。另外,采用單元格即數據的做法,完全違反了MVC的軟件哲學,使之報表工具的靈活性大受限制。總之,非線性多源分片技術確實很數學,但很不哲學。
2008年5月,經過持續兩年的潛心研發,杰表.2008正式面市。杰表.2008采用可視化的dom驅動報表模型,采用MVC架構,從根本上解決復雜報表工具學習難的問題。下圖是杰表.2008設計器中展現的可視化報表模型。更多內容參見 www.jatools.com
2009年10月15日
#
簡表(JOR),是一款開源的報表工具,完全java實現,核心代碼來自于國內一線報表工具品牌杰表.2008 。
提起開源的報表工具,不能不說說jaspereport,jasperreport作為著名的開源報表工具,在java程序員中一直享有盛名。但由于其設計主要是針對西式的簡單報表,設計起復雜的中式報表來,有點力不從心,所以,在國內的項目中能成功應用的例子并不多。JOR,作為能做復雜報表的開源報表工具,可以彌補jasperreport的不足。
下載地址:
http://www.jatools.com/jor
2009年9月25日
#
java實現的olap服務器,完全自主產權,純java實現. cube架構,性能優,占用空間小.
分析模型設計器
2009年9月2日
#
閑話少說,曬幾個杰表.2008的ppt截圖,希望有助于大家對報表工具的選擇.






2009年6月22日
#
jni 類型
簡單類型 primitive type
jni有8大基本類型, jboolean,jbyte,jchar,jshort,jint,jfloat,jlong,,jdouble
8位,16位,32位,64位,各兩個(在win32平臺中,其他平臺不一定)
java類型與c++數據類型的映射關系是如下:
jboolean <--> unsigned char
jchar <--> unsigned short
jshort <--> short
jfloat <--> float
jdouble <--> double
這是在 jni.h里定義的,為啥缺了jbyte,jint,jlong的映射呢?
答案是:sun在實現java虛擬機時,考慮到虛擬機可能運行在不同的操作系統和不同的硬件平臺上,比如,硬件平臺有8位,16位,32位,64位的區別,為了更好地與硬件平臺匹配,發揮最好的性能,將一些類型抽取出來,允許在不同的平臺上有不同的表示(位數),我們姑且稱之為硬件相關類型,jbyte,jint,jlong就屬于硬件相關類型。
舉列來說,如果你在32位機上,jint表示的是32bit的,而在64位機上,一般是64位即8個字節表示,也就是說,jbyte,jint,jlong在sun的虛擬機上,位數是不定的。
那位數不一定,怎么編譯? sun的方法是增加一個機器相關的jni_md.h文件,這里的md是machine dependent(機器相關)的意思。在win32平臺中,這三個類型的定義如下:
typedef long jint;
typedef __int64 jlong;
typedef signed char jbyte;
由此可見,在win32平臺中,jint是32位的,jlong是64位,jbyte是8位的.
指針類型 reference type
reference 準確的譯法,應該是引用,但引用實際上就是指針的一種偽裝,只不過更接近人的思維罷了。如果說,"爸爸的爸爸"是一種指針概念,那"爺爺"就是一種引用概念。
jni把類型分為兩大類,一個是簡單類型,一個是引用類型,下面是引用類型

從上圖似乎可以看出,所有引用類型,都從jobject 繼承,jarray又被幾個簡單類型的數組繼承.
但實際上這個對象層次,是一種假象,跟我們c++與java中看到的對象層次是有區別的,jobject與LPSTR(字符串指針),本質上沒有區別:
1. jobject, jclass,jstring,...等,所有對象,是指針,不是對象本身,而指針是不存在繼承關系的,“小狗”的指針,從“動物”的指針繼承,這種說法不成立。
2. jobject,jclass,jstring 是一種指針,不存在任何操作方法,好比你不能 LPCSTR->strlen(),在jni中,也沒有提供任何 jobject->something() 這種調用。
3. 對這些對象的操作必須依賴于 env對象的操作方法.
看一下,jni.h中對 這些引用對象的定義
class _jobject {};
class _jclass : public _jobject {};
class _jstring : public _jobject {};
...
typedef _jobject *jobject; //_jobject才是類定義,jobject 是否_jobject的指針
typedef _jclass *jclass;
typedef _jstring *jstring;
...
在這些下劃線對象中,有什么成員變量,成員函數呢? 答案是你什么也不能得到,比如,你想知道,_jstring對象的字符串長度,你不能 _jstring.length(),得到,而必須env->GetStringLength(jstring) 來得到.
只給你一個對象的指針,不告訴你里面有什么,這樣做的好處是實現與接口分離。
jvalue 這個類型,是一個union ,感覺很想com里的variant對象,不過沒有指明類型的field
typedef union jvalue {
jboolean z;
jbyte b;
jchar c;
jshort s;
jint i;
jlong j;
jfloat f;
jdouble d;
jobject l;
} jvalue;
我現在還不知道,這個數據類型,什么時候用.
jfieldID是一個java類成員變量的id,這個id在c++中,實際是一個指向結構的一個指針, jmethodID 是成員方法的id, 不管是成員變量還是方法的id,在java類被加載進虛擬機后,是保持不變的。所以從考慮性能計,可以使用靜態緩存的方法,先取出來,后面會講到
字符串類型
這里說的字符串類型,是jni中char * 的格式,不是指 jstring/_jstring,jni也使用 char * 字符串指針,
好下所示:
jmethodID GetMethodID (JNIEnv *env, jclass clazz, const char *name, const char *sig);
但需要注意的是,這里的name,必須是UTF-8的編碼,utf-8對于ascii字符,只占一個字節,最多不超過3個字節
2009年3月4日
#
通過圖片介紹java報表開發過程中,經常遇到的一些報表類型,統計圖,及可視化的設計等.下面以 杰表.2008 為例介紹之.
一、支持報表類型
主從報表

套打報表

標簽報表

分欄報表

計算比去年增長數

計算比去年同期增長數

補足空行的表格報表

多表合并.不同的數據集,做成一個相連的報表.

公式分組報表.按字段值,進行分類,分級

排行榜(Top N)報表

按匯總值大小排序的分組

多級分組

計算占比

顯示排名

交叉表折頁處理



層次不等的交叉表

行列并行分組的交叉表

多數據集的交叉表

靜態表格中的公式計算

二、javabean數據源
使用java數組
假設項目組其他成員已經編寫了一個Student類,如下圖(a),該類定義四個方法,分別獲取其姓名,年齡,性別,分數。由腳本構造一個包含三個Student對象的數組,如圖(b),要求你做成下圖(c)所示報表。

嵌套的java對象數據源
假設你有下圖(a)所示的兩個類Student和Person,你可以使用Student的getMembers()方法,取得該學生的家庭成員列表,每個家庭成員用一個Person對象表示,該對象包含與該學生的關系、姓名、性別等信息。

ResultSet數據源

指定sql查詢一個報表

三、統計圖與條碼
插入統計圖對象

設置統計圖背景及立體效果

設置統計圖輸出格式為Flash

從統計圖鉆取另一個明細報表
你可以在統計圖的某一個數據區放置一個超鏈接,使用戶雙擊該區時,跳轉到另一個子報表或網頁,如,有一個柱形圖,顯示各產品的庫存量,點擊某個產品的柱面,就可以打開該產品相關的銷售記錄。

餅圖

以時間為橫軸的統計圖

混合類型統計圖

雙軸統計圖

創建甘特圖

特殊統計圖








創建條形碼對象
日常生活中條形碼隨處可見,條形碼用幾何圖形表示數據,并可以被專門設備識別。杰表可支持的13種條形碼,分別是codabar、code39、code128、2of5、postnet、ean-128、ean-13、ean-8、upc-a、upc-e、royal-mail-cbc、pdf417、datamatrix,其中最后兩種是二維條形碼。
一維碼
二維碼 
設置圖片背景

顯示數據庫字段上的圖片

三、特殊的報表效果
凍結窗口效果

點擊表頭排序

使用超鏈接子報表
當你瀏覽報表時,可能需要了解更詳細的信息,比如,我們在瀏覽一個訂單列表時,希望了解該訂單中各貨物的銷售數量。這時,你可以在訂單列表中,加一個超鏈接,使用戶在點擊該鏈接后,可以跳轉到顯示該訂單明細的一個報表。
你可以在主表中,點擊訂單ID,即可瀏覽該訂單出售的所有貨物明細,如下圖所示:

熱點提示

復雜匯總

顏色警告

斑馬條

創建頁小計、頁累計報表

四、可視化設計器
設計參數表單
杰表.2008配備了一個可視化參數表單設計器,使用這個設計器,你可以不離開報表設計器環境,輕松制作查詢表單。表單設計器有豐富的web控件,檢驗,事件偵聽,css樣式機制,你也可以使用javascript腳本擴展表單功能,同時,也實現了常用的多個下拉框聯動功能。

可視化的報表設計器

報表預覽面板

2008年8月8日
#
本文試圖對市面上流行的純java實現的web報表工具,jasperreport 、 stylereport 、杰表、潤乾報表、快逸、finererport為例,分析各報表工具采用的web打印技術的異同、優劣、及對用戶需求的適應性,供大家參考。
打印是報表工具的基本功能之一,有些報表工具就是從一個專門的打印程序中發展而來,如用友華表。因為想當然地簡單,所以,在報表工具選型時用戶常常忽略這個問題,特別是有些報表工具廠商,明知自己的打印方案在滿足某些需求時,存在缺陷,但沒有盡明確告知義務,而故意事先做好花里胡哨的有關打印方面的文檔,欺騙客戶。我曾不至一次地聽說,有些開發商選用的報表工具,其打印功能不能滿足需求,不得不另外找打印工具的事情,實在是吃盡苦頭。
報表打印在c/s時代,確實非常簡單,vb,vc,Delphi,pb,都有很好用的打印api,有的甚至用報表控件方式,搞定打印更是分分秒的事情,但今天是b/s的天下,報表都是在網頁瀏覽器中顯示,但當今的瀏覽器打印功能一般非常弱(誰讓你叫他“瀏覽”器呢?“瀏覽”就是讓你用眼睛看,“打印”屬于兼職),要做到精確分頁打印,幾乎不可能,所以當前的報表工具,一般不會讓你使用瀏覽器的打印菜單來打印報表,都有自己的解決方案,這下可好,各報表工具廠商由是乎,八仙過海,各顯神通,各家都說自己的好,對于web打印了解不深的客戶,總有霧里看花的感覺。
歸納來說,當今java報表工具采用的打印技術不外乎三類:Applet打印、導出成pdf/excel打印、控件打印。用戶選用的重點是:盡量選擇插件小的打印軟件,因為文件小意味著安裝迅速,啟動速度快。插件大小除了插件本身的大小外,還需要考慮支持軟件的大小,如有些插件很小,支持軟件卻很大。
Applet打印
本文開始處提及的報表工具,除finereport外都支持Applet打印。之所以多數廠商支持Applet方式打印,因為Applet是java實現,與java后臺、java報表設計器的兼容性較好,代碼容易維護,實現也方便。然而,廠商省事,用戶就得多事。Applet方式打印,用戶最多的抱怨是需要安裝jre(而當前的操作系統,一般不是默認安裝的),雖然說,多數廠商已經做到可以自動安裝jre,但對于10幾M(JRE1.4有15M,JRE1.5為16M))的安裝,這意味著用戶需要較長時間的等待。
另一個問題是Applet配置復雜,使用不穩定。1995年,正是因為給人們無窮的視覺和腦力震蕩的Applet ,使人們認識了java,認識了Games Gosling。所以在b/s早期,人們為了展現html的富客戶效果,Applet是唯一之選。但現如今,Applet已經是昨日黃花,早已被ajax、flex取代,是什么原因?戰略層面的東西,我也不太說得清楚,但作為程序員,經過幾番折騰后,也不會愿意再用Applet了。如經常莫名其妙地出現“小應用程序,… notinited”的錯誤,還得清理ie緩存,對于Applet打印,還需要設置jre的安全策略等等。不是靠終端用戶能完成的,這就必須額外地增加開發商的服務成本。
Applet打印,啟動速度慢。Applet打印原理是,當你點擊打印按鈕時,瀏覽器啟動Applet,Applet根據參數訪問后臺頁面信息,后臺返回頁面,Applet加載頁面后,調用jre的打印服務進行打印。這就意味著,每次打印都需要調用后臺服務程序,就必然影響打印的響應速度。
Applet打印很安全,言下之意是ActiveX打印不安全,這是采用Applet打印的廠商津津樂道的,實際上,這是一個偽命題。Applet和ActiveX都是瀏覽器的插件,我們當然不希望下載插件后,該插件可以為所欲為,比如,刪除你磁盤里的文件,或啟動一個木馬,從這點來說,Applet確實比ActiveX安全,因為Applet是在一個受限的環境里運行,而ActiveX是不受限的。所以,當你訪問一個陌生的網站時,出于安全考慮,你可能會允許下載運行Applet,而阻止ActiveX。但當用戶訪問自己的網站系統,時,這種擔心就沒必要,這好比,當你與陌生人打交道時,很自然地會問自己,這人可信嘛?但如果你與家里人打交道,這個問題就不成其為問題了。
Applet打印,除了可以設置打印機,設置紙張頁面大小等常規打印功能外,往往也集成與打印不相關的功能,比如,打印前修改(有人說,是為了做假帳方便,中國特色,國產報表工具一般都具備,jasperreport,stylereport不支持),按行分頁,自由定位,這些本來由設計器完成的功能,挪到打印功能上來,來掩蓋上面指出的Applet的種種不足。實際上,Applet功能強弱完全取決于Applet的大小,有些報表廠商甚至用Applet或web start 的方式,提供所謂的基于web的報表設計,前提是下載 40多M的jar包,實際上,這種方案遠非一般意義上的純web 的報表設計,完全是混淆概念。作為用戶最希望常規的,他們熟悉的打印功能,不需要不相關的,理解困難的打印功能。
PDF/EXCEL打印
Pdf打印方式,就是用戶點擊打印后,瀏覽器會自動彈出adobe reader,再利用adobe的打印按鈕進行打印,由于國外adobe reader安裝非常普及,國外的java報表工具多提供這種打印方案,比如 stylereport,jasperreport,國內報表工具finereport也采用這種方式(讓人不解),pdf方式打印的好處是能做到精確打印,而且報表預覽與打印一氣呵成。但不足是需要在客戶的機子里,事先安裝有adobe reader,作為程序員,一般不太會有問題,因為程序員可能經常要瀏覽一些pdf文檔,多數已經裝了adobe reader,但國內的終端用戶,大多不知pdf是何物,更談不上安裝。
Pdf打印的另一個問題是必須彈出adobe reader,不能做到無預覽打印,這可能由于pdf缺少相應api的緣故吧。
輕量級的ActiveX打印
這里之所以強調“輕量級”,目的是與傳統意義上的ActiveX報表相區別。ActiveX技術可以說是報表工具家族里的沒落貴族,c/s時代,報表工具一般都被做成控件形式,水晶報表就是如此,在b/s時代,報表工具里仍然能看到ActiveX的身影,但風光大不如從前,如數巨,明宇,用友華表,inforeport。用ActiveX實現報表的不足,在網上你能輕易找到,在此不再詳述。ActiveX 報表雖深受詬責,但從打印功能來說,卻都是近乎完美,處理得卻非常好,非常穩定。
既然,ActiveX打印是長處,能不能揚長避短地使用ActiveX技術?有人提出這樣的問題。于是,有些廠商,比如杰表,采用了瀏覽時用html,打印時用插件的方式。這種方案的需要解決的問題是,ActiveX打印控件,不能太大,否則報表工具成了ActiveX報表了。
與Applet相比,輕量級ActiveX打印具有以下優勢:
1. 下載時間短,(大小是Applet的1/250);
2. 本地打印,打印時,不需要訪問后臺服務程序,不占用服務器資源;
3. 啟動速度快,由于控件小,且本地打印,所以打印速度是優于以上兩中打印方案,打印速度與你點擊瀏覽器打印菜單相差無幾。
采用輕量級的ActiveX打印的不足是,只有ie 5.5 及以上版本支持,其他版本的瀏覽器不支持。好在ie5.5瀏覽器已非常普及,在用戶那里應該不是大問題。
杰表采用的打印方案,用一個jatoolsPrinter的控件,大小是60k,是經過數字簽名的。這個打印控件采用ie特有的打印技術(templateprinter)實現打印功能,支持打印,預覽,邊距設置,重復打印,批量打印功能。
目前,jatoolsPrinter已經從杰表中獨立出來,任何報表工具或第三方軟件都利用該控件,實現web打印,推出至今,免費加收費用戶上萬。
下表總結三種方式的采用者及優劣對比,對于ie5.5客戶來說,我們推薦使用ActiveX打印方案.

報表廠商列表
jasperreport
Stylereport
杰表
潤乾
快逸
finererport
2008年7月29日
#
當我們使用報表工具,設計完一張報表時,我們同時必須為該報表設計一個查詢條件表單,使得用戶在瀏覽報表時,可以在網頁中選取查詢條件。在過去,設計表單是件令人沮喪的事情,這不僅要求你在報表設計器與開發環境之間來回切換,而且在設計表單時,還需要考慮系統的其他布局元素的關系,苦燥,繁瑣,沒有挑戰性。更進一步,如果項目要求最終用戶能夠自己設計報表,天吶,他們可能喜歡用報表設計工具來設計報表,但絕對不愿意用網頁設計工具來設計表單。
當然,也有一些報表工具,實現了參數表單的自動化,比如,按一定規則順序排列參數項,但這種自動化,用戶很難按其需求進行排版布局,所以不能徹底解決用戶的問題。
現在,杰表.2008配備了一個可視化參數表單設計器,使用這個設計器,你可以不離開報表設計器環境,輕松制作查詢表單。表單設計器有豐富的web控件,檢驗,事件偵聽,css樣式機制,你也可以使用javascript腳本擴展表單功能,同時,也實現了常用的多個下拉框聯動功能。
杰表.2008表單設計器不僅是表單設計工具的替代品,更重要的是表單設計器解決了報表設計容易,部署難的問題。我們希望,利用集成的表單設計器,你只要在設計器中設計好參數表單,并將報表模板文件和表單模板文件置于某個位置,你的用戶就可以在瀏覽器中,按條件瀏覽這張報表了,這中間不需要你再做任何其他事情。
有關表單設計的更多內容,點擊這里

2008年6月10日
#
作為java程序員,大家可能都聽說過,或用過birt, 據說,現在birt的東家actual,正式入駐中國市場,聯想到前些天杰表.2008的推出,今年,注定是國內的報表軟件市場不平靜的一年。
birt的最大好處是開源,不足是水土不服,做起復雜報表來不方便,復雜報表主要說的是行上,列上有多個并列分組的交叉報表,國產報表工具大都關注復雜報表需求,而洋品牌的報表軟件工具,如jasperreport,crystalreport,這方面關注不夠,所以做起復雜報表來很吃力。
做什么事情必須先有觀念,然后,付諸實現,做軟件則更進一步,必須將這些觀念結構化,即模型化。對復雜報表需求的處理,國內報表軟件廠商時下,用得最多的是類excel報表模型,即以單元格為中心報表模型,最早產品化的,是用友華表,當然它不屬于java陣營的,java陣營的現在有潤乾,finereport,杰表4.0,類excel報表模型大家都覺得,功能很強,但最大問題是,學習起來不方便,不知道你在大學里,微積分考多少,如果你90分以下,那你最好別碰那東西。
杰表.2008采用的復雜報表模型,相對來說,比excel模型容易得多,比如下圖是一個典型的復雜報表,該報表用于按不同分類方法
統計培訓學員人數,該表列上存在多個分組(培訓類型、累計培訓時間、參加培訓總人數、培訓內容、渠道類型),分組之間不存在嵌套關系的,即分組是并列的。行上存在一個按學員
行政級別為依據的分組。
復雜報表的復雜性在于結構復雜,比如上圖報表列上存在多個并列分組,不僅如此,行上也可能存在多個并行分組;不僅有多個并列分組,也可能各并列分組的嵌套數不一樣;不僅各個分組來源于同一個
數據集,也可能來自多個不同的數據集。
盡管如此,我們仍然可以把復雜的交叉報表,看作下圖所示的結構,表格包括A,B,C,D四部分,其中B,C是兩個表格,決定了交叉表的結構。B表格非常特殊,第一,該表格向右生長的,而一般我們常見向下生長,如C 表格。第二,該表格有多個并列分組,而一般報表工具中,表格對象最外圍只能有一個分組,盡管其嵌套數是可以多重的。
杰表.2008以上述結構分析為基礎,引入了超級表格對象,該對象就是通過嵌入兩個擴展方向不同的子表格,行頭表和列頭表,來完成交叉報表的結構性問題。兩表均可以有任意多的并列分組,每個分組可以有
層次不同的嵌套。下圖(a)是
設計面板中的超級表格對象,下圖(b)是該對象子部件的層次關系,其中對象3就是行頭表,對象4就是列頭表。
杰表的超級表格對象結合杰表的DOM報表數據模型,可以演化出任意復雜的多源,多組交叉表,下面試舉幾例說明之。(點擊進入查看)
列上并行分組交叉表
層次不等的交叉表
行列并行分組的交叉表
多數據集的交叉表
計算比去年增長數
計算比去年同期增長數
計算占比
顯示排名
按照匯總值排序的交叉報表
交叉表折頁處理
交叉表居中
2008年5月29日
#
一般java報表工具,允許用戶使用java類來作動態數據來源,但這個類必須符合工具要求的接口,如JasperReport的JRDataSource接口,杰表的BeanDataset接口。這種方式確實為用戶提供了一種在報表工具中使用java對象的途徑,但同時,因為需要實現特定接口,額外地增加了編碼工作。
有沒有一種不需要實現接口直接使用java對象的辦法呢?杰表.2008提供了這樣的方法。
假設你有下圖(a)所示的兩個類Student和Person,你可以使用Student的getMembers()方法,取得該學生的家庭成員列表,每個家庭成員用一個Person對象表示,該對象包含與該學生的關系,姓名,性別等信息。注意,這兩個類沒有實現任何額外的接口。

如果你有一個Student對象,那么,在杰表.2008中,你就可以做成如上圖(b)所示報表,上半部分列出該學生的本人信息,下面顯示該學生的家庭成員表。更多內容請參照:
使用java對象作數據源
使用java數組
java數組節點訪問
List,iterator數據源
嵌套的java對象數據源
ResultSet數據源
TableModel數據源
2008年5月20日
#
近年來,純java的類excel報表工具異軍突起,在國內報表工具市場中取得了初步成功。目前市場上主流的純java類excel的報表工具有潤乾、杰表4.0、finereport等。
類excel報表工具之所以受國人追捧,一方面是契合了國內用戶喜歡用格子做報表的習慣,另一方面,由于擴展的類excel報表模型的推出,比如潤乾的非線性多源分片模型,杰表4.0的超級cell模型,滿足了用戶編制復雜報表的需求。
然而,通過這幾年的應用,類excel報表工具的問題也大量暴露出來,主要集中在易用性和性能兩方面,根本原因在于類excel報表工具模型本身的不合理。用類excel報表模型去解決復雜報表需求,就像用十字鑼絲刀去開啟一字鑼絲一樣,雖然勉強能用,但終歸不是問題的正解。
現在,因為復雜報表需求概念被炒得火熱,幾乎每一個報表工具廠商都聲稱自己能做中國式的復雜報表,但你若追問一句,你們的報表工具好使嘛?需要多長時間能掌握?我估計百分之百啞口。
選用報表工具的目的是為了提高開發報表模塊的效率,如果報表工具學習起來困難,不易掌握,那么,雖然報表工具給你帶來了設計報表的便利,但也同時給你制造了不必要的學習障礙。在it企業人才流動頻繁的背景下,降低報表工具的學習難度,就等于降低項目的人工成本和風險,所以報表工具易用性是考量報表工具的一個重要指標。往極端了說,如果一個報表工具,需要有一個愛因斯坦的大腦才能使用,這樣的報表工具不用也罷。
用戶是上帝,當用戶有很多報表工具產品可供選擇之時,用戶對我們報表廠商提出了更高的要求,他們不會再滿足于問你能不能做,還會問你上手夠不夠快。面對如此新的市場要求,有些報表工具廠商沒有引起足夠重視,仍然延續著營銷亢奮,研發萎靡的做法,一個概念賣到低,不能不令人憂慮。杰表團隊堅信,一個好的產品只有持續地傾聽市場的聲音,并體現在我們提供的產品與服務上,才能取得持續的成功。
2003年,融合類excel模型的杰表推出市場,到2006年春,決定全面重寫杰表框架,停止一切主動的市場營銷活動。為什么要重寫框架呢?我們需要找到一種更易使用的報表模型。因為經過多年的市場檢驗,我們意識到類excel報表報表模型,不管是杰表4.0的超級cell模型還是潤乾的多源分片模型,都不能很好解決復雜報表問題。
類excel模型不易學習的根本原因是,沒有一個可視化的數據模型。所以你需要在非線性、多源分片、軸這些豪華概念的面前,費盡腦力。另外,采用單元格即數據的做法,完全違反了MVC的軟件哲學,使之報表工具的靈活性大受限制。總之,非線性多源分片技術確實很數學,但很不哲學。
2008年5月,經過持續兩年的潛心研發,杰表.2008正式面市。杰表.2008采用可視化的dom驅動報表模型,采用MVC架構,從根本上解決復雜報表工具學習難的問題。下圖是杰表.2008設計器中展現的可視化報表模型。更多內容參見 www.jatools.com