目錄
ToggleC# 將 Excel 匯入 DataTable 教學總覽
在專案管理、資料分析或企業報表開發中,經常需要將Excel檔案中的資料匯入C#應用程式進行後續處理。無論是批次匯入專案任務、整合團隊績效數據,還是自動化資料清洗,將Excel轉為DataTable都是不可或缺的技能。本文將以實務導向,系統性解析如何以C#將Excel資料匯入DataTable,並針對常見需求、錯誤與進階應用提出具體解法。
常見應用情境:
– 專案管理系統批次匯入任務清單
– 團隊績效或考勤資料自Excel自動整合
– 資料庫批次更新或資料清洗前置處理
– 報表自動產生、資料驗證
支援格式與對象:
– 支援.xls(Excel 97-2003)、.xlsx(Excel 2007以上)等主流格式
– 適用於專案經理、開發人員、資料分析師及需自動化處理Excel資料的知識工作者
常見解決方案比較
ExcelDataReader vs NPOI vs EPPlus vs OpenXml
在C#生態系中,讀取Excel的主流方案有多種,各有優缺點。選擇合適的工具,能大幅提升開發效率與穩定性。
套件名稱 | 支援格式 | 主要優點 | 主要限制/授權 | 適用情境 |
---|---|---|---|---|
ExcelDataReader | .xls, .xlsx | 輕量、速度快、易於將資料轉DataTable | 僅讀取,不支援寫入 | 快速讀取大檔案、資料匯入 |
NPOI | .xls, .xlsx | 讀寫皆可、支援格式豐富 | API較複雜 | 需同時讀寫Excel、複雜格式處理 |
EPPlus | .xlsx | 讀寫皆可、API友善、支援公式 | 商用需授權 | .xlsx格式處理、需寫入功能 |
OpenXml SDK | .xlsx | 微軟官方、效能佳、細緻控制 | 學習曲線高 | 需精細操作、複雜自訂需求 |
實務建議:
若僅需將Excel資料讀取為DataTable,推薦使用ExcelDataReader,簡單高效。若需同時寫入或處理複雜格式,則可考慮NPOI或EPPlus。
準備工作
安裝與設定必要套件
- 開啟Visual Studio,於專案上點選「管理NuGet套件」。
- 搜尋並安裝
ExcelDataReader
及ExcelDataReader.DataSet
。 - 建議選用穩定版本,並確認相依性自動安裝。
專案環境需求
- .NET Framework 4.5以上或.NET Core 2.0以上
- 適用於Windows、Linux等多平台
- 建議使用Visual Studio 2019以上或VS Code搭配C#擴充
實作步驟詳解
匯入命名空間
於程式碼檔案頂部加入:
using System.Data;
using System.IO;
using ExcelDataReader;
註冊編碼提供者(必要性說明)
若需支援舊版Excel(.xls)或多語系檔案,需註冊編碼:
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
讀取Excel並轉為DataTable(完整範例程式碼)
以下為完整流程,含多Sheet選擇、標題列處理與例外處理:
public DataTable ReadExcelToDataTable(string filePath, string sheetName = null, bool useHeaderRow = true)
{
// 註冊編碼,支援多語系及舊格式
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
using (var stream = File.Open(filePath, FileMode.Open, FileAccess.Read))
using (var reader = ExcelReaderFactory.CreateReader(stream))
{
var conf = new ExcelDataSetConfiguration
{
ConfigureDataTable = _ => new ExcelDataTableConfiguration
{
UseHeaderRow = useHeaderRow
}
};
var dataSet = reader.AsDataSet(conf);
// 若未指定Sheet,預設取第一個
DataTable dt;
if (string.IsNullOrEmpty(sheetName))
dt = dataSet.Tables[0];
else if (dataSet.Tables.Contains(sheetName))
dt = dataSet.Tables[sheetName];
else
throw new ArgumentException("指定的Sheet不存在");
return dt;
}
}
細節說明:
– UseHeaderRow
:是否將第一列作為欄位名稱
– sheetName
:可指定要讀取的工作表
– 例外處理:檔案不存在、格式錯誤、Sheet不存在時會拋出明確錯誤
常見錯誤與除錯建議
錯誤情境 | 可能原因 | 解決方式 |
---|---|---|
檔案開啟失敗 | 檔案路徑錯誤、權限不足 | 檢查路徑與權限 |
格式不支援 | 非Excel檔案、損毀 | 確認檔案格式、嘗試另存新檔 |
亂碼/中文顯示異常 | 未註冊編碼提供者 | 加入Encoding.RegisterProvider |
Sheet名稱錯誤 | 指定名稱拼寫錯 | 使用dataSet.Tables檢查所有名稱 |
讀取資料不完整 | 有合併儲存格、空白列 | 需進一步處理DataTable內容 |
實務案例:
某專案團隊每月需將人事部門提供的考勤Excel匯入系統,初期常遇到亂碼與Sheet名稱不一致問題。透過上述例外處理與Sheet名稱檢查,顯著降低人工錯誤。
進階應用與最佳實踐
處理大檔案與效能優化
- 讀取大檔案時,建議僅載入必要Sheet,避免一次載入全部資料造成記憶體壓力。
- 可分批處理DataTable內容,或結合資料庫批次匯入。
- 若Excel檔案超過數十萬筆資料,建議先以Excel進行分割或清理。
DataTable後續操作(如匯入資料庫、資料驗證)
- 可直接將DataTable透過ADO.NET批次匯入SQL Server、MySQL等資料庫。
- 進行資料驗證(如欄位格式、重複值檢查)後再進行後續處理。
- 可結合自動化工具(如Monday.com)進行任務分派或專案資料整合,提升團隊協作效率。
實際案例分享
專案管理資料匯入:
某科技公司導入ClickUp作為專案管理平台,定期將外部供應商提供的Excel進度表自動匯入系統。透過C#自動化匯入流程,結合DataTable資料驗證與分派,顯著提升專案透明度與協作效率。
FAQ:常見問題解答
Q1:Excel有合併儲存格,匯入後資料會亂嗎?
A:合併儲存格會導致DataTable僅保留左上角的值,其他儲存格為空。建議匯入前先於Excel取消合併,或於程式中補齊空值。
Q2:遇到空白列或格式不符怎麼辦?
A:可於DataTable載入後,程式自動過濾空白列,或檢查欄位格式後進行資料清洗。
Q3:如何只匯入特定Sheet?
A:於程式中指定sheetName
參數即可,若名稱不符會拋出例外。
Q4:讀取速度慢怎麼辦?
A:建議僅載入必要Sheet與欄位,或將大檔案分割處理。
Q5:Excel檔案損毀或權限不足怎麼辦?
A:請先於本機手動打開檔案確認可用性,並檢查檔案權限設定。
結論與工具推薦
將Excel資料匯入DataTable是專案管理、團隊協作及資料分析中的常見需求。選擇合適的C#套件(如ExcelDataReader),能大幅簡化流程、提升效率。建議依據實際需求選擇工具,並針對多Sheet、格式異常等情境做好例外處理。若需進一步整合任務管理、協作或自動化流程,可考慮結合Monday.com、ClickUp等現代化專案管理平台,讓資料流轉與團隊合作更順暢。