丁 俊 鄭 輝
(安徽工業(yè)經(jīng)濟職業(yè)技術學院計算機與藝術學院 安徽 合肥 230051)
隨著大數(shù)據(jù)時代的來臨,大量原始數(shù)據(jù)的采集是一切數(shù)據(jù)分析和處理的基礎。雖然互聯(lián)網(wǎng)、電子儀器可以采集大量的數(shù)據(jù),但還有很大一部分數(shù)據(jù)是需要人工填寫的,如與個人相關的各類基本信息、問卷調(diào)查等。各級政府機構、企事業(yè)單位在采集此類數(shù)據(jù)時,或者打印出紙質(zhì)表格或者制作出電子表格,然后下發(fā)給相關人群填寫,再由專人收集整理統(tǒng)計,整個信息采集過程繁瑣,費時費力,而且容易出錯。
本文針對這個現(xiàn)實問題,在Java Web開發(fā)平臺上,利用Apache POI插件開發(fā)出一套可以直接導入Excel數(shù)據(jù)采集模板并快速生成數(shù)據(jù)采集網(wǎng)頁的Web應用程序。該數(shù)據(jù)采集網(wǎng)頁可以根據(jù)用戶的需求進行個性化的動態(tài)配置。在網(wǎng)頁的生成和配置過程中,系統(tǒng)可以通過Excel標注提示、表單內(nèi)容提示、客戶端表單驗證等多種方式,提醒和引導被采集人填寫符合規(guī)范的信息。數(shù)據(jù)采集網(wǎng)頁生成后,可通過QQ、微信和短信等多種方式向信息被采集人推送,被采集人可利用個人電腦、手機以及各類移動終端隨時隨地打開數(shù)據(jù)采集網(wǎng)頁填寫并提交信息,所有信息采集完畢后,又可從系統(tǒng)中導出數(shù)據(jù)生成人們熟悉的Excel文檔,從而大大提高數(shù)據(jù)采集的效率和規(guī)范性。此外,存在于系統(tǒng)中的數(shù)據(jù)可以在多次數(shù)據(jù)采集中重復引用,一方面可減少被采集人的數(shù)據(jù)錄入量,另一方面可以利用現(xiàn)有數(shù)據(jù)對新數(shù)據(jù)進行校驗。通過反復多次相關的數(shù)據(jù)采集和整合,使得系統(tǒng)中的數(shù)據(jù)不斷完善和龐大,為日后的大數(shù)據(jù)分析提供充足而真實的數(shù)據(jù)源。
系統(tǒng)的基本框架是在Java Web平臺上設計實現(xiàn)的,系統(tǒng)以CSS、JQuery、JSP和Servlet為主要開發(fā)技術,借助于Apache POI插件實現(xiàn)了Excel文件的導入和導出,底層以MySQL作為存儲數(shù)據(jù)庫。
為了實現(xiàn)從Excel模板數(shù)據(jù)的導入,到最終再以Excel格式的文件導出采集的數(shù)據(jù),系統(tǒng)主要包括模板數(shù)據(jù)讀入與解析、元數(shù)據(jù)記錄與模式創(chuàng)建、模式配置、網(wǎng)頁發(fā)布與數(shù)據(jù)采集和數(shù)據(jù)管理五大模塊,如圖1所示為系統(tǒng)總體架構圖。
圖1 系統(tǒng)總體架構圖
2.1.1模板數(shù)據(jù)讀入與解析模塊
在本模塊中,系統(tǒng)提供了文件上傳表單接口,用戶可以上傳xls、xlsx、csv三種類型的模板文件,然后再從模板文件中解析出字段名和數(shù)據(jù)內(nèi)容。
2.1.2元數(shù)據(jù)記錄和模式創(chuàng)建模塊
本模塊根據(jù)數(shù)據(jù)讀入和解析模塊中已經(jīng)解析出來的字段名、字段類型、各字段對應的數(shù)據(jù)內(nèi)容等一系列信息創(chuàng)建滿足需求的數(shù)據(jù)表元數(shù)據(jù)模型和字段元數(shù)據(jù)模型,然后再將這些字段名、字段類型等元素據(jù)存儲到相應的元數(shù)據(jù)模型中。
2.1.3模式配置模塊
在模式配置模塊中,用戶可以根據(jù)需要對字段類型、字段引用類型、字段對應的表單控件類型、字段的具體引用內(nèi)容和字段注釋等內(nèi)容進行靈活配置,以滿足個性化需求[1],如圖2所示為一個論文數(shù)據(jù)采集表的模式配置畫面。
圖2 模式配置
2.1.4網(wǎng)頁發(fā)布和數(shù)據(jù)采集模塊
在本模塊中,用戶可以根據(jù)新生成的數(shù)據(jù)表模型以及配置好的模式特征,將數(shù)據(jù)采集網(wǎng)頁以表單形式發(fā)布出去,通過QQ、微信和短信等多種方式向數(shù)據(jù)被采集人推送。被采集人可利用個人電腦、手機以及各類移動終端隨時隨地直接打開網(wǎng)頁填寫并提交信息,信息提交后將直接保存至服務器數(shù)據(jù)庫中。
2.1.5預覽、導出等其他數(shù)據(jù)管理模塊
系統(tǒng)除了以上幾個模塊外,還包括數(shù)據(jù)預覽、刪除和導出幾個常見數(shù)據(jù)管理模塊。在預覽模塊中,對已采集的數(shù)據(jù)進行多種模式的篩選和排序查看;刪除模塊則對指定的數(shù)據(jù)表進行刪除,同時以事務的形式對該表對應的數(shù)據(jù)表元數(shù)據(jù)和字段元數(shù)據(jù)進行刪除操作,以保持數(shù)據(jù)的一致性;導出模塊則利用Apache POI插件將已采集的數(shù)據(jù)進行全部或者分類導出成Excel文件。
系統(tǒng)為了實現(xiàn)模式的動態(tài)可配置特性,除了需要創(chuàng)建與Excel文檔相對應的用來存儲被采集數(shù)據(jù)的數(shù)據(jù)模型外,還專門設計了兩個用來記錄數(shù)據(jù)表、字段和表單屬性等一系列元數(shù)據(jù)的數(shù)據(jù)模型,分別是數(shù)據(jù)表元數(shù)據(jù)模型和字段元數(shù)據(jù)模型[2]。
2.2.1數(shù)據(jù)表元數(shù)據(jù)模型
該數(shù)據(jù)模型主要用來存放Excel模板文件中每個工作表的基本信息及其相關信息,它包括數(shù)據(jù)表Id(關鍵字段)、數(shù)據(jù)表原名、現(xiàn)名、原表類型、創(chuàng)建人、創(chuàng)建時間、字段數(shù)、發(fā)布網(wǎng)址、填表說明等數(shù)據(jù),其數(shù)據(jù)模型如圖3所示。
圖3 數(shù)據(jù)表元數(shù)據(jù)模型
2.2.2字段元數(shù)據(jù)模型
該數(shù)據(jù)模型主要用來存放系統(tǒng)中所有字段及其相關的信息,它包括字段id(關鍵字段)、關聯(lián)數(shù)據(jù)表id(外鍵)、字段名、字段類型、字段引用標志、字段具體引用內(nèi)容、字段注釋和字段對應的表單控件類型等數(shù)據(jù),其數(shù)據(jù)模型如圖4所示。
圖4 字段元數(shù)據(jù)模型
系統(tǒng)的具體實現(xiàn)主要借助于Apache POI插件、Jquery、Ajax異步處理、JDBC批處理等技術,在實現(xiàn)過程中,其中模式解析、模式存儲和模式配置三個部分比較復雜。
3.1.1模式解析的實現(xiàn)
系統(tǒng)的入口以表單形式提供模板文件的上傳接口,文件上傳后,再利用Apache POI插件實現(xiàn)對模板文件的數(shù)據(jù)讀取和解析,在解析過程中,需要對模板文件的類型、模板文件中的字段名、數(shù)據(jù)類型、非常規(guī)數(shù)據(jù)等一系列信息進行識別和區(qū)分。不同的文件類型需要不同的POI對象來完成解析,如xlsx文件需要借助于XSSFWorkbook、XSSFRow、XSSFCell等多個對象來完成。而在對數(shù)據(jù)內(nèi)容進行解析時,需要區(qū)分模板文件中每列數(shù)據(jù)的類型,如字符、數(shù)值、日期、公式和空值等,這些數(shù)據(jù)類型直接影響后續(xù)模式的創(chuàng)建和未來可采集的數(shù)據(jù)種類。
3.1.2模式存儲的實現(xiàn)
系統(tǒng)中專門設計了數(shù)據(jù)表元數(shù)據(jù)模型和字段元數(shù)據(jù)模型,用來存儲系統(tǒng)中所有的表、字段及其屬性的元數(shù)據(jù),系統(tǒng)模式的動態(tài)配置完全依賴這些元數(shù)據(jù)。其中數(shù)據(jù)表元數(shù)據(jù)模型主要用于存儲模板文件中的每個表相關的信息如數(shù)據(jù)表原名、現(xiàn)名(為了防止重名由程序動態(tài)生成)、原表類型、創(chuàng)建人、創(chuàng)建時間、字段數(shù)、填表說明等信息,而字段元數(shù)據(jù)模型主要用于存儲系統(tǒng)中所有表的字段名、字段類型、字段引用標志、字段注釋和字段對應的表單控件類型等數(shù)據(jù)信息。
3.1.3模式配置的實現(xiàn)
系統(tǒng)目前支持以“僅結構”和“結構和數(shù)據(jù)”兩種方式上傳模板文件,在以“僅結構”的方式上傳模板文件時,新建的模型表中只有一行樣例數(shù)據(jù),沒有有效數(shù)據(jù),所有字段的引用類型都為“手工輸入”,默認的表單控件類型為“單行文本框”。而對于以“結構和數(shù)據(jù)”方式上傳模板文件,新建的模型表中除了包含第一行樣例數(shù)據(jù)外,系統(tǒng)還會把模板文件中原有的數(shù)據(jù)全部寫入到模型表中,信息被采集人在填寫數(shù)據(jù)時可以選擇這些數(shù)據(jù)或者利用這些數(shù)據(jù)進行數(shù)據(jù)的查詢、校驗和整合等操作。這種情況下,默認的字段引用類型都為“自引用”,默認的表單控件類型為“可新增下拉菜單”。以上兩種模板文件上傳方式,字段的引用類型和其對應的表單控件類型都是固定統(tǒng)一的,無法滿足用戶在不同應用場合下的數(shù)據(jù)采集需求,因此系統(tǒng)提供了模式動態(tài)配置功能。
在模式配置模塊中,字段引用類型、字段對應的表單控件類型、字段的具體引用內(nèi)容是系統(tǒng)模式配置的核心內(nèi)容,其中字段引用類型主要包括手工輸入、自引用、限定值和引用其他表字段四種類型[3]?!笆止ぽ斎搿笔侵冈撟侄瓮耆杀徊杉俗约轰浫耄弧白砸谩笔侵冈谛畔⒉杉瘯r,該字段的值可以從模板中現(xiàn)有的數(shù)據(jù)或之前已經(jīng)錄入的數(shù)據(jù)中進行選擇,大大減少信息錄入量,并且可提高錄入數(shù)據(jù)的規(guī)范化程度;“限定值”是指該字段的取值限定在一組特定的值之中,這組特定值可以從模板文件中上傳,也可以直接在模式配置模塊中設置;“引用其他表字段”是指該字段的取值可以直接引用自系統(tǒng)中現(xiàn)有的某個表的某個字段。
表單控件類型默認為“單行文本框”或“可新增下拉菜單”,其可選值包括常用的控件類型如單行文本框、多行文本框、可新增下拉菜單、普通下拉菜單、單選按鈕、復選按鈕、日期時間框、文件上傳框等。根據(jù)字段類型、引用類型和采集數(shù)據(jù)特性以及使用的便利性,用戶可進行自由配置。
具體引用內(nèi)容默認情況下為空,當字段引用類型設置為“限定值”或“引用其他表字段”方式后,該項將記錄具體的引用內(nèi)容。如字段引用類型為“限定值”時,該項將保存該字段引用的具體限定值;字段引用類型為“引用其他表字段”時,該項將保存引用的表名和字段名;在“自引用”的情況下,該項主要用來保存指定字段是否可重復、是否可查詢等標志信息[4]。
3.2.1字段數(shù)據(jù)類型的識別
在系統(tǒng)的模式解析和轉(zhuǎn)換過程中,用戶的Excel模板文件只提供一行字段名,而字段名中并沒有包含數(shù)據(jù)類型信息。要將其解析并轉(zhuǎn)換成關系數(shù)據(jù)模型,則必須為每個字段指定一種數(shù)據(jù)類型,系統(tǒng)中每個字段數(shù)據(jù)類型的確定是非常關鍵的。
在本系統(tǒng)中主要是通過樣例數(shù)據(jù)來識別和確定數(shù)據(jù)類型,但Apache POI對Excel單元格內(nèi)容只識別為CELL_TYPE_STRING、CELL_TYPE_NUMERIC、CELL_TYPE_BOOLEAN、CELL_TYPE_FORMULA和CELL_TYPE_BLANK五種類型之一,而在實際應用和關系數(shù)據(jù)模型中則遠不止這幾種數(shù)據(jù)類型,再加上用戶提供的樣例數(shù)據(jù)的有限性和不規(guī)范性,使得實際情況更加復雜。如單元格內(nèi)容為公式、電話號碼、身份證號、QQ號的情況等,是定義為數(shù)字類型,還是字符類型呢?這就需要程序進行智能識別和模糊判斷,針對各種不同類型的實際數(shù)據(jù)都要進行多重邏輯判斷才能選擇一個最佳的數(shù)據(jù)類型[5]。例如當模板數(shù)據(jù)中出現(xiàn)一串數(shù)字,程序首先以字符串的形式檢測其長度,如果是15或18位,然后再以如下正則表達式 (d{14}[0-9a-zA-Z])|(d{17}[0-9a-zA-Z])對其進行識別,符合上述規(guī)則則識別為身份證號碼,定義數(shù)據(jù)模型時則將該字段定義為字符型,否則將該字段定義為長整型。在某些情況下,程序確實無法判斷時,則提示用戶進行選擇確定。
3.2.2模式動態(tài)配置
模式動態(tài)配置是實現(xiàn)動態(tài)可配置數(shù)據(jù)采集系統(tǒng)的關鍵技術模塊,也是系統(tǒng)中最復雜的一個模塊。在模板文件導入后,用戶可以根據(jù)實際需求對各個字段的屬性進行個性化配置,在本系統(tǒng)中用戶可以對模式中各字段的數(shù)據(jù)類型(field_type)、表單類型(form_type)、字段引用類型(ref_flag)及其引用內(nèi)容(ref_detail)進行動態(tài)配置[6]。在不同的模板導入方式下,其默認值是不同的,其中數(shù)據(jù)類型(field_type)是由模式解析模塊根據(jù)樣例數(shù)據(jù)來確定的。當以“僅結構”的方式導入模板時, form_type默認為普通文本框或者日期框(字段類型為日期型),ref_flag和ref_detail為空;當以“結構和數(shù)據(jù)”的方式導入模板時, form_type默認為可新增下拉菜單或者日期框(字段類型為日期型),ref_flag為“自引用”,ref_detail為空。
在模板導入后,用戶還可以根據(jù)實際需求對各字段的相關特征進行動態(tài)個性化的配置,以使字段類型、表單類型能夠很好地匹配并且具有較好的用戶體驗。如當ref_flag為“自引用”時,在ref_detail字段可以配置該字段是否可重復、是否可查詢等標志,是否可重復標志決定在該字段上是否允許有重復取值,是否可查詢標志決定是否可以根據(jù)該字段值從原始數(shù)據(jù)中查詢其他字段值顯示在表單中,以減少數(shù)據(jù)錄入量,同時可對已有的數(shù)據(jù)進行驗證;當ref_flag為“引用其他表字段”,在ref_detail字段可以配置引用系統(tǒng)中哪個表的哪個字段,同時form_type也會自動配置為可新增下拉菜單,方便用戶重復使用系統(tǒng)現(xiàn)有的數(shù)據(jù)來完成數(shù)據(jù)的錄入和整合。在配置過程中,系統(tǒng)還利用了JQuery技術實現(xiàn)了field_type、form_type、ref_flag之間的自動聯(lián)動,如當field_type設置為日期型時,form_type自動配置為日期框,ref_flag自動配置為手動輸入;當ref_flag配置為自引用類型時,form_type自動配置為可新增下拉菜單,如果你不希望該字段新增其他值,也可以手動將其配置為普通下拉菜單[7]。本系統(tǒng)目前已提供了豐富的模式動態(tài)配置功能,從而可以滿足多種不同的應用場合,后期將逐步完善該功能,以適應更廣泛的應用需求。
3.2.3數(shù)據(jù)的規(guī)范化處理
在以“結構和數(shù)據(jù)”方式導入模板文件時,模板文件中除了包含一行樣例數(shù)據(jù)外,大多都還包含了大量的原始數(shù)據(jù)。由于不同用戶的應用場合不同,這些原始數(shù)據(jù)內(nèi)容則更是五花八門,然而在數(shù)據(jù)模型創(chuàng)建后,這些原始數(shù)據(jù)都要寫入到數(shù)據(jù)庫中,以便在后期數(shù)據(jù)采集時進行數(shù)據(jù)復用、校驗和整合。寫入時每個數(shù)據(jù)還必須與所在字段的數(shù)據(jù)類型保持一致,因此需要對這些數(shù)據(jù)進行規(guī)范化處理。針對文件中出現(xiàn)的各種非預期內(nèi)容,如不規(guī)范單元格、空行空列、空白單元格、帶公式的單元格、帶格式的單元格、日期型數(shù)據(jù)的單元格等,系統(tǒng)也開發(fā)了復雜的業(yè)務處理邏輯。如日期型數(shù)據(jù)處理就是比較典型的復雜數(shù)據(jù)處理。在Excel數(shù)據(jù)中,日期型數(shù)據(jù)可能是日期型、也可能是日期時間型;有年月形式的,也有年月日形式的;有中文日期型,有英文日期型,還有以字符形式出現(xiàn)的日期。然而在Apache POI讀取單元格內(nèi)容時將英文日期識別為CELL_TYPE_NUMERIC(數(shù)字型),而將其他類型的日期都識別為CELL_TYPE_STRING(字符型),這就需要系統(tǒng)具有智能化的業(yè)務邏輯了,對讀入的數(shù)據(jù)進行多層次的邏輯判斷,然后再進行特定的處理。再比如對于單元格內(nèi)容是公式的情況,系統(tǒng)目前的處理原則是先轉(zhuǎn)換為數(shù)字,若轉(zhuǎn)換為數(shù)字出錯,則再轉(zhuǎn)換為文本[8]。數(shù)據(jù)的規(guī)范化處理涉及的內(nèi)容很廣,需要考慮到方方面面,可采取的方案也很多。本系統(tǒng)主要通過了以下幾點設計以最大程度地對各類數(shù)據(jù)進行規(guī)范化處理:
(1) 多層次的程序業(yè)務邏輯判斷。
(2) 設置單元格批注和提供樣例數(shù)據(jù)提醒用戶。
(3) 通過指定字段類型和表單類型對錄入的數(shù)據(jù)進行限制和規(guī)范。
(4) 通過客戶端腳本對表單數(shù)據(jù)進行驗證。
(5) 通過提取系統(tǒng)中已有數(shù)據(jù)列表供用戶選擇。
(6) 到指定數(shù)據(jù)庫中進行異步數(shù)據(jù)驗證。
(7) 給用戶提供人工檢查和修改環(huán)節(jié)。
本系統(tǒng)目前已在阿里云上測試運行,并已在本單位的多個部門展開應用,雖然基本數(shù)據(jù)采集功能已經(jīng)實現(xiàn),但在試運行過程中也發(fā)現(xiàn)了很多問題,如:系統(tǒng)的用戶權限設置尚未處理,目前對頁面的訪問尚無權限控制,后期準備引入多層次用戶權限控制,加強數(shù)據(jù)的安全和保密工作;在數(shù)據(jù)預覽頁面需增加按字段排序、篩選查看功能,增加分類導出等功能,改善用戶體驗。此外,系統(tǒng)對采集數(shù)據(jù)的進一步復用整合和簡單的數(shù)據(jù)統(tǒng)計分析是未來主要的研究方向,這也是系統(tǒng)與大數(shù)據(jù)時代的進一步接軌,做好大數(shù)據(jù)處理流程中的數(shù)據(jù)采集和數(shù)據(jù)預處理等前期工作。
[1] 楊海素,劉婷婷,汪惠芬. 基于模板定制的數(shù)據(jù)采集系統(tǒng)研究[J]. 制造業(yè)自動化,2013, 35(10):59-62,65.
[2] 邵東青, 焦文英, 陳海飛,等. 一種內(nèi)容可定制的數(shù)據(jù)采集系統(tǒng)的設計與實現(xiàn)[J]. 計算機應用與軟件, 2012, 29(1):181-183,248.
[3] 高瑞明,劉旭麗.可定制數(shù)據(jù)采集技術的研究和實現(xiàn)[J]. 現(xiàn)代計算機(專業(yè)版), 2014(17):67-69.
[4] 陳明璨.通用數(shù)據(jù)采集系統(tǒng)的設計與實現(xiàn)[D].河南:鄭州大學,2010.
[5] 羅騰元,吳勇.可定制野外數(shù)據(jù)采集系統(tǒng)設計[J]. 福建電腦,2014(8):26-28.
[6] 李貢湘.數(shù)據(jù)采集軟件系統(tǒng)開發(fā)平臺設計與實現(xiàn)[D].山東:中國海洋大學,2013.
[7] 童慶勇, 王盼卿, 李曉輝,等. 數(shù)據(jù)采集系統(tǒng)關鍵模塊的研究與設計實現(xiàn)[J]. 科學技術與工程, 2007, 7(4):620-621,628.
[8] 金雯婷,張松.互聯(lián)網(wǎng)大數(shù)據(jù)采集與處理的關鍵技術研究[J].中國金融電腦,2014(11):70-73.