“數(shù)據(jù)還要多久整理好?”
“報(bào)表什么時(shí)候出來”
“來,這張報(bào)表幫我做個(gè)分析”
……
相信這些話,是表哥表姐最不想聽到的“魔咒”吧!
小編我大學(xué)剛畢業(yè),作為一個(gè)小白,統(tǒng)計(jì)數(shù)據(jù)是每天的工作標(biāo)配。可別人十幾分鐘就能輕松搞定的事情,我常常需要幾個(gè)小時(shí)才能勉強(qiáng)完成。
剛開始,我以為自己只是不熟練,多做幾次就好了。可悶頭苦練了一個(gè)周,我還是全組最慢的那個(gè),每天被催到懷疑人生。
“就差你的了,復(fù)制粘貼,再統(tǒng)計(jì)一下就好啦,怎么搞得這么慢!”漸漸地,我察覺到,領(lǐng)導(dǎo)開始質(zhì)疑我的工作能力了。
我也一肚子苦水啊,好歹我也算半個(gè)開發(fā),會寫sql,會java,明明是BI工程師,卻被招來每天忙活Excel這個(gè)破軟件,簡直懷疑人生。
如何快速高效的制作企業(yè)數(shù)據(jù)報(bào)表呢,請教了很多大神,要么碼代碼開發(fā),要么開源用/現(xiàn)成的報(bào)表軟件。
果然用報(bào)表軟件是絕佳的選擇,自從部署了rFineReport報(bào)表 – 專業(yè)的企業(yè)級Web報(bào)表工具后,整個(gè)報(bào)表開發(fā)部,只要敲幾下鍵盤,點(diǎn)幾下鼠標(biāo),就輕松地把整個(gè)表格順利完成。全過程自動(dòng)化,可視化還酷炫的一米,科技就是生產(chǎn)力啊!
這么好的神器,當(dāng)然要推薦給大家!
要問什么是報(bào)表工具?那我們先得扯扯什么是報(bào)表。
查一下某百科……簡單的說,報(bào)表就是用表格、圖表等格式來動(dòng)態(tài)顯示數(shù)據(jù)。可以用公式表示為:“報(bào)表 = 多樣的格式 動(dòng)態(tài)的數(shù)據(jù)”。
而報(bào)表工具呢?就是幫助用戶做報(bào)表的工具,幫助用來展現(xiàn)自己輸入的數(shù)據(jù),更多時(shí)候是將數(shù)據(jù)庫中的數(shù)據(jù),以客戶想要的方式即報(bào)表的形式展現(xiàn)出來。
報(bào)表的必要性,應(yīng)該是不用討論了。只要有企業(yè),就會產(chǎn)生報(bào)表,最普通不過的就是財(cái)務(wù)報(bào)表了,還有各種計(jì)劃報(bào)表,成本核算報(bào)表,成本分析報(bào)表。無論在政府監(jiān)管、企業(yè)運(yùn)營還是一般的組織管理模式中,上級的監(jiān)督考核、下級的匯報(bào)請示、平級的協(xié)同交流,都需要定時(shí)或不定時(shí)地傳遞一些報(bào)表,然后以這些報(bào)表為基礎(chǔ)進(jìn)行分析統(tǒng)計(jì)。
對應(yīng)到信息化工程的軟件開發(fā)項(xiàng)目中,報(bào)表功能也就是必不可少的了。而今天,我們要討論的,是要不要報(bào)表工具的問題,也就是用報(bào)表工具還是寫代碼來實(shí)現(xiàn)報(bào)表,這才是個(gè)問題。
對于萬能的程序員來說,沒有什么問題是一百行代碼解決不了的,如果有,那就再來一百行……只不過,面對翻臉比翻書還快的需求、對外觀樣式的吹毛求疵、越來越復(fù)雜的報(bào)表格式和內(nèi)在數(shù)據(jù)關(guān)系、越來越多需要維護(hù)的報(bào)表數(shù)量,尤其還不得不去修改隔壁的隔壁的隔壁老王寫的千百萬行代碼時(shí), 估計(jì)千言萬語都會化成一句:專業(yè)的事還是讓專業(yè)的人去干吧。沒錯(cuò),報(bào)表工具就是專業(yè)的,而且可以專業(yè)到讓業(yè)務(wù)人員實(shí)現(xiàn)做報(bào)表,甚至構(gòu)建快速系統(tǒng)。
以一個(gè)簡單的例子來講解。
假設(shè)我們要做一張羅列所有學(xué)生信息的報(bào)表:
很簡單是不是?讓我們這些程序員擼起袖子馬上干,就從熟悉的 java 開始吧……
首先是通過數(shù)據(jù)源,連接數(shù)據(jù)庫提取數(shù)據(jù)。
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) { ……省略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行代碼 然后就是直接創(chuàng)建各種樣式標(biāo)簽,以報(bào)表樣式展現(xiàn)數(shù)據(jù): //生成表樣式: 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 ) { ……省略一堆代碼 } //生成標(biāo)題區(qū)和上表頭區(qū) append( sb, ); append( sb, _topdivoverflow:hidden ); generateHtml( , topStartRow, topEndRow, contentStartCol, contentEndCol, sb ); append( sb, ); append( sb, ); append( sb, ); } append( sb, ); if ( leftHeader != null ) { //生成左表頭區(qū) append( sb, ); append( sb, _leftdivoverflow:hidden ); generateHtml( , contentStartRow, contentEndRow, leftHeader.getBeginCol(), leftHeader.getEndCol(), sb ); append( sb, ); append( sb, ); } //生成報(bào)表主體數(shù)據(jù)區(qū) append( sb, ); append( sb, _contentdivoverflow:auto_reportScroll( ) ); generateHtml( , contentStartRow, contentEndRow, contentStartCol, contentEndCol, sb ); append( sb, ); append( sb, ); append( sb, ); append( sb, ); append( sb, ); append( sb, text/javascript );
還好,還好,這種橫平豎直的表格樣式處理起來還不算太難,不過,事情就這么完了嗎?你想的太簡單了。
接下來,教務(wù)處要求學(xué)生按照班級進(jìn)行分組,校運(yùn)會辦公室要求把男女生分別用顏色標(biāo)識出來,而醫(yī)務(wù)處做健康調(diào)查需要知道各個(gè)班級的平均年齡,也就是需要下面三種不同的報(bào)表:
怎么樣,想好了用代碼怎么實(shí)現(xiàn)么?沒錯(cuò),我們需要在提取原始數(shù)據(jù)時(shí)考慮用數(shù)據(jù)庫的分組以及平均值,或者在取出數(shù)據(jù)后自己進(jìn)行排序分組和求平均,然后按照需求算好表格的合并關(guān)系,設(shè)置不同的判斷條件……標(biāo)紅應(yīng)該還好,只需要在輸出每行表格的時(shí)候判斷一下性別字段,然后設(shè)置背景色……
現(xiàn)在還能應(yīng)付?好吧,喘一口氣,看看我們并不陌生的“大招”:
這樣的對學(xué)校工作人員及老師分類匯總的統(tǒng)計(jì)表:
這樣的分類分組匯總統(tǒng)計(jì)表:
這樣的學(xué)生參加奧數(shù)競賽的申請表……好吧,我也不知道應(yīng)該算什么的“中國式”復(fù)雜報(bào)表
好了,現(xiàn)在回頭看看,那張簡單報(bào)表的單純的樣子,是不是有一種“誘騙”我們邁入陷阱的味道?而如果是用報(bào)表工具FineReport,事情就會變成這樣:
簡單的清單報(bào)表:
簡單添加一個(gè)分組函數(shù)后的分組報(bào)表:
標(biāo)紅特殊行,選中行在表達(dá)式中寫入背景色表達(dá)式即可
簡單添加平均函數(shù)后分組報(bào)表:
以及不知道算不算復(fù)雜式的報(bào)表:
可以看到,報(bào)表工具在實(shí)現(xiàn)這些需求的時(shí)候,最主要的特點(diǎn)就是兩個(gè)字:直觀!不僅數(shù)據(jù)的提取簡單清晰,放置的位置所見即所得,內(nèi)容的延展方向也都清楚明白。(談錢不傷感情,正因?yàn)閳?bào)表工具開發(fā)直觀,所以從此可以不再需要年薪 N 萬的專業(yè)程序員和 TA 那一片片代碼了,這是分分鐘又為公司省下了多少錢呀??!!)
其實(shí)除了上面提到“大招”,還有很多程序員不愿面對或懶于面對的需求,比如各種統(tǒng)計(jì)圖表、條形碼、業(yè)務(wù)類的報(bào)表;比如導(dǎo)出 PDF、XLS、DOC 等各種常用文檔格式;比如和機(jī)器紙張密切相關(guān)的自適應(yīng)打印輸出……
嗯,對了,報(bào)表中可能還要在線填寫某些數(shù)據(jù),填寫界面還要足夠友好…
這些需求都需要依靠報(bào)表工具。報(bào)表工具的優(yōu)勢除了開發(fā)高效外,另一個(gè)重要的亮點(diǎn)就是可以有效降低耦合性,就算報(bào)表需求頻繁改變,沒完沒了,只要通過報(bào)表工具將報(bào)表模塊獨(dú)立出來,即便應(yīng)用項(xiàng)目上線了也只需替換報(bào)表文件,不必重新打包部署、不必重啟服務(wù),完全可以實(shí)現(xiàn)不停機(jī)熱切換,甚至可以由維護(hù)人員去做。
看看下面的結(jié)構(gòu)圖是不是好理解多了?
綜上所述,要寫代碼還是要報(bào)表工具這個(gè)問題的答案還用想嗎?
萬能的專業(yè)程序員應(yīng)該用在更需要 TA 的地方,萬萬不能浪費(fèi)在已經(jīng)有了成熟解決方案的報(bào)表制作上面。一開始想的太簡單,后面就會大大不簡單,一開始確認(rèn)對了眼神,就會找到對的人。
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。