Stories

Detail Return Return

C#把Excel表格讀成DataTable:指定範圍 + 函數處理技巧 - Stories Detail

在日常開發裏,我們經常會碰到這樣的場景:
產品經理丟給你一份 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,這顯然不是我們想要的。

如果你需要的是數值結果,可以在導出前做兩件事:

  1. 讓 Excel 先算一遍公式;
  2. 把公式替換成計算結果。

代碼大概是這樣:

// 讓所有公式都計算一次
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官方教程。

user avatar cryptorzz Avatar software-Development Avatar
Favorites 2 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.