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

