數據導入做爲系統經常使用的功能,幾乎全部的系統都應該支持,主要用於系統初期,大批量初始化數據,或者須要輸入的數據行比較多的狀況(導入在建項目的交付清單,一般成百上千項)。
數據導入的通常過程是,用戶按照模板格式Excel文件,而後程序讀取這個文件,根據列進行對應,逐行將數據寫入到系統中。正則表達式
一,先講講模板:
通常使用Excel模板,所謂模板就是約定Excel的每一列對應系統的哪一列的值,對應方式有兩種,一是根據順序匹配,二是根據列名匹配。所謂根據順序匹配,是約定第一列(A列)對應系統數據庫的那一列,B列對應哪一列。這種模板能夠沒有標題行,也能夠有多行標題。所謂列名匹配,是指定列的名字進行匹配,這種狀況須要有標題行。匹配時要指明是否忽略掉標題中的空格,*號,由於有些模板中會使用*來表示該列是必輸列,也有可能有空格。
還有,可能還須要指定標題或者數據的起始行數,由於有時候數據並不必定從第2行開始,有可能模板數據有個大大的標題,好比「xx單位培訓上報名單」,其後纔是標題行和數據行。
除了excel形式的模板,還有.csv格式,所謂「CSV」,是Comma Separated Value(逗號分隔值)的英文縮寫,一般都是純文本文件。就是列與列之間用逗號分隔,如今不是很經常使用了。其實.csv文件也能夠用Excel打開的。
系統模板下載。用戶要使用模板導入數據,首先先要得到模板,系統能夠提供一個模板下載的功能,能夠在數據導入界面或者一個統一的下載界面,提供模板下載功能,這樣,用戶就不用處處找模板在哪裏,打電話給你要模板了。推薦在數據導入界面直接下載模板。而且,系統應該根據導入方案自動生成模板,而不是人爲加工再上傳到服務器。這樣就極大避免了模板過時,與方案不匹配的問題。數據庫
二,導入
導入方式有不少種,下面逐個討論之。
1,編寫通用的服務端導入程序。
對一些簡單的沒有檢查邏輯的數據,能夠寫通用的導入程序,這樣效率還高。好比咱們的條碼系統就寫了一個通用的excel導入。效率仍是很高的。通用導入程序,定義模板文件與數據庫表之間的對應關係,還有其餘的一些邏輯,好比根據編號查找名稱,帶出其餘列等等。也能夠定義數據檢查邏輯。系統讀入excel文件,將數據傳送到服務端,服務端要用數據導入程序,逐行讀數數據,根據定義的檢查邏輯檢查數據是否合法,並將數據寫入到指定的表。這種導入程序,有不少中複雜的狀況須要處理:
(1)自動編碼。編程
通常咱們錄入訂單或者入庫單的時候,單號能夠自動造成,根據必定的造成規則,這種規則通常是經過後臺程序來實現的,導入程序要提供這方面的支持,好比,定義某個編碼列,以及引用的編碼規則,指導導入程序調用適當的編號造成程序造成代碼。
(2)根據A列帶出B列的內容。服務器
好比,根據輸入的員工號,帶出員工所屬的部門代碼。這種業務場景,還須要定義列寫入的順序。先代出,而後能夠覆蓋(帶出的爲默認值)。
(3)根據名稱找編碼。學習
好比導入員工表,員工所屬部門,數據庫中保存的是編號,可是模板中多是填寫的部門名稱。就須要根據名稱找到編碼,寫到數據庫中。導入程序就要定義查找關係。編碼
(4)導入範圍。設計
上面的根據名稱找編碼的邏輯看上去很簡單,可是實際應用中還有個更復雜的狀況,設想再一個集團企業中,不一樣的分支機構中的部門多是相同的(人力資源部都叫人力資源部),在不一樣的機構中導入,就應該僅僅查找該機構下的編碼。這就涉及到數據導入範圍的概念。要抽象出數據導入範圍這個概念,並且導入範圍的限定還不必定來自一個條件,多是多個條件。導入程序定義界面須要指定導入範圍由什麼來肯定,好比用組織機構;定義好導入範圍後,好比按照組織機構來限定範圍。導入時要提供導入範圍選擇界面,並把導入範圍選擇的值應用到導入邏輯中(好比在根據部門名稱查找部門編碼時,加上組織機構的限制)。excel
(5)定義」無值「的表示方式。blog
考慮下手工錄入的場景,某一列的內容我徹底能夠不錄入,導入時,如何區分」不錄入「這種場景呢,能夠定義一個特殊的值,好比」<n/a>「表示該單元格不導入。由於在某些場景下(好比更新模式),是須要區分」不修改「仍是」修改成空「這兩種狀況的。
(6)數據的合法性檢查邏輯。圖片
導入時,要先檢查數據是否合法,這就須要定義一種檢查邏輯或者說是語法。好比編碼存在性檢查,數據格式檢查(數字列輸入了非數字值),數據寬度,數據範圍(只能輸入0/1/2/3),甚至有的列的檢查依賴於其餘列的值,好比證件號碼的合法性,依賴於證件類型:身份證,港澳通行證,士兵證等等。有些有效性能夠經過定義正則表達式來檢查,有些就比較複雜了。但願你們學習下正則表達式的知識。
2,界面模擬錄入的導入方式
第一種方式,你們能夠發現,須要定義大量的規則,而這些規則,在界面錄入編碼過程當中都已經實現了,若是能充分利用已經實現的這些規則,將會避免大量的重複性工做,而且有些邏輯可能經過第一種方式實現不了。
這種狀況通常是採用模擬鍵盤輸入的方式,從模板中讀取數據,填到界面的特定錄入框,而後界面天然會調用已經實現的邏輯,複用了程序代碼。
這兩種方式各有優缺點。第一種方式優勢是效率很高,適合大批量的數據導入。之前作過一個項目,須要的導入大量的數據,因爲時間比較緊急,剛開始採用第二種方式,每秒才能導入不到1條數據。1000條數據就要差很少20分鐘,用戶不幹了,由於要導入的數據不止1000行。不得已才採用了第1種方式。但第一種方式定義起來麻煩。第二種方式的優缺點與第一種正好相反。並且對界面編程要求比較高 。在作輸入界面的時候,就要提早考慮好這種導入,給這種模擬輸入的導入提供方便。
3,模擬導入
不管哪一種方式,都要提供模擬導入的功能,以便檢查數據錯誤。
第一種方式,經過數據檢查邏輯,對數據進行檢查,並提供詳細的檢查報告。而且導入結束後,能將導入失敗的緣由寫入到源文件的對應行,這樣方便用戶修正。
第二種方式,能夠提供模擬導入的功能,吧錯誤檢查出來,一樣,也能將檢查出來的錯誤,寫入到源文件中。
至於選擇那種方式,能夠根據具體的業務場景進行抉擇。數據校驗少,不復雜的,對效率要求高的,選擇第一種方式,不然選擇第二種方式。
導入時,還能夠支持過濾條件,好比只導入數據源中符合條件的某些數據。
四、其餘
應該支持同時導入多個模板文件。導入時,同時選擇多個excel文件,逐個排隊導入。
三,導入的其餘複雜狀況
1,導入父子表
通常的業務憑證,都是父子表結構,好比財務憑證,有憑證頭,多條分錄。這就是典型的父子表。更復雜的還有多個、多級父子表。
能夠將這種多級關係抽閒成數據行的級次狀況,,或經過列縮進的方式來體現父子關係。
其實,你看若是按照上面的格式定義,導入程序是能工做的。
可是!這樣會將模板搞的忒複雜了,易用性很差。其實excel導入最適合的就是簡單的二維表,沒有這麼複雜的結構。不然就拔苗助長了,光是輸入這麼複雜的表,就夠麻煩的了,何不直接在系統中錄入呢。
通常這種父子表的導入能夠採用屢次導入的方式來實現,先導入表頭,再導入明細。表頭和明細使用不一樣的模板。
二、導入多個表
有時候在系統設計的時候,業務上的一個數據可能會保存到多個物理表中。那麼在導入的時候,就須要支持這種場景,你不能讓用戶導入屢次。在定義導入的時候,指定多個目標表,而後在定義導入目標列時,能夠從多個表中選擇。多個表經過數據的KEY關聯。若是KEY是自動造成的,那麼只在導入第一個表時自動生成,導入後邊的表時,直接拿過來用就行了。
三、導入組的概念
上面導入父子表的例子,最後給出的方案是表頭和明細定義不一樣模板,分別導入的方案。這種方案是可行的,可是用戶實際用起來稍有點麻煩,須要作兩次導入操做。其實除了導入這種父子表的例子,還有一種場景,抽象講,我導入了A表的內容,同時但願在B表中也插入部分數據;另外的場景就是上面說的,導入多個表。
以上場景,咱們能夠定義多個導入方案,而後把多個導入方案組合在一塊兒,組成一個「導入組」,自動按順序執行導入組中的每一個方案。知足以上的場景。方案組中的每一個方案的數據能夠來自不一樣的數據文件,也能夠來自同一個文件。
4,導入文件附件
確實有這種需求,好比導入商品主數據,系統可能須要給每一個商品配個照片,這個照片存放在本地文件系統,用戶但願在導入模板中輸入圖片的地址。
導入圖片就不像模擬鍵盤輸入這麼簡單了,須要特殊的導入程序。這就須要專門根據這種特殊的需求來發專門的程序了,由導入程序來調用,也有多是錄入界面來調用(若是是在單據錄入界面導入的話)。能夠開發一種支持附件導入的程序,經過約定附件的制定格式(好比在模板中制定附件的位置)
5,將導入結果回寫到excel模板中。將導入結果反寫到excel中,便於用戶查看,方便用戶作後續額的處理,好比顯示某條數據是否導入成功,若是沒有導入成功,顯示失敗的緣由,便於用戶根據錯誤緣由,調整數據。數據模板中能夠提供兩個固定的列(導入狀態,狀態說明),前者存放是否導入成功,成功,顯示「成功」,失敗顯示失敗,並在導入文本中顯示具體的失敗緣由,多是數據部符合要求,也多是系統出錯了等等。並提供一個導入進度指示,好比顯示一個列表,列出全部須要導入的數據行,根據導入的進度,滾動這個列表,並在列表中實時顯示導入結果,成功,失敗,失敗緣由等等。