今天開始和大家分享關於Excel最長常用操作封裝。
01、起因
市面上有很多Excel操作庫,這些庫設計之初的目標是提供對Excel的各種操作功能,包括資料、樣式、公式、圖表等等。而對於我們平時開發來說,大多時候並不需要那麼多強大的功能,可能大部分只涉及兩個操作匯入和匯出。在這種情況下使用任何一種Excel操作庫的學習成本相對來說都是比較高的。
如果有個包能提供Excel讀取和寫入功能,已經能滿足大部分常規需求了,而並不需要了解那麼多Excel操作細節。
因此有了二次封裝Excel操作的想法,用來應對快速開發。
02、設計思路
整個設計思路圍繞兩個操作展開——匯入和匯出。
對於匯入我們肯定希望是讀完Excel檔案直接得到一個物件集合,類似下面虛擬碼:
var students = Read(excel)
對於匯出我們肯定希望傳入物件集合直接得到一個Excel檔案,類似下面虛擬碼:
var excel = Write(students)
對於Excel來說關注的是行和列,而物件集合可能很容易表達出行的概念,但是很難表達出列的概念。因此如何想實現上面說到的Excel和物件集合直接轉換,還需要進行一些轉換,即把物件集合轉為成一張類似表格的資料結構,這樣就可以和Excel的表對應上了。
而.NET中本身就有這樣的資料結構——DataTable。因此我們可以透過DataTable把物件集合和Excel關聯起來。
因此我們要想實現Excel匯入和匯出需要實現以下兩部分:
(1)物件集合與DataTable轉換;
(2)DataTable與Excel轉換;
最後再把兩部分合併為最終要的匯入匯出方法,這樣整體思路就比較清晰了。下面我們對兩部分設計單獨講解。
03、物件集合與DataTable轉換
把這部分單獨拿出來說除了本身需要外,還因為這塊功能可以作為公共基礎功能,用於其他場景使用,因此這塊功能會放入Ideal.Core.Common庫中。
要實現物件集合與DataTable轉換也可以分為兩步:
(1)建立:以物件屬性名作為列名建立DataTable;
(2)轉換:把物件集合資料填充至DataTable行記錄中,或者相反;
1、建立
對於建立表格,考慮到相容性、擴充套件性、適用性,我們將考慮支援多種方式建立表格,大致包括以下幾種情況。
(1)根據列名建立表格;
(2)根據物件建立表格;
(3)根據物件繫結自定義特性建立表格;
當然還要根據各種細節提供不同的過載方法。
2、轉換
對於轉換表格主要指物件集合轉表格、表格轉物件集合、以及其他表格轉換,大致包括以下幾種情況。
(1)物件集合轉為表格;
(2)根據物件繫結自定義特性把集合轉為表格;
(3)表格轉為物件集合;
(4)根據物件繫結自定義特性把表格轉為物件集合;
(5)一維陣列轉為表格;
(6)行列轉置;
04、DataTable與Excel轉換
這塊功能也可以說是Excel幫助類的核心功能,因此這塊功能將放入Ideal.Core.Document庫中。
DataTable與Excel轉換可以分為兩種情況:
(1)讀:把Excel中資料讀入DataTable;
(2)寫:把DataTable中資料寫入Excel;
1、讀
讀取Excel資料至DataTable,根據透過不同的方式獲取到不同格式的Excel資料,可以分為以下兩種情況:
(1)根據檔案路徑讀取資料至DataTable;
(2)根據檔案流讀取資料至DataTable;
2、寫
寫指把DataTable資料寫入Excel中,同樣根據不同方式把DataTable資料寫入不同格式的Excel中,也可以分為以下幾種情況:
(1)把DataTable資料寫入Excel檔案流;
(2)把DataTable資料寫入Excel位元組陣列;
(3)把DataTable資料寫入指定路徑Excel;
05、物件集合與Excel轉換
完成上面兩部分後,這一步就簡單多了,只需要對上面兩部分進行整合就行了。因此也可以分為讀寫兩種情況。
1、讀
讀取Excel資料至物件集合,主要分為兩種情況。
(1)讀取Excel資料至物件集合;
(2)根據物件自定義特性讀取Excel資料至物件集合;
根據不同的Excel資料格式,還有其他組合情況,這裡先不細說。
2、寫
寫指把物件集合寫入Excel,主要分為兩種情況:
(1)把物件集合寫入Excel;
(2)根據物件自定義特性把物件集合寫入Excel;
同樣,根據不同的Excel資料格式,還有其他組合情況,這裡暫不細說。
後面我們將詳細講解具體實現過程。
注:測試方法程式碼以及示例原始碼都已經上傳至程式碼庫,有興趣的可以看看。https://gitee.com/hugogoos/Ideal