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
相关产品推荐
相关产品推荐

