Blazor .NET8+EPPlus7.0.6读取Excel工作表出现范围错误求助
.NET 8 Blazor Server中EPPlus读取Excel工作表为空的问题
在.NET 8环境的Blazor Server项目中,使用EPPlus 7.0.6读取一个仅含1个工作表的现有Excel文件时,Worksheets集合计数为0。尝试两种读取方式均失败:
通过索引读取:
using var package = new ExcelPackage("spreadsheet.xlsx"); var sheet = package.Workbook.Worksheets[0];
通过工作表名称读取:
using var package = new ExcelPackage("spreadsheet.xlsx"); var sheet = package.Workbook.Worksheets["name"];
该功能在.NET 7控制台程序中可正常运行,但在Blazor项目中无法识别工作表,更换旧版EPPlus结果一致。完整Blazor页面代码如下:
@using OfficeOpenXml <PageTitle>Home</PageTitle> <h1>Test Spreadsheet</h1> @if (errors.Any()) { <h2>Errors</h2> <ul class="text-danger"> @foreach (var e in errors) { <li>@e</li> } </ul> } @code { private List<string> errors = new(); protected override void OnInitialized() { errors.Clear(); try { using var package = new ExcelPackage("spreadsheet.xlsx"); var sheet = package.Workbook.Worksheets[0]; } catch (Exception ex) { errors.Add(ex.Message); } } }
问题原因
这并非EPPlus的Bug,核心是Blazor Server与控制台程序的工作目录不同:
- 控制台程序默认工作目录为项目输出目录(如
bin/Debug/net7.0/),Excel文件若在此目录可被正确读取。 - Blazor Server默认工作目录为IIS Express的运行目录(通常是
C:\Program Files\IIS Express\),或部署后的服务器目录,代码中使用相对路径时根本找不到目标Excel文件,导致Worksheets集合为空。
解决方案
方案1:使用wwwroot目录+绝对路径
将Excel文件放入项目的wwwroot目录,通过IWebHostEnvironment获取绝对路径:
@using OfficeOpenXml @inject IWebHostEnvironment env <PageTitle>Home</PageTitle> <h1>Test Spreadsheet</h1> @if (errors.Any()) { <h2>Errors</h2> <ul class="text-danger"> @foreach (var e in errors) { <li>@e</li> } </ul> } @code { private List<string> errors = new(); protected override void OnInitialized() { errors.Clear(); try { var filePath = Path.Combine(env.WebRootPath, "spreadsheet.xlsx"); using var package = new ExcelPackage(new FileInfo(filePath)); var sheet = package.Workbook.Worksheets[0]; } catch (Exception ex) { errors.Add(ex.Message); } } }
方案2:复制文件到输出目录+使用程序基目录
右键Excel文件 → 属性 → 复制到输出目录选择「如果较新则复制」或「始终复制」,再通过AppContext.BaseDirectory获取输出目录路径:
var filePath = Path.Combine(AppContext.BaseDirectory, "spreadsheet.xlsx"); using var package = new ExcelPackage(new FileInfo(filePath));
内容的提问来源于stack exchange,提问作者Ross McLeod
相关产品推荐
相关产品推荐

