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

Blazor Server项目中上传并读取.xlsx文件的实现方案求助

解决Blazor Server Excel文件上传与实体创建问题

1. 安装Excel处理依赖

先安装EPPlus(.NET生态常用的Excel处理库),可通过NuGet包管理器或终端命令完成:

dotnet add package EPPlus

2. 实现EnrollmentService中的Excel读取逻辑

假设你已有如下Enrollment实体类(可根据实际结构调整):

public class Enrollment
{
    public int StudentId { get; set; }
    public string CourseName { get; set; }
    public DateTime EnrollmentDate { get; set; }
    // 其他实体属性...
}

在EnrollmentService.cs中实现CreateEnrollmentByExcel方法:

using OfficeOpenXml;
using Microsoft.AspNetCore.Components.Forms;
using System.IO;

public class EnrollmentService
{
    // 注入数据库上下文用于保存实体(替换为你的DbContext类型)
    private readonly YourDbContext _dbContext;

    public EnrollmentService(YourDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public async Task CreateEnrollmentByExcel(InputFileChangeEventArgs e)
    {
        var uploadedFile = e.File;
        // 验证文件格式
        if (!uploadedFile.Name.EndsWith(".xlsx", StringComparison.OrdinalIgnoreCase))
        {
            throw new ArgumentException("仅支持.xlsx格式的Excel文件");
        }

        // EPPlus 5+版本需设置许可证上下文,非商用场景用NonCommercial
        ExcelPackage.LicenseContext = LicenseContext.NonCommercial;

        using (var memoryStream = new MemoryStream())
        {
            // 将上传的文件流复制到内存流
            await uploadedFile.OpenReadStream().CopyToAsync(memoryStream);
            memoryStream.Position = 0;

            using (var excelPackage = new ExcelPackage(memoryStream))
            {
                // 获取Excel中第一个工作表
                var worksheet = excelPackage.Workbook.Worksheets.FirstOrDefault();
                if (worksheet == null)
                {
                    throw new InvalidOperationException("Excel文件中未找到有效工作表");
                }

                // 从第2行开始读取(假设第1行为表头)
                var startRow = 2;
                var enrollmentList = new List<Enrollment>();

                for (int row = startRow; row <= worksheet.Dimension.End.Row; row++)
                {
                    // 按Excel列顺序映射实体属性,可根据你的表格结构调整列索引
                    var enrollment = new Enrollment
                    {
                        StudentId = int.TryParse(worksheet.Cells[row, 1].Text, out var id) ? id : 0,
                        CourseName = worksheet.Cells[row, 2].Text,
                        EnrollmentDate = DateTime.TryParse(worksheet.Cells[row, 3].Text, out var date) ? date : DateTime.MinValue
                        // 映射其他实体属性...
                    };

                    // 跳过无效数据行(可根据需求添加更严格的验证逻辑)
                    if (enrollment.StudentId == 0 || string.IsNullOrWhiteSpace(enrollment.CourseName))
                    {
                        continue;
                    }

                    enrollmentList.Add(enrollment);
                }

                // 将批量实体保存到数据库
                _dbContext.Enrollments.AddRange(enrollmentList);
                await _dbContext.SaveChangesAsync();
            }
        }
    }
}

3. 组件中完善服务注入与错误处理

确保在Blazor组件中正确注入服务,并添加基础错误处理:

@inject EnrollmentService EnrollmentService

<InputFile OnChange="@ImportExcelFile" accept=".xlsx" multiple="false"></InputFile>

@code {
    async Task ImportExcelFile(InputFileChangeEventArgs e)
    {
        try
        {
            await EnrollmentService.CreateEnrollmentByExcel(e);
            // 这里可添加上传成功后的提示逻辑(比如弹窗、状态文本更新)
        }
        catch (Exception ex)
        {
            // 处理错误,比如输出日志或显示错误信息
            Console.WriteLine($"上传失败:{ex.Message}");
        }
    }
}

关键注意事项

  • EPPlus许可证:若用于商业项目,需购买EPPlus商业许可证,非商用场景保持LicenseContext.NonCommercial配置即可。
  • 大文件支持:若需上传超过默认限制的大文件,可在Program.cs中调整配置:
builder.Services.Configure<BlazorInputFileOptions>(options =>
{
    options.MaxAllowedFileSize = 10 * 1024 * 1024; // 设置为10MB,可按需调整
});
  • 数据验证:建议在读取每行数据时添加更严格的校验规则,避免无效或错误数据进入数据库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:47:22