OleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null) 可取得 Excel 檔案的結構描述資訊,包含所有工作表、命名區域等物件。透過過濾 TABLE_NAME 欄位即可列出使用者可見的工作表名稱。
private string[] GetExcelSheetNames(string filePath)
{
string ext = Path.GetExtension(filePath).ToLower();
string connStr = ext == ".xls"
? "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=1;'"
: "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=1;'";
using (var conn = new OleDbConnection(connStr))
{
conn.Open();
// 取得 Tables 結構描述
DataTable schema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
if (schema == null) return Array.Empty();
var list = new List();
foreach (DataRow row in schema.Rows)
{
string rawName = row["TABLE_NAME"].ToString(); // 例如 "Sheet1$" 或 "'Sheet 2'$"
// 有效工作表名稱特徵:包含 $ 且去除單引號後以 $ 結尾
string cleaned = rawName.Replace("'", "");
if (cleaned.Contains("$") && cleaned.EndsWith("$"))
{
// 移除尾端 $ 取得真實工作表名稱
list.Add(cleaned.Substring(0, cleaned.Length - 1));
}
}
return list.ToArray();
}
}
TABLE_NAME 可能值:Sheet1$、'Sheet 2'$、_FilterDatabase (自動篩選)、Print_Titles (列印標題) 等系統命名區域。Contains("$") && EndsWith("$") 可有效排除系統物件,僅保留真實工作表。string file = @"C:\Data\Report.xlsx";
string[] sheets = GetExcelSheetNames(file);
foreach (var s in sheets)
Console.WriteLine($"工作表: {s}");
// 輸出範例:
// 工作表: Sheet1
// 工作表: Sales Data
// 工作表: Summary
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.HSSF.UserModel;
public string[] GetSheetNamesNPOI(string filePath)
{
using (var fs = File.OpenRead(filePath))
{
IWorkbook wb = Path.GetExtension(filePath).ToLower() == ".xls"
? new HSSFWorkbook(fs)
: new XSSFWorkbook(fs);
return Enumerable.Range(0, wb.NumberOfSheets)
.Select(i => wb.GetSheetAt(i).SheetName)
.ToArray();
}
}
NPOI 純 managed、跨平台、無相依性,建議新專案優先採用。
原文連結:https://www.bianceng.cn/Programming/csharp/201410/45597.htm