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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 12:45:19