一個批量數據導入的實現方案


        數據導入作為系統常用的功能,幾乎所有的系統都應該支持,主要用於系統初期,大批量初始化數據,或者需要輸入的數據行比較多的情況(導入在建項目的交付清單,通常成百上千項)。
        數據導入的一般過程是,用戶按照模板格式Excel文件,然后程序讀取這個文件,根據列進行對應,逐行將數據寫入到系統中。

一,先講講模板:
        一般使用Excel模板,所謂模板就是約定Excel的每一列對應系統的哪一列的值,對應方式有兩種,一是根據順序匹配,二是根據列名匹配。所謂根據順序匹配,是約定第一列(A列)對應系統數據庫的那一列,B列對應哪一列。這種模板可以沒有標題行,也可以有多行標題。所謂列名匹配,是指定列的名字進行匹配,這種情況需要有標題行。匹配時要指明是否忽略掉標題中的空格,*號,因為有些模板中會使用*來表示該列是必輸列,也有可能有空格。
        還有,可能還需要指定標題或者數據的起始行數,因為有時候數據並不一定從第2行開始,有可能模板數據有個大大的標題,比如“xx單位培訓上報名單”,其后才是標題行和數據行。
        除了excel形式的模板,還有.csv格式,所謂“CSV”,是Comma Separated Value(逗號分隔值)的英文縮寫,通常都是純文本文件。就是列與列之間用逗號分隔,現在不是很常用了。其實.csv文件也可以用Excel打開的。
        系統模板下載。用戶要使用模板導入數據,首先先要獲得模板,系統可以提供一個模板下載的功能,可以在數據導入界面或者一個統一的下載界面,提供模板下載功能,這樣,用戶就不用到處找模板在哪里,打電話給你要模板了。推薦在數據導入界面直接下載模板。並且,系統應該根據導入方案自動生成模板,而不是人為加工再上傳到服務器。這樣就極大避免了模板過期,與方案不匹配的問題。

二,導入
導入方式有很多種,下面逐個討論之。
1,編寫通用的服務端導入程序。
       對一些簡單的沒有檢查邏輯的數據,可以寫通用的導入程序,這樣效率還高。比如我們的條碼系統就寫了一個通用的excel導入。效率還是很高的。通用導入程序,定義模板文件與數據庫表之間的對應關系,還有其他的一些邏輯,比如根據編號查找名稱,帶出其他列等等。也可以定義數據檢查邏輯。系統讀入excel文件,將數據傳送到服務端,服務端要用數據導入程序,逐行讀數數據,根據定義的檢查邏輯檢查數據是否合法,並將數據寫入到指定的表。這種導入程序,有很多中復雜的情況需要處理:
(1)自動編碼。

         一般我們錄入訂單或者入庫單的時候,單號可以自動形成,根據一定的形成規則,這種規則一般是通過后台程序來實現的,導入程序要提供這方面的支持,比如,定義某個編碼列,以及引用的編碼規則,指導導入程序調用適當的編號形成程序形成代碼。
(2)根據A列帶出B列的內容。

         比如,根據輸入的員工號,帶出員工所屬的部門代碼。這種業務場景,還需要定義列寫入的順序。先代出,然后可以覆蓋(帶出的為默認值)。
(3)根據名稱找編碼。

         比如導入員工表,員工所屬部門,數據庫中保存的是編號,但是模板中可能是填寫的部門名稱。就需要根據名稱找到編碼,寫到數據庫中。導入程序就要定義查找關系。

(4)導入范圍。

        上面的根據名稱找編碼的邏輯看上去很簡單,但是實際應用中還有個更復雜的情況,設想再一個集團企業中,不同的分支機構中的部門可能是相同的(人力資源部都叫人力資源部),在不同的機構中導入,就應該僅僅查找該機構下的編碼。這就涉及到數據導入范圍的概念。要抽象出數據導入范圍這個概念,而且導入范圍的限定還不一定來自一個條件,可能是多個條件。導入程序定義界面需要指定導入范圍由什么來確定,比如用組織機構;定義好導入范圍后,比如按照組織機構來限定范圍。導入時要提供導入范圍選擇界面,並把導入范圍選擇的值應用到導入邏輯中(比如在根據部門名稱查找部門編碼時,加上組織機構的限制)。

(5)定義”無值“的表示方式。

         考慮下手工錄入的場景,某一列的內容我完全可以不錄入,導入時,如何區分”不錄入“這種場景呢,可以定義一個特殊的值,比如”<n/a>“表示該單元格不導入。因為在某些場景下(比如更新模式),是需要區分”不修改“還是”修改為空“這兩種情況的。
(6)數據的合法性檢查邏輯。

         導入時,要先檢查數據是否合法,這就需要定義一種檢查邏輯或者說是語法。比如編碼存在性檢查,數據格式檢查(數字列輸入了非數字值),數據寬度,數據范圍(只能輸入0/1/2/3),甚至有的列的檢查依賴於其他列的值,比如證件號碼的合法性,依賴於證件類型:身份證,港澳通行證,士兵證等等。有些有效性可以通過定義正則表達式來檢查,有些就比較復雜了。希望大家學習下正則表達式的知識。

2,界面模擬錄入的導入方式
        第一種方式,大家可以發現,需要定義大量的規則,而這些規則,在界面錄入編碼過程中都已經實現了,如果能充分利用已經實現的這些規則,將會避免大量的重復性工作,並且有些邏輯可能通過第一種方式實現不了。
這種情況一般是采用模擬鍵盤輸入的方式,從模板中讀取數據,填到界面的特定錄入框,然后界面自然會調用已經實現的邏輯,復用了程序代碼。

       這兩種方式各有優缺點。第一種方式優點是效率很高,適合大批量的數據導入。以前做過一個項目,需要的導入大量的數據,由於時間比較緊急,剛開始采用第二種方式,每秒才能導入不到1條數據。1000條數據就要差不多20分鍾,用戶不干了,因為要導入的數據不止1000行。不得已才采用了第1種方式。但第一種方式定義起來麻煩。第二種方式的優缺點與第一種正好相反。而且對界面編程要求比較高 。在做輸入界面的時候,就要提前考慮好這種導入,給這種模擬輸入的導入提供方便。

3,模擬導入
       無論哪種方式,都要提供模擬導入的功能,以便檢查數據錯誤。
       第一種方式,通過數據檢查邏輯,對數據進行檢查,並提供詳細的檢查報告。並且導入結束后,能將導入失敗的原因寫入到源文件的對應行,這樣方便用戶修正。
       第二種方式,可以提供模擬導入的功能,吧錯誤檢查出來,同樣,也能將檢查出來的錯誤,寫入到源文件中。
       至於選擇那種方式,可以根據具體的業務場景進行抉擇。數據校驗少,不復雜的,對效率要求高的,選擇第一種方式,否則選擇第二種方式。
       導入時,還可以支持過濾條件,比如只導入數據源中符合條件的某些數據。

4、其他
      應該支持同時導入多個模板文件。導入時,同時選擇多個excel文件,逐個排隊導入。

三,導入的其他復雜情況
1,導入父子表
一般的業務憑證,都是父子表結構,比如財務憑證,有憑證頭,多條分錄。這就是典型的父子表。更復雜的還有多個、多級父子表。
可以將這種多級關系抽閑成數據行的級次情況,,或通過列縮進的方式來體現父子關系。

其實,你看如果按照上面的格式定義,導入程序是能工作的。
但是!這樣會將模板搞的忒復雜了,易用性不好。其實excel導入最適合的就是簡單的二維表,沒有這么復雜的結構。否則就適得其反了,光是輸入這么復雜的表,就夠麻煩的了,何不直接在系統中錄入呢。
一般這種父子表的導入可以采用多次導入的方式來實現,先導入表頭,再導入明細。表頭和明細使用不同的模板。

2、導入多個表
有時候在系統設計的時候,業務上的一個數據可能會保存到多個物理表中。那么在導入的時候,就需要支持這種場景,你不能讓用戶導入多次。在定義導入的時候,指定多個目標表,然后在定義導入目標列時,可以從多個表中選擇。多個表通過數據的KEY關聯。如果KEY是自動形成的,那么只在導入第一個表時自動生成,導入后邊的表時,直接拿過來用就好了。

3、導入組的概念
上面導入父子表的例子,最后給出的方案是表頭和明細定義不同模板,分別導入的方案。這種方案是可行的,但是用戶實際用起來稍有點麻煩,需要做兩次導入操作。其實除了導入這種父子表的例子,還有一種場景,抽象講,我導入了A表的內容,同時希望在B表中也插入部分數據;另外的場景就是上面說的,導入多個表。
以上場景,我們可以定義多個導入方案,然后把多個導入方案組合在一起,組成一個“導入組”,自動按順序執行導入組中的每個方案。滿足以上的場景。方案組中的每個方案的數據可以來自不同的數據文件,也可以來自同一個文件。

4,導入文件附件
確實有這種需求,比如導入商品主數據,系統可能需要給每個商品配個照片,這個照片存放在本地文件系統,用戶希望在導入模板中輸入圖片的地址。
導入圖片就不像模擬鍵盤輸入這么簡單了,需要特殊的導入程序。這就需要專門根據這種特殊的需求來發專門的程序了,由導入程序來調用,也有可能是錄入界面來調用(如果是在單據錄入界面導入的話)。可以開發一種支持附件導入的程序,通過約定附件的制定格式(比如在模板中制定附件的位置)

5,將導入結果回寫到excel模板中。
將導入結果反寫到excel中,便於用戶查看,方便用戶做后續額的處理,比如顯示某條數據是否導入成功,如果沒有導入成功,顯示失敗的原因,便於用戶根據錯誤原因,調整數據。數據模板中可以提供兩個固定的列(導入狀態,狀態說明),前者存放是否導入成功,成功,顯示“成功”,失敗顯示失敗,並在導入文本中顯示具體的失敗原因,可能是數據部符合要求,也可能是系統出錯了等等。
並提供一個導入進度指示,比如顯示一個列表,列出所有需要導入的數據行,根據導入的進度,滾動這個列表,並在列表中實時顯示導入結果,成功,失敗,失敗原因等等。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM