Welcome! 登入 註冊
美寶首頁 美寶百科 美寶論壇 美寶落格 美寶地圖

Advanced

在複雜報表面前,我終於放棄了Excel!

Posted by frlily 
在複雜報表面前,我終於放棄了Excel!

分類標籤: 資訊  Excel  報表  報表軟體  報表工具
「資料要多久整理好?」
「報表什麼時候出來」
「來,這張報表幫我做個分析」
……
相信這些話,是表哥表姐最不想聽到的「魔咒」吧!

我当初剛大學畢業,作爲一名新手來説,統計資料是每天的工作標配。可別人十幾分鐘就能輕鬆搞定的事情,我常常需要幾個小時才能勉強完成。

剛開始,我以為自己只是不熟練,多做幾次就好了。可悶頭苦練了一個周,我還是全組最慢的那個,每天被催到懷疑人生。
「就差你的了,複製粘上,再統計一下就好啦,怎麼搞得這麼慢!」漸漸地,我察覺到,領導開始質疑我的工作能力了。
我也一肚子苦水啊,好歹我也算半個開發,會寫sql,會java,明明是BI工程師,卻被招來每天忙活Excel這個破軟體,簡直懷疑人生。

如何快速高效的製作企業數據[url=http://www.finereport.com/tw/]報表[/url]呢,請教了很多大大,要麼碼程式碼開發,要麼開源/用現成的[url=http://www.finereport.com/tw/]報表軟體[/url]。

果然用報表軟體是絕佳的選擇,自從部署了FineReport報表後,整個報表開發部,只要敲幾下鍵盤,點幾下滑鼠,就輕鬆地把整個表格順利完成。全過程自動化,視覺化非常酷炫,科技就是生產力啊!

[img]http://www.finereport.com/tw/wp-content/themes/BusinessNews/images/2019/02/tw-190219/2019021902Y.jpg[/img]

[img]http://www.finereport.com/tw/wp-content/themes/BusinessNews/images/2019/02/tw-190219/2019021903Y.jpg[/img]


這麼好的神器,當然要推薦給大家!

[color=#0000ff][b]要問什麼是報表工具?那我們先説説什麼是報表。[/b][/color]

查一下google……簡單的說,報表就是用表格、圖表等格式來動態顯示資料。可以用公式表示為:「報表 = 多樣的格式 + 動態的資料」。

而報表工具呢?就是幫助使用者做報表的工具,幫助用來展現自己輸入的資料,更多時候是將數據庫中的數據,以客戶想要的方式即報表的形式展現出來。

報表的必要性,應該是不用討論了。只要有企業,就會產生報表,最普通不過的就是財務報表了,還有各種計劃報表,成本核算報表,成本分析報表。無論在政府監管、企業營運還是一般的組織管理模式中,上級的監督考核、下級的彙報請示、平級的協同交流,都需要定時或不定時地傳遞一些報表,然後以這些報表為基礎進行分析統計。

對應到資訊化工程的軟體開發專案中,報表功能也就是必不可少的了。而今天,我們要討論的,是要不要報表工具的問題,也就是用報表工具還是寫程式碼來實現報表,這才是個問題。

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

以一個簡單的例子來講解。
假設我們要做一張羅列所有學生資訊的報表:

[img]http://www.finereport.com/tw/wp-content/themes/BusinessNews/images/2019/02/tw-190219/2019021904Y.jpg[/img]

很簡單是不是?讓我們這些程式設計師擼起袖子馬上干,就從熟悉的 java 開始吧……
首先是通過數據源,連接資料庫提取數據。

[i]Source code        
public static void main(String[] args) throws IOException, ParseException{_showTable_(, , , , );}public static DefaultTableModel getTableModel(String driver, String url, String user, String pwd, String tableName){String sql = String._format_(, 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){[/i]


……省略n列代码


[i]Source code        
}
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);}[/i]


……省略n+1列代碼

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

//生成表樣式:



[i]Source code        
String styleName = name;if( isSub )
{int subPos = styleName.indexOf( );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++ ){[/i]


……省略一堆代碼

}


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



[i]Source code        
append( sb, );
append( sb, _topdiv\overflow:hidden\ );
generateHtml( , topStartRow, topEndRow, contentStartCol, contentEndCol, sb );append( sb, );append( sb, );append( sb, );}append( sb, );if ( leftHeader != null ) {[/i]


//生成左表頭區



[i]Source code        
append( sb, );
append( sb, _leftdiv\overflow:hidden\ );
generateHtml( , contentStartRow, contentEndRow, leftHeader.getBeginCol(), leftHeader.getEndCol(),sb );
append( sb, );
append( sb, );}[/i]


//生成報表主體資料區



[i]Source code        
append( sb, );
append( sb, _contentdiv\overflow:auto\_reportScroll( )\
);
generateHtml( , contentStartRow, contentEndRow, contentStartCol, contentEndCol, sb );append( sb, );
append( sb, );append( sb, );append( sb, );append( sb, );append( sb, text/javascript\ );[/i]


還好,還好,這種橫平豎直的表格樣式處理起來還不算太難,不過,事情就這麼完了嗎?你想的太簡單了。
接下來,教務處要求學生按照班級進行分組,校運會辦公室要求把男女生分別用顏色標識出來,而醫務處做健康調查需要知道各個班級的平均年齡,也就是需要下面三種不同的報表:

[img]http://www.finereport.com/tw/wp-content/themes/BusinessNews/images/2019/02/tw-190219/2019021905Y.jpg[/img]
[img]http://www.finereport.com/tw/wp-content/themes/BusinessNews/images/2019/02/tw-190219/2019021906Y.jpg[/img]
[img]http://www.finereport.com/tw/wp-content/themes/BusinessNews/images/2019/02/tw-190219/2019021907Y.jpg[/img]

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

現在還能應付?好吧,喘一口氣,看看我們並不陌生的「大招」:
這樣的對學校工作人員及老師分類匯總的統計表:

[img]http://www.finereport.com/tw/wp-content/themes/BusinessNews/images/2019/02/tw-190219/2019021908Y.jpg[/img]

這樣的分類分組縂統計表:

[img]http://www.finereport.com/tw/wp-content/themes/BusinessNews/images/2019/02/tw-190219/2019021909Y.jpg[/img]

這樣的學生參加數學競賽的申請表……好吧,我也不知道什麽應該算複雜報表

好了,現在回頭看看,那張簡單報表的單純的樣子,是不是有一種「誘騙」我們邁入陷阱的味道?而如果是用報表工具FineReport,事情就會變成這樣:
[img]http://www.finereport.com/tw/wp-content/themes/BusinessNews/images/2019/02/tw-190219/2019021910Y.jpg[/img]
簡單的清單報表:
[img]http://www.finereport.com/tw/wp-content/themes/BusinessNews/images/2019/02/tw-190219/2019021911Y.jpg[/img]

簡單添加一個分組函式後的分組報表:

標紅特殊列,選中列在表達式中寫入背景色表達式即可
簡單添加平均函式後分組報表:
[img]http://www.finereport.com/tw/wp-content/themes/BusinessNews/images/2019/02/tw-190219/2019021912Y.jpg[/img]

以及不知道算不算複雜式的報表:
[img]http://www.finereport.com/tw/wp-content/themes/BusinessNews/images/2019/02/tw-190219/2019021913Y.jpg[/img]


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

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

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

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

看看下面的結構圖是不是好理解多了?
[img]http://www.finereport.com/tw/wp-content/themes/BusinessNews/images/2019/02/tw-190219/2019021914Y.jpg[/img]

綜上所述,要寫程式碼還是要報表工具這個問題的答案還用想嗎?

萬能的專業程式設計師應該用在更需要 TA 的地方,萬萬不能浪費在已經有了成熟解決方案的報表製作上面。一開始想的太簡單,後面就會大大不簡單,一開始確認過眼神,就會遇到對的人。

軟體可免費下載體驗:[url=http://www.finereport.com/tw/]www.finereport.com/tw/[/url]



Edited 1 time(s). Last edit at 04/28/2019 03:53PM by frlily.
(編輯記錄)