You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#读取Excel工作表时始终获取错误工作表的问题求助

解决Excel Interop始终读取最后一个工作表的问题

问题现象

尝试读取包含5个工作表的Excel工作簿,无论使用索引还是名称,始终只能获取最后一个工作表:

  • 使用索引Worksheets[4],返回第5个工作表
  • 使用名称Worksheets["Table 4"],仍返回名为Table 5的工作表

排查与解决步骤

1. 确认打开的文件是否正确

首先验证代码中打开的文件路径是否指向目标文件,避免因路径错误打开了其他同名文件:

string filePath = System.AppDomain.CurrentDomain.BaseDirectory + @"Tables.xlsx";
Console.WriteLine("代码指定路径:" + filePath);

Application xlApp = new Application();
Workbook xlWorkbook = xlApp.Workbooks.Open(filePath);
Console.WriteLine("实际打开文件:" + xlWorkbook.FullName);

如果实际打开的文件不是目标文件,检查CurrentDomain.BaseDirectory的实际输出,调整路径拼接逻辑。

2. 遍历所有工作表,确认实际列表

视觉上的工作表顺序和名称可能与代码中读取的集合不符(比如存在隐藏工作表),遍历输出所有工作表的索引和名称:

foreach (Worksheet sheet in xlWorkbook.Worksheets)
{
    Console.WriteLine($"索引:{sheet.Index},名称:{sheet.Name}");
}

通过输出结果可以明确:

  • 目标工作表的真实索引(Office Interop的Worksheets集合默认是1-based索引)
  • 目标工作表的准确名称(包括空格、大小写、特殊字符是否与代码中一致)

3. 修正工作表获取逻辑

根据遍历得到的真实信息,调整代码:

  • 如果是索引问题:比如目标工作表的真实索引是4,直接使用Worksheets[4];如果前面有隐藏工作表导致索引偏移,使用对应真实索引
  • 如果是名称问题:严格按照遍历得到的名称字符串获取,比如名称是"Table4"(无空格),则调整为Worksheets["Table4"]

4. 清理Excel进程残留

如果之前的代码没有正确释放Excel COM对象,可能导致进程残留,读取的是缓存的旧文件。使用完Excel对象后务必释放:

// 先执行你的业务逻辑
Range xlRange = xlWorksheet.UsedRange;
// ... 业务代码 ...

// 清理COM对象
xlRange = null;
xlWorksheet = null;
xlWorkbook.Close();
xlApp.Quit();

System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorksheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);

内容的提问来源于stack exchange,提问作者Nicole Phillips

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 08:55:17