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

C#使用ClosedXML读取Excel报错FileMode或FileAccess对流无效如何解决

解决方案

直接报错原因修正

你当前触发报错的核心问题是FileStream的打开模式和权限配置错误:你使用FileMode.OpenOrCreate+FileAccess.Write的组合创建流,而XLWorkbook初始化时需要读取流的内容,仅授予写权限的流无法满足读取需求,直接触发权限不合法的异常。
将FileStream实例化的代码修改为如下内容即可解决当前报错:

using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read))

你是读取已存在的Excel文件,不需要OpenOrCreate新建文件,使用FileMode.Open指定打开已有文件,授予FileAccess.Read读取权限即可满足ClosedXML的读取要求。

隐藏逻辑问题修正

你补充的代码存在两个Excel操作库混用的逻辑错误,后续也会触发其他异常:

  • 你用Microsoft.Office.Interop.Excel打开了目标Excel文件,还将Interop库的Worksheet对象作为参数传给了ClosedXML的workBook.Worksheet(worksheet)方法,两个库的工作表类型完全不兼容,ClosedXML的该方法仅支持传入工作表名称(字符串)或者工作表序号(int类型,从1开始计数),传入Interop的对象会触发类型不匹配错误。
  • Interop打开Excel文件后会锁定文件,即使你修复了流权限问题,ClosedXML也会因为文件被占用无法打开。
  • 你完全不需要同时使用两个库操作Excel,直接删掉Interop相关的代码,给GetDataFromExcel方法传入工作表序号(比如1)或者工作表名称字符串即可,不需要提前用Interop打开文件。

额外优化建议

  • 现有代码中的空catch块建议补充异常日志或者错误提示,避免数据读取失败却无任何感知的问题。
  • 如果你后续确实要使用Interop操作Excel,操作完成后必须手动释放COM对象,否则会留下后台Excel进程持续占用文件,释放逻辑示例:
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelRange);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelSheet);
excelBook.Close();
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelBook);
excelApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:30:01