1. 程式人生 > >要!不要報表工具???

要!不要報表工具???

要,要,切克鬧,報表工具來一套!!!

要問什麼是報表工具?那我們先得掰扯掰扯什麼是報表。查一下某某百科……簡單的說,報表就是用表格、圖表等格式來動態顯示資料。可以用公式表示為:“報表 = 多樣的格式 + 動態的資料”。而報表工具呢?用廢話說,就是幫助使用者做報表的工具……不那麼廢的話,還是某某百科:報表工具就是幫助使用者用來展現自己輸入資料,更多時候是將資料庫中的資料,以客戶想要的方式即報表的形式展現出來。

報表的必要性,應該是不用討論了,無論在政府監管、企業運營還是一般的組織管理模式中,上級的監督考核、下級的彙報請示、平級的協同交流,都需要定時或不定時地傳遞一些報表,然後以這些報表為基礎進行分析統計。對應到資訊化工程的軟體開發專案中,報表功能也就是必不可少的了。而今天,我們要討論的,是要不要報表工具的問題,也就是用報表工具還是寫程式碼來實現報表,這才是個問題。

對於萬能的程式設計師來說,沒有什麼問題是一百行程式碼解決不了的,如果有,那就再來一百行……只不過,面對翻臉比翻書還快的需求、對外觀樣式的吹毛求疵、越來越複雜的報表格式和內在資料關係、越來越多需要維護的報表數量,尤其還不得不去修改隔壁的隔壁的隔壁老王寫的千百萬行程式碼時, 估計千言萬語都會化成一句:專業的事還是讓專業的人去幹吧。沒錯,報表工具就是專業的,而且可以專業到讓業務人員實現做報表,甚至構建快速系統。

讓我們先從一個簡單例子開始,下面是一個羅列所有學生資訊的報表:

imagepng

很簡單是不是?讓我們這些程式設計師擼起袖子馬上幹,就從熟悉的 java 開始吧……

首先是通過資料來源,連線資料庫提取資料。

public static void main(String\[\] args) throws IOException, ParseException

 {

 _showTable_("org.hsqldb.jdbcDriver", "jdbc:hsqldb:hsql://127.0.0.1/demo", "sa", "", "student");

 }

 public  static  DefaultTableModel getTableModel(String driver, String url, String user, String pwd, String tableName)

 {

 String sql = String._format_("select * from %s", tableName);

String\[\] colNames = null;

Object\[\]\[\] tabValues = **null**;

 try

 {

 Class._forName_(driver).newInstance();

 Connection conn = DriverManager._getConnection_(url, user, pwd);

 Statement stat = conn.createStatement();

 ResultSet rs = stat.executeQuery(sql);

 ResultSetMetaData rsmd = rs.getMetaData();

   if  (rsmd != null && rsmd != null)

 {

 ……省略n行程式碼

 }

 valList.add(row);

 }

tabValues =   new  Object\[valList.size()\]\[\];

 valList.toArray(tabValues);

 }

 }

  catch  (Exception e)

 {

 throw  new RuntimeException(e.getMessage(), e);

 }

 return  new DefaultTableModel(tabValues, colNames);

 }

 ……省略n+1行程式碼

然後就是直接建立各種樣式標籤,以報表樣式展現資料:

//生成表樣式:

String styleName = name;

 if( isSub ) {

 int subPos = styleName.indexOf( "\_sub\_" );

  if ( subPos > 0 ) styleName = styleName.substring( 0, subPos );

 }

HashSet srcs = new HashSet();

 int rr = report.getRowCount();

 int cc = report.getColCount();

 for( int row = 1; row <= rr; row++ ) {

 for( short col = 1; col <= cc; col++ )

 {

 ……省略一堆程式碼

 }

//生成標題區和上表頭區

append( sb, "<td>\\n" );

append( sb, "<div id=\\"" \+ name + "_topdiv\\" style=\\"overflow:hidden\\">\\n" );

generateHtml( "_$_top", topStartRow, topEndRow, contentStartCol, contentEndCol, sb );

append( sb, "</div>\\n" );

append( sb, "</td>\\n" );

append( sb, "</tr>\\n" );

 }

append( sb, "<tr>\\n" );

 if ( leftHeader != null ) { 

//生成左表頭區

append( sb, "<td valign=top>\\n" );

append( sb, "<div id=\\"" \+ name + "_leftdiv\\" style=\\"overflow:hidden\\">\\n" );

generateHtml( "_$_left", contentStartRow, contentEndRow, leftHeader.getBeginCol(), leftHeader.getEndCol(),

  sb );

append( sb, "</div>\\n" );

append( sb, "</td>\\n" );

 }

//生成報表主體資料區

append( sb, "<td>\\n" );

append( sb, "<div id=\\"" \+ name + "\_contentdiv\\" style=\\"overflow:auto\\" onscroll=\\"\_reportScroll( '" \+ name + "' )\\">\\n" );

generateHtml( "", contentStartRow, contentEndRow, contentStartCol, contentEndCol, sb );

append( sb, "</div>\\n" );

append( sb, "</td>\\n" );

append( sb, "</tr>\\n" );

append( sb, "</table>\\n" );

append( sb, "</div>\\n" );

append( sb, "<script type=\\"text/javascript\\" language=javascript>\\n" );

還好,還好,這種橫平豎直的表格樣式處理起來還不算太難,不過,事情就這麼完了嗎?你想的太簡單了。

接下來,教務處要求學生按照班級進行分組,校運會辦公室要求把男女生分別用顏色標識出來,而醫務處做健康調查需要知道各個班級的平均年齡,也就是需要下面三種不同的報表:

imagepng

imagepng

imagepng

怎麼樣,想好了用程式碼怎麼實現麼?沒錯,我們需要在提取原始資料時考慮用資料庫的分組以及平均值,或者在取出資料後自己進行排序分組和求平均,然後按照需求算好表格的合併關係,設定不同的判斷條件……標紅應該還好,只需要在輸出每行表格的時候判斷一下性別欄位,然後設定背景色……

現在還能應付?好吧,喘一口氣,看看我們並不陌生的“大招”:

這樣的對學校工作人員及老師分類彙總的統計表:

imagepng

這樣的分類分組彙總統計表:

imagepng

這樣的學生參加奧數競賽的申請表……好吧,我也不知道應該算什麼的“中國式”複雜報表

imagepng

好了,現在回頭看看,那張簡單報表的單純的樣子,是不是有一種“誘騙”我們邁入陷阱的味道?而如果當初我們選擇了合適的報表工具,事情就會變成這樣:

imagepng

簡單的清單報表:

imagepng

簡單新增一個分組函式後的分組報表:

標紅特殊行,選中行在表示式中寫入背景色表示式即可:

imagepng

簡單新增平均函式後分組報表:

imagepng

以及不知道算不算複雜式的報表:

imagepng

可以看到,報表工具在實現這些需求的時候,最主要的特點就是兩個字:直觀!不僅資料的提取簡單清晰,放置的位置所見即所得,內容的延展方向也都清楚明白。——談錢不傷感情,正因為報表工具開發直觀,所以從此可以不再需要年薪 N 萬的專業程式設計師和 TA 那一片片程式碼了,這是分分鐘又為公司省下了多少錢呀??!!

其實除了上面提到“大招”,還有很多程式設計師不願面對或懶於面對的需求,比如各種統計圖表、條形碼、業務類的報表;比如匯出 PDF、XLS、DOC 等各種常用文件格式;比如和機器紙張密切相關的自適應列印輸出……

嗯,對了,報表中可能還要線上填寫某些資料,填寫介面還要足夠友好…

天哪,這麼多麻煩事兒,(領導 / 客戶)你咋不上天呢??

幸運的是,如果你選擇了報表工具,你真的就可以上天入地了……報表工具的優勢除了開發高效外,另一個重要的亮點就是可以有效降低耦合性,就算報表需求頻繁改變,沒完沒了,只要通過報表工具將報表模組獨立出來,即便應用專案上線了也只需替換報表檔案,不必重新打包部署、不必重啟服務,完全可以實現不停機熱切換,甚至可以由維護人員去做。

看看下面的結構圖是不是好理解多了?

imagepng

綜上所述,要寫程式碼還是要報表工具這個問題的答案還用想嗎?萬能的專業程式設計師應該用在更需要 TA 的地方,萬萬不能浪費在已經有了成熟解決方案的報表製作上面。一開始想的太簡單,後面就會大大不簡單,一開始確認對了眼神,就會找到對的人。



作者:qxyzyh
連結:http://c.raqsoft.com.cn/article/1540259495503?r=xiaohuihui
來源:乾學院
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。