通用Excel導入工具V1.0
使用說明
有時候我們的資料存放在Excel中(特别是對于使用者來說更喜歡使用Excel收集一些常用資料),而系統又需要這些資料來處理其他業務,那麼此時我們就 需要将這些資料導入到資料庫中。但是鑒于Excel的樣式多種多樣,是以每次導入時都必須書寫很多重複的代碼。很明顯對于一個軟體開發者做這些重複勞動是 一件很無趣的事情。那麼怎樣來尋找一種通用的方法呢?今天我們就看一下如何解決這個問題。
總體設計思路
設 計通用Excel的目的就是為了避免重複工作,也就是說不必因為Excel的樣式、資料等變化而重新從零做起、重複勞動。是以我們就必須抽取一個通用的東 西出來,使用時隻需要關注相關的業務而不必過度關注相關excel操作和存儲。再簡單一點就是封裝共同點,暴漏個性點。考慮到這種情況,我們可以使用配置 檔案的方式來解決這個問題。在配置檔案中我們配置Excle要導入的表、字段等資訊,在進行導入時再依據配置檔案将資料導入到資料庫中。這樣一來,在需要 進行Excel導入時隻需要為某個或多個excel配置一個xml檔案,然後調用相關的類就可以完成整個excel導入工作了。
補充說明:通用的局限性
在 這裡說明一下,雖然我們設計的是一個通用的Excel導入程式,但是這裡的"通用"隻是相對來說的,并不是考慮了所有Excel的情況,因為Excel的 設計情況十分的複雜多樣,要将所有的情況都考慮進去是一個漫長的過程。程式目前暫時不考慮包含統計行的情況(可以包含合并行、代碼表字段等)。
配置檔案設計
考 慮使用xml配置的方式來設計通用Excel導入,如何設計好xml就成了設計的重點。對于單表導入(一個Excel主要導入到一個資料庫表中,不排除牽 扯其他代碼表的情況)我們的配置檔案無論以資料庫為基礎設計(主要依據資料庫表結構)還是以Excel(主要依據Excel格式設計)為基礎設計都可以, 但如果是多表導入(也就是一個Excel可以導入到幾張表中的情況)考慮其複雜性還是以資料庫為基礎更為合适。基于此種考慮,我們整個配置設計會以資料庫 表結構為基礎來設計。最終的配置檔案設計樣例如下:
Config節點
Config節點位于最外層,代表整個配置。其屬性EndTag(資料讀取的結束标志,例如"RowBlank"代表空行結束,在讀取Excel時遇到某行沒有任何資料的情況則視為結束;也可以為某個列位址(如C),在導入時到了此列為空就會結束導入操作);
HeaderIndex代表excel表頭對應的行值,相當于标題行(預設從1開始)。
DataIndex表示資料行起始行索引(從2開始)。
WorkSheetCount表示對于整個Excel檔案,如果其包含多個工作表,則會根據所設的值處理前幾個工作表,屬性值為0,則會處理所有工作表,預設為0。
Table節點
Table節點位于Config節點内,對應資料庫中的表,可以有多個;
Name屬性對應要導入的表名稱;
DeleteRepeat屬性表示是否删除重複行(如果為true則會根據主鍵先删除重複行再執行插入操作);
ExcludedColumns表示排除列,多個列名使用","分割(這些字段不會導入)。
Column節點
Column節點位于Table節點内,對列的相應配置,通常有多個(注意對于excel中沒有的列,而資料庫表需要導入的,也需要配置Column節點,此時HeaderText為空或不配置HeaderText屬性);
IsPrimarykey屬性表示是否為主鍵(當Table節點配置DeleteRepeat為ture時必須至少指定一個Column節點的 IsPrimaryKey為true,此屬性是為delete條件做準備的[有可能它不是真正的主鍵]);
ColumnName表示對應的列名;
HeaderText表示對應的Excel列頭(在依據Excel别名導入時根據此值确定導入的列);
Required指定此列是否為必須導入的列(如果配置為true,excel中此列為空并且沒有配置預設值則會抛出異常);
DataType為資料類型(例如string、number、datetime用于資料校驗);
DefaultValue 為預設值(注意其值不一定是指定的字元值,可以是"Max"、"NewID"、如果指定為“WORKSHEETNAME”則取目前工作薄的名稱做為其值, 如果為Max,那麼此列必須為數值類型,此時在導入的時候如果需要使用預設值,就會在原來資料庫表中此列最大值的基礎上加上1導入到資料庫中,如果為 NewID在導入的時候需要使用預設值系統就會自動生成Guid值);
Comment是此列的說明。
CodeTable節點
在Column節點中還可以配置CodeTable節點,表示代碼表。
Name屬性值表示引用表的表名稱;
PrimaryKey指待引用主表的主鍵,也就是子表的外鍵,Column配置節點的ColumnName屬性值應該與CodeTable節點的PrimaryKey屬性值設定一至,如以下配置:
<Column ColumnName="CategoryID" HeaderText="商品種類" DefaultValue=""> <CodeTalbe Name="Categories" PrimaryKey="CategoryID" ReferenceColumn="CategoryName"/> </Column>
ReferenceColumn 表示對應代碼字段關聯名稱列,就是我們導入時所依據的excel對應值(例如CategoryID對應CategoryName,那麼 ReferenceColumn就是CategoryName,往往Excel中可能存放的是類似于CategoryName的東西而不是 CategoryID,而導入操作時需要CategoryID)。
導入執行個體說明:
圖一 待導入Excel檔案,可同時導入多個工作薄(WorkSheet)

圖二 設定導入規則
圖三 使用開發的導入工具進行導入
圖四 導入完成後入庫的資料
本文轉自yonghu86 51CTO部落格,原文連結:http://blog.51cto.com/yonghu/1321313,如需轉載請自行聯系原作者