C#中如何按课程完成等级拆分数据以生成多工作表Excel报告
实现方案
1. 调整数据分组逻辑
首先修改Provider类中的数据处理逻辑,将拿到的全量课程数据按完成等级拆分,你可以复用原有的Mapper规则:
// 首先定义分组后的报告数据结构,也可以直接用Dictionary<string, List<导出DTO>>传递给导出逻辑 public class SplitCourseReport { public List<CourseExportDto> Level1Courses { get; set; } = new(); public List<CourseExportDto> Level2Courses { get; set; } = new(); public List<CourseExportDto> Level3Courses { get; set; } = new(); } public async Task<SplitCourseReport> GetSplitReport(string sId) { var allCourses = await dbAccess.GetCoursesForReport(sId); // 按等级字段拆分,注意替换为你实际的课程等级字段名 return new SplitCourseReport { Level1Courses = allCourses.Where(c => c.CompletionLevel == "level1") .Select(c => studentReportMapper.Map(c)) .ToList(), Level2Courses = allCourses.Where(c => c.CompletionLevel == "level2") .Select(c => studentReportMapper.Map(c)) .ToList(), Level3Courses = allCourses.Where(c => c.CompletionLevel == "level3") .Select(c => studentReportMapper.Map(c)) .ToList() }; }
2. 多工作表Excel生成逻辑(以常用的EPPlus库为例)
原来的单工作表样式、表头配置、格式规则都可以直接复用,仅需要调整为按分组创建多个工作表:
public byte[] GenerateMultiSheetExcel(SplitCourseReport reportData) { using var package = new ExcelPackage(); // 配置三个工作表的对应关系 var sheetConfigs = new List<(string SheetName, List<CourseExportDto> Data)> { ("level1", reportData.Level1Courses), ("level2", reportData.Level2Courses), ("level3", reportData.Level3Courses) }; foreach (var config in sheetConfigs) { var worksheet = package.Workbook.Worksheets.Add(config.SheetName); if (config.Data.Any()) { // 加载数据到当前工作表,可直接复用你原有的样式、列宽、格式设置逻辑 worksheet.Cells["A1"].LoadFromCollection(config.Data, PrintHeaders: true); } else { // 可选:无对应等级数据时的提示内容 worksheet.Cells["A1"].Value = "暂无该等级的课程数据"; } } return package.GetAsByteArray(); }
3. 接口与前端适配
- 后端接口将生成的Excel字节数组以
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet类型返回即可 - 前端Angular无需调整逻辑,沿用原有下载文件流的处理规则即可
注意事项
- 如果你使用的是NPOI、ClosedXML等其他Excel操作库,逻辑完全一致:仅需遍历三个等级的数据集,每个数据集新建对应名称的工作表写入数据即可
- 如果不需要保留无数据的空工作表,可加判断跳过无数据的等级
内容的提问来源于stack exchange,提问作者rissa
相关产品推荐
相关产品推荐

