首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

輕量跨平台讀取 Excel:ExcelDataReader 庫快速上手指南

     編輯:ASP.NET 基礎

專案簡介

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);

核心 API 速覽

介面/方法用途
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)

完整範例:DataSet 模式 (適合中小檔案)

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]}");
        }
    }
}

完整範例:DataReader 模式 (大檔案、串流處理)

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()); // 移至下一工作表
}

VB.NET 版本

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()

常見坑與對策

  • 編碼錯誤:.xls 內部編碼多樣,若中文亂碼,嘗試指定 ExcelReaderFactory.CreateBinaryReader(stream, new ExcelReaderConfiguration { FallbackEncoding = Encoding.GetEncoding("gb2312") })。
  • 日期數值:Excel 日期儲存為 OADate (Double),GetDateTime 會自動轉換;若讀到 Double 需自行 DateTime.FromOADate(val)。
  • 合併儲存格:庫不支援合併儲存格資訊,合併區域僅第一格有值,其餘為 null/空字串。
  • 公式:僅讀取**快取值**,不計算公式。若需計算,需搭配 NPOI 或 EPPlus。

結語

ExcelDataReader 以 **輕量、跨平台、零依賴** 解決「純讀取 Excel」 90% 的需求。配合 IsFirstRowAsColumnNames 與 AsDataSet() 可快速原型;大檔案改用 Read()/NextResult() 串流模式,記憶體占用極低。寫入/修改/公式計算請改用 EPPlus、ClosedXML 或 NPOI。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved