在日常開發裏,我們經常會碰到這樣的場景:
產品經理丟給你一份 Excel 表格,要你把數據塞進數據庫,或者做個統計分析。
C# 裏最合適的容器當然是 DataTable,問題是——怎麼優雅地把 Excel 表格變成 DataTable 呢?
這篇文章就帶你從零開始,順便聊聊兩個容易踩坑的點:
- 如何只讀表格裏的一部分區域,而不是整張表;
- 如果單元格里有公式,要拿到結果值而不是公式字符串。
先把庫準備好
操作 Excel 我推薦用 Free Spire.XLS for .NET,免費版已經夠做導入導出了。
直接在 NuGet 裏裝:
Install-Package FreeSpire.XLS
文章代碼將使用以下Excel表格作為示例:
Step 1: 整張表格直接導出成 DataTable
最基礎的用法就是一行搞定,把 Excel 工作表整個讀進來。
Workbook workbook = new Workbook();
workbook.LoadFromFile("Sample.xlsx");
// 取第一個工作表
Worksheet sheet = workbook.Worksheets[0];
// 導出為 DataTable
DataTable dt = sheet.ExportDataTable(sheet.AllocatedRange, true);
// 看看結果
foreach (DataRow row in dt.Rows)
{
foreach (var item in row.ItemArray)
{
Console.Write(item + " | ");
}
Console.WriteLine();
}
運行之後,Excel 裏的數據已經一行行輸出到控制枱了。
這裏的 true 表示第一行作為表頭,不然就會被當成普通數據。
讀取結果:
Step 2: 只讀你想要的區域
有時候 Excel 裏一堆亂七八糟的輔助列,或者底下有空白行,你肯定不想全讀進來。
這時可以直接指定範圍,比如只要 A1:D10 這一塊:
DataTable dt = sheet.ExportDataTable(sheet.Range["A1:D10"], true);
這樣 DataTable 就只會包含這一塊的內容,乾淨利落。
Step 3: 函數單元格的“坑”
這裏要特別注意:
如果 Excel 裏有公式,比如 =SUM(B2:C2),默認導出的 DataTable 裏拿到的就是公式字符串,而不是算出來的值。
舉個例子,假設表格是這樣的:
| 商品 | 數量 | 單價 | 合計 |
|---|---|---|---|
| A | 10 | 5 | =B2*C2 |
| B | 8 | 7 | =B3*C3 |
直接導出時,DataTable 的“合計”列會是 =B2*C2 和 =B3*C3,這顯然不是我們想要的。
如果你需要的是數值結果,可以在導出前做兩件事:
- 讓 Excel 先算一遍公式;
- 把公式替換成計算結果。
代碼大概是這樣:
// 讓所有公式都計算一次
workbook.CalculateAllValue();
// 遍歷單元格,把公式用結果覆蓋
foreach (CellRange cell in sheet.AllocatedRange)
{
if (!string.IsNullOrEmpty(cell.Formula))
{
cell.Value = cell.FormulaValue; // 注意:這行會用結果替換掉公式
}
}
// 再導出為 DataTable
DataTable dt = sheet.ExportDataTable(sheet.AllocatedRange, true);
這樣導出的 DataTable 裏,“合計”列就是實際的數字了。
總結
這次我們把 Excel 轉 DataTable 的幾個關鍵點都過了一遍:
- 一行代碼導出整個表;
- 指定範圍導出,避免多餘數據;
- 公式默認會導出成公式本身,如果需要結果要提前替換。
掌握這幾個小技巧,就能更穩妥地把 Excel 表格裏的數據交給 C# 來處理。
更多Excel文件操作教程,請參考 Spire.XLS for .NET官方教程。