陶曉峰 ,彭釗軼 ,陳 琪
(1.東南大學軟件學院 江蘇 南京 210096;2.國電南瑞科技股份有限公司 江蘇 南京 210061)
隨著電力體制改革的不斷深入,各電力部門對生產數據要求也越來越高,尤其是電量數據,因為直接關系到用戶結算等方面的需求,所以如何從大量的數據中快速、高效、準確地提取用戶需要的數據,形成特定格式的報表,成為了用戶的基本需求。同時報表還擔負著信息發布和交互數據的功能[1,2]。
由于現在的報表產品大部分是基于商業目的,其通用性比較強、相對獨立,但是對于具體的業務系統來說還是有很大的局限性,不能基于現有的應用平臺。本報表系統針對電量計量生產系統的特點,基于已有系統的平臺采用面向用戶的設計器,把業務數據抽象化、圖形化,使用戶能靈活、方便地設計出各種形式的電子表格。
現在電量計量系統采用的硬件平臺大都是基于UNIX/Windows的混合平臺,相應就要求報表系統也能跨平臺運行,本文設計的報表系統是基于J2EE平臺上采用Java語言編寫的,實現了跨平臺運行的要求[3]。
本報表系統采用了基于J2EE架構的三層技術,分為數據服務層、應用服務層、客戶層,如圖1所示。報表設計器(客戶層)提供良好的人機交互界面,采用的是類Excel的設計風格;應用服務層封裝系統業務邏輯數據,提供數據引擎,這樣既使服務邏輯和業務邏輯分離,又可以提高獲取數據的效率,實現系統業務的組件化,有效提高程序的復用性;數據服務層一般采用商用數據庫,封裝一些數據對象接口給應用服務層。系統通過J2EE平臺的Web容器對外發布報表,用戶直接在客戶機上通過IE等瀏覽器就可以查看和下載報表[1,4]。

圖1 報表系統架構
由于本報表設計器采用Java Swing編寫的類Excel的設計風格[5],使得用戶對報表設計器的使用不是那么陌生,增加了親和力,報表支持導入/導出Excel文件,設計器能完全兼容Excel包括Cell格式、公式、圖表等在內的大部分內容,并能支持多Sheet方式,包括Sheet間的互相引用等功能。最重要的是設計器本身針對電量計量系統的業務進行了抽象和概括,首先利用電力系統CIM模型把電網模型樹形化,這樣能使用戶能快速定位到需要定義的設備上。其次對每種數據業務進行了分析歸納,根據數據的時間屬性分成歷史數據、統計數據、區間統計數據等幾個大類,用戶可根據自己的需求定義不同的數據屬性,采用這種圖形化和用戶能理解的描述語言相結合的方式,使報表工具能真正做到面向用戶,在用戶不需要了解具體的數據結構的前提下也能輕松定義出自己需要的數據。報表設計器還支持按單元格定義的方式能讓用戶最大程度的靈活組織自己的報表形式,提高了報表系統的靈活性和實用性。
該報表系統與傳統報表最大的不同是實現了報表真正的模版化,因為電量計量系統的數據不是實時的,而是帶時標采集的,采集的數據有可能是前幾天的歷史數據,用傳統的報表預先生成好報表并不能滿足要求。本文設計的報表是定義完模版后,預先并不生成好報表,而是用戶需要時系統根據用戶輸入的條件實時地去數據庫中抽取數據形成報表。為了實現這種動態靈活的模版技術,如何描述數據屬性定義是報表設計器的關鍵技術之一,本報表系統采用了面向對象的技術,把每個Cell里定義的數據屬性封裝成一個對象,這個對象描述了要查詢數據的類型、查詢的相對時間、顯示格式等所有信息,在保存報表的時候把對象轉化成文本描述存到對應的Cell里,當打開報表時根據每個Cell里的文本描述去逆向生成一個個對象[6]。這些對象結合用戶輸入的查詢條件通過后臺服務從數據庫中讀取數據。取完數據后根據各個對象中的一些格式屬性把數據回填到報表中。采用這種面向對象技術后,對以后增加數據種類非常方便,體現了良好的擴展性。報表模版可以保存在本地硬盤,也可以發布到數據庫中,發布后在其他客戶機或者其他瀏覽器上就可以瀏覽模版,如圖2所示。

圖2 報表模版流程示意圖
報表系統的查詢是基于J2EE平臺,中間層采用sessionBean技術,抽取數據采用DAO+EJB方式,通過后臺已經封裝好的數據接口提取數據,由于一些不同類型的數據可以通過一次封裝取出,報表在查詢數據時采用全局優化的歸納算法,對一些對象采取合并查詢,提高了查詢效率。查詢出的數據回填到對應的Cell中,若有的Cell中定義了公式,由報表設計器根據回填的相關數據自動進行相應的公式計算,顯示計算后的數據;并能提供各種圖形顯示,提供比較直觀的變化趨勢,便于決策者提供分析。
由于現在系統大都是基于B/S結構的,用戶都習慣于直接通過瀏覽器查看報表,報表系統的Web發布采用是JSP+Servlet方式,由用戶通過輸入查詢的時間,由后臺實時地生成報表,并能生成HTML、Excel等多種格式,同時還支持報表緩存方式,加快了用戶瀏覽的速度。由于電量計量的數據是比較敏感的,報表系統有嚴格的權限控制,報表在發布的時候可以選擇那些用戶有權限查看報表[7]。
報表系統也實現了一些自動化功能,報表系統會根據用戶需求按月、天、小時自動生成指定的報表,也可以按預先設計好的分頁線自動打印出來,或者按照自適應紙張來打印,比如一些每天要出的一些匯總報表就可以定時在用戶上班前打印好,用戶上班就能看到自己需要的報表。
一般報表只能提供相對固定的報表,而由于用戶需求的不斷變化,加上大量的報表模版,對報表模版的修改也會變得很頻繁,造成后期的維護非常困難,所以報表系統針對特殊業務提供了智能模版的設計功能,智能模版功能預先定義好一些典型的模版格式,系統就可以根據用戶輸入的參數自動套用不同的模版動態生成報表,需求變了只需要修改模版就行了,這樣大大減少了用戶的工作量。
本文設計并實現了基于J2EE平臺的報表系統,充分結合了電量計量生產系統的特點,設計了能讓用戶自己定義數據的圖形化界面,并能將做好的報表模版方便地在Web上發布,這個報表系統已經成為了計量系統中不可或缺的模塊,已經在多個現場系統中得到了充分運用[8]。
[1] 路 廣,王永福,張伯明,等.基于UNIX/Linux的電力市場綜合報表系統[J].電力系統自動化,2002,26(14):31-33.
[2]石光亮,王 拓,戈長青,等.電力生產信息統計報表生成器的設計與實現 [J].電力系統自動化,2003,27(21):86-88.
[3] 涂翔云.J2EE權威指南[M].北京:中國電力出版社,2002.
[4]閔 濤,嚴小文,李 捷,等.基于J2EE架構的新一代電能量計量系統[J].電力系統自動化, 2003,27(22):85-87.
[5]王 鵬,何昀峰.Java Swing圖形界面開發與案例詳解[M].北京:清華大學出版社,2008.
[6]孫衛琴.Java面向對象編程[M].北京:電子工業出版社,2006.
[7]張洪斌.WebLogic Server系統管理和程序開發指南[M].北京:機械工業出版社,2005.
[8] (美)Marty Hall,Larry Brown.Servlet與 JSP 核心編程[M].趙學良,譯.北京:清華大學出版社,2004.