天天看點

Open XML操作Excel導入資料Open XML操作Excel導入資料

項目中發現使用OleDb(using System.Data.OleDb)相關對象處理Excel導入功能,不是很穩定經常出問題,需要把這個問題解決掉。項目組提出使用OpenXML來處理Excel的導入、導出問題,出于興趣對OpenXML了解一下,做了簡單Demo。 

1.Open XML準備

2.簡單Excel zip包介紹

大家應該知道Office 2007都是一些XML檔案的壓縮包,可以建立一個Office 2007的Excel檔案,簡單錄入幾條資料,儲存一下。複制一下,做個副本,修改其字尾為zip格式,這樣就可以看到Excel的一些相關檔案。因需要測試功能,做了簡單的Office 2007的檔案,修改為zip解壓檢視相關檔案如下圖:

Open XML操作Excel導入資料Open XML操作Excel導入資料

其中需要注意的幾個檔案styles.xml、sharedStrings.xml、workbook.xml、worksheets中各個sheet。 

styles.xml:主要用來存放Excel中樣式的(包括格式化的資料格式,如日期、貨币等等); 

sharedStrings.xml:主要存放共享的String資料的,在沒有對Excel中相關單元格和資料格式化都可以通過這個檔案讀取; 

workbook.xml:主要存放工作簿中各個工作表的命名和命名空間,在擷取各個工作表的名稱可以通過尋址找到節點,擷取各表名稱; 

Open XML操作Excel導入資料Open XML操作Excel導入資料

3.簡單功能介紹

使用OpenXML操作Excel,将Excel中的資料正确讀取出來,保持到資料庫。但是碰到一些問題,就是如何讀取格式化的資料,把日期、時間、貨币進行資料格式化,就不能正确的讀取資料,由于不是很了解,花了些時間,在網上查了查相關資料解決了一下。估計不是最優解,如果對這方面了解的大牛,希望能指導一下,提供一些更好的方法。 

這裡測試了兩塊,一塊把Excel的所有資料按Excel定義的格式轉換成DataTable和DataSet;另一塊把Excel中資料對照相關資料庫實體對象,使用反射進行實體屬性指派,轉換失敗,則Excel中的資料就有問題。

一塊是将Excel的資料全部搬到DataTable或DataSet,不考慮這些資料是來自資料庫的幾個表,如果業務需要可以對這個DataTable或DataSet操作;

另一塊是進行資料庫實體對象校驗,必須Excel中單元格的資料格式和資料庫中字段的存儲格式一緻,當然也可以根據業務的需要繼續添加各種驗證,你可以繼續豐富、優化代碼。

稍加改進了一下,可以支援泛型對象的轉換,可以将符合規格的Excel的資料轉換成對應的實體對象,即可以映射任何實體對象。那麼就可以根據需要轉換成DataTable或DataSet,或者對多表資料的轉換,可以在此基礎上優化,希望對你有幫助。

4.簡單實作介紹

實作就是建一個WinForm程式,一個導入按鈕,一個DataView呈現資料,一個OpenFileDialog選擇檔案。兩個輔助解析Excel的類,ExcelOper和ExcelOperMatch,一個是不進行校驗之間轉化為DataTable\DataSet的;一個是需要資料校驗的,其中ExcelOperMatch調用ExcelOper寫好的兩個方法:GetWorkBookPartRows(擷取WorkBookPart中所有的行資料)和GetCellValue(擷取單元格的值)。其中對于格式化樣式不太好處理,測試資料2的樣式:

Open XML操作Excel導入資料Open XML操作Excel導入資料

5.簡單實作效果

1).測試資料1

Open XML操作Excel導入資料Open XML操作Excel導入資料

2).實作資料1

Open XML操作Excel導入資料Open XML操作Excel導入資料

3).測試資料2

Open XML操作Excel導入資料Open XML操作Excel導入資料

4).實作資料2

Open XML操作Excel導入資料Open XML操作Excel導入資料

5).測試資料3

Open XML操作Excel導入資料Open XML操作Excel導入資料

6).實作資料3

Open XML操作Excel導入資料Open XML操作Excel導入資料

6.示例Demo代碼:

1).ExcelOper.cs檔案代碼

(注意DLL和命名空間的引入:using DocumentFormat.OpenXml.Packaging和using DocumentFormat.OpenXml.Spreadsheet和using System.Diagnostics;)

Open XML操作Excel導入資料Open XML操作Excel導入資料

 View Code

2).ExcelOperMatch.cs代碼

(注意命名空間的引入:using System.Reflection;[稍作改進添加反射實體泛型支援方法,這樣就可以将符合規則的Excel資料轉換成對應的資料表])

Open XML操作Excel導入資料Open XML操作Excel導入資料

3).WinForm的Button事件代碼

Open XML操作Excel導入資料Open XML操作Excel導入資料

4).ExcelOperMatchObject.cs([新增泛型處理Excel的資料,這樣可以輕松将Excel的資料轉換成資料庫表])

Open XML操作Excel導入資料Open XML操作Excel導入資料

5).對于第4點ExcelOperMatchObject類的調用很簡單(還是在WinForm的Button事件中調用):

7.代碼結構

Open XML操作Excel導入資料Open XML操作Excel導入資料
Open XML操作Excel導入資料Open XML操作Excel導入資料
Open XML操作Excel導入資料Open XML操作Excel導入資料

8.參考部落格

至于性能方面項目組老大測試過,相對不錯,你也可以用幾十萬條資料試一下。

本文轉自SanMaoSpace部落格園部落格,原文連結:http://www.cnblogs.com/SanMaoSpace/p/3294885.html,如需轉載請自行聯系原作者