開源 - Ideal庫 - Excel幫助類,設計思路(一)

IT规划师發表於2024-11-28

今天開始和大家分享關於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

相關文章