對于一款軟件或產品,尤其是一些企業級應用的IT軟件,是不可能滿足所有需求的。尤其是針對業務化的產品需求,某些個性化的需求就要進行二次開發。二次開發需要API接口,無論是什么樣的開發,開發人員都需要對開發的產品大內部結構有所了解。在應用廣泛的企業報表領域,開發在所難免,下圖展示了我在工作中開發的FineReport的內核示意圖。

這款類似于Excel的報表軟件,成為設計器。在設計器中新建一個工作薄就是建了一個WorkBook,WorkBook相當于一個容器,里面可以放任意個WorkSheet,就相當于在設計器的一個工作薄中新建了多個sheet。每個WorkSheet是由任意個單元格CellElement組成,因此CellElement是一個模板的最小元素。獲得WorkBook后,必須取得其中的某個WorkSheet才能對這個報表中的CellElement進行操作,這對于模板還是結果都是一樣的,如果以模板為例,最基本的內核結構就是如下面這張圖
由于每個部分各自包含了很多屬性,比如可以設置單元格的前景、背景、邊框、字體、字號等;又比如每個WorkSheet中可以添加,刪除單元格、可以設置每個sheet的頁面屬性、可以給每個sheet中添加圖表懸浮元素等;再比如可以對WorkBook進行執行獲得結果并導出成各種格式、可以進行打印、添加工具欄等等。
正是基于這樣,再開發時會有豐富的API接口可供調用。以下是FineReport包含的所有開放的API。
由圖可有看出,對于這樣的開發可以從以下幾個功能點進行開發。
報表數據源
設計器本身已經提供了數據庫數據源、文本數據源、xml數據源等多種數據來源方式,同時還可以通過java程序自行生成數據來源,只需要實現TableData接口便可以了。
輸入輸出報表
在程序中新建一個報表對象同時也可以直接讀取一個cpt模板來生成,經過處理的報表最終可以導出成多種形式,可以保存為程序網絡報表在web端直接訪問,也可以導出為excel、pdf、word、cpt等多種格式文件。
設置單元格屬性及報表屬性編輯
可以對報表對象的單元格屬性、web屬性、參數、頁面設置等多個屬性進行控制,可以自由控制單元格的顯示樣式、工具欄的按鈕、參數面板的展示、參數的賦值等等。
自定義填報
開放的填報api接口能夠根據自己的需要來定義填報入庫方式,通過填報接口,可以往數據庫中保存用戶操作日志、在填報成功與失敗時進行各種處理等等。
開發的工作雖枯燥也有意思,閑來無事時也會開發一些有趣的應用,比如下圖把天氣集成到報表頁面。
