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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:06:03