ExcelDataReader 是純 C# 實作、零相依性的開源庫,支援讀取 .xls (BIFF) 與 .xlsx (OpenXml) 格式,跨平台運行於 .NET Framework、.NET Core、Mono、Xamarin,極適合容器化、Linux 伺服器或行動裝置環境。
// NuGet
Install-Package ExcelDataReader
// .NET Core 另需註冊編碼提供者
Install-Package System.Text.Encoding.CodePages
// Program.cs 或 Startup.cs
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
| 介面/方法 | 用途 |
|---|---|
ExcelReaderFactory.CreateBinaryReader(stream) | 建立 .xls 讀取器 |
ExcelReaderFactory.CreateOpenXmlReader(stream) | 建立 .xlsx 讀取器 |
reader.AsDataSet() | 一次讀取所有工作表為 DataSet (每表一 DataTable) |
reader.IsFirstRowAsColumnNames = true | 將第一列作為欄位名 (預設 false) |
reader.Read() | 逐列前進 (IDataReader 模式),低記憶體 |
reader.GetDouble(0) / GetString(1)... | 依序號強型別取值 |
reader.Close() | 釋放資源 (實作 IDisposable) |
using (var stream = File.Open("report.xlsx", FileMode.Open, FileAccess.Read))
using (var reader = ExcelReaderFactory.CreateOpenXmlReader(stream))
{
reader.IsFirstRowAsColumnNames = true;
var ds = reader.AsDataSet();
foreach (DataTable table in ds.Tables)
{
Console.WriteLine($"Sheet: {table.TableName}, Rows: {table.Rows.Count}");
foreach (DataRow row in table.Rows)
{
Console.WriteLine($"{row[0]}\t{row[1]}\t{row[2]}");
}
}
}
using (var stream = File.Open("huge.xls", FileMode.Open, FileAccess.Read))
using (var reader = ExcelReaderFactory.CreateBinaryReader(stream))
{
reader.IsFirstRowAsColumnNames = true;
do
{
while (reader.Read())
{
// 逐列處理,不載入整份資料到記憶體
var colA = reader.GetString(0);
var colB = reader.GetDouble(1);
var colC = reader.GetDateTime(2);
ProcessRow(colA, colB, colC);
}
} while (reader.NextResult()); // 移至下一工作表
}
Dim stream = File.Open("report.xlsx", FileMode.Open, FileAccess.Read)
Dim reader = ExcelReaderFactory.CreateOpenXmlReader(stream)
reader.IsFirstRowAsColumnNames = True
Dim ds = reader.AsDataSet()
For Each table As DataTable In ds.Tables
Console.WriteLine($"Sheet: {table.TableName}")
For Each row As DataRow In table.Rows
Console.WriteLine($"{row(0)}\t{row(1)}")
Next
Next
reader.Close()
stream.Close()
ExcelReaderFactory.CreateBinaryReader(stream, new ExcelReaderConfiguration { FallbackEncoding = Encoding.GetEncoding("gb2312") })。GetDateTime 會自動轉換;若讀到 Double 需自行 DateTime.FromOADate(val)。ExcelDataReader 以 **輕量、跨平台、零依賴** 解決「純讀取 Excel」 90% 的需求。配合 IsFirstRowAsColumnNames 與 AsDataSet() 可快速原型;大檔案改用 Read()/NextResult() 串流模式,記憶體占用極低。寫入/修改/公式計算請改用 EPPlus、ClosedXML 或 NPOI。