VS2013调试ASP.NET时ClosedXML读取Excel报初始化错误如何解决
根因说明
这个报错的核心原因是你在web.config中开启了身份模拟,Visual Studio 2013调试时运行的Web服务进程,使用模拟身份访问WPF相关的ETW追踪注册表项时权限不足,和Excel文件本身的访问权限无关。
解决方案
你可以按优先级选择以下任意一种方案解决:
- 方案1:使用内存流加载Excel(最稳妥无侵入)
修改ReadExcel方法中加载Excel的逻辑,先将文件读取到内存流再传入ClosedXML,绕开底层OpenXML组件访问注册表的逻辑,代码修改如下:
private DataTable ReadExcel(string filePath) { try { DataTable dt = new DataTable(); // 新增流加载逻辑 using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { using (var ms = new MemoryStream()) { fs.CopyTo(ms); ms.Position = 0; IXLWorkbook workBook = new XLWorkbook(ms); IXLWorksheet workSheet = workBook.Worksheet(1); bool firstRow = true; foreach (IXLRow row in workSheet.Rows()) { if (firstRow) { foreach (IXLCell cell in row.Cells()) { dt.Columns.Add(cell.Value.ToString()); } firstRow = false; } else { dt.Rows.Add(); int i = 0; foreach (IXLCell cell in row.Cells()) { dt.Rows[dt.Rows.Count - 1][i] = cell.Value.ToString(); i++; } } } return dt; } } } catch (Exception ex) { throw ex; } }
- 方案2:临时禁用ETW追踪(仅调试用)
在web.config的<appSettings>节点下新增如下配置,跳过ETW的注册表检查:
<add key="EnableEventTrace" value="false" />
调试正常后可删除该配置,不影响线上IIS运行逻辑。
- 方案3:修正注册表权限
打开注册表编辑器,依次找到以下两个路径:- 32位系统:
HKEY_LOCAL_MACHINE\Software\Microsoft\Avalon.Graphics - 64位系统:除上述路径外,还要找
HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Avalon.Graphics
右键点击项→权限→添加你在identity节点配置的模拟用户,授予【读取】权限后重启VS即可。
- 32位系统:
- 方案4:使用管理员权限启动VS
每次调试前右键点击Visual Studio 2013图标,选择【以管理员身份运行】,提升调试进程的系统权限即可规避权限不足问题。
内容的提问来源于stack exchange,提问作者Nandan hegde
相关产品推荐
相关产品推荐

