应彻底放弃 microsoft.office.interop.excel,改用 epplus(.net 5+)或 npoi(兼容 .net framework);前者通过 package.workbook.worksheets 获取表名,后者用 workbook.getsheetname(i) 遍历,二者均免 excel 依赖、纯托管、适合服务器部署。

用 Microsoft.Office.Interop.Excel 读取 Sheet 名,但别在服务器上用
直接调用 COM 组件最直观,但仅限 Windows 桌面环境,且必须装 Excel。服务器部署或无 GUI 场景下会崩溃或卡死。
常见错误现象:Retrieving the COM class factory for component with CLSID {...} failed due to the following error: 80040154 Class not registered —— 这是没装 Excel 或 32/64 位不匹配。
- 必须以
STAThread方式启动线程(WinForm/WPF 默认满足,控制台需手动加) - 每次打开后务必调用
workbook.Close()和application.Quit(),否则 Excel 进程残留 -
Sheets集合索引从 1 开始,不是 0;sheet.Name是安全的获取方式,别用sheet.[_Name]
推荐用 EPPlus(.NET 5+)或 NPOI(兼容旧版)
EPPlus 免依赖、纯托管、速度快,但只支持 .xlsx;NPOI 支持 .xls 和 .xlsx,但 API 略冗长。两者都不需要 Excel 安装。
安装命令:dotnet add package EPPlus 或 dotnet add package NPOI
- EPPlus 示例:打开文件后直接读
package.Workbook.Worksheets.Select(w => w.Name).ToArray() - NPOI 示例:用
HSSFWorkbook(xls)或XSSFWorkbook(xlsx),再调用GetSheetName(i)循环遍历NumberOfSheets - 注意 EPPlus 5.7+ 需要手动设置许可证(免费用于非商业用途),调用前加
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
用 OleDbConnection 查 Schema,适合只读且不想引入大包
本质是把 Excel 当数据库查,快、轻量,但有隐藏坑:驱动版本和扩展名强绑定,且首行会被默认当列名推断类型。
本文档主要介绍如何通过python对office excel进行读写操作,使用了xlrd、xlwt和xlutils模块。另外还演示了如何通过Tcl tcom包对excel操作。感兴趣的朋友可以过来看看
连接字符串示例:"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={path};Extended Properties='Excel 12.0 Xml;HDR=YES;'
- ACE 驱动需单独安装(x86/x64 必须和应用一致),
Microsoft.Jet.OLEDB.4.0只支持 .xls 且仅 x86 - 查询 sheet 列表要用
connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null),结果中TABLE_NAME字段带$后缀(如Sheet1$),需.TrimEnd('$') - 如果某 sheet 被隐藏,
TABLE_TYPE会是"SYSTEM TABLE",常规SELECT * FROM [Sheet1$]仍可查,但 Schema 表里可能被过滤掉
跨平台方案:用 SpreadsheetLight 或 DocumentFormat.OpenXml
OpenXml 更底层、更可控,但代码量翻倍;SpreadsheetLight 封装友好,但只支持 .xlsx 且更新慢。两者都要求明确知道 Excel 是 ZIP 结构,sheet 名存在 /xl/workbook.xml 中。
关键路径提取逻辑:var doc = SpreadsheetDocument.Open(path, false); var workbookPart = doc.WorkbookPart; foreach (var sheet in workbookPart.Workbook.Sheets.Elements<sheet>()) { yield return sheet.Name.Value; }</sheet>
- OpenXml 不依赖 Office,但需引用
DocumentFormat.OpenXml包,且对加密/损坏文件容忍度低 - SpreadsheetLight 的
SLDocument.GetSheetNames()最简洁,但不处理密码保护文件 - 所有 OpenXML 方案都无法读取 .xls,也不能识别宏表(
XLSM中的VBAPart不影响 sheet 列表)
真正麻烦的不是读名字,而是遇到加密 Excel、自定义分隔符 CSV 冒充 Excel、或者 Sheet 名含不可见字符(比如 \u200B 零宽空格)——这些情况连 Excel 自己都显示异常,得先做预检。










