-
Excel操作——用C#开发学生成绩表生成(EPPlus)
第一部分:C#基础入门
10.Excel操作——学生成绩表生成(EPPlus)
实例介绍
EPPlus是.NET生态中最流行的Excel文件处理库(支持.xlsx格式),它无需依赖Microsoft Office,就能快速实现Excel的创建、读取、修改和格式设置。学生成绩表生成是EPPlus的典型应用场景:从内存数据(如学生成vb.net教程C#教程python教程SQL教程access 2010教程绩列表)生成带格式的Excel文件,包含表头样式、数据计算(总分/平均分)、条件格式(不及格标红)等,满足教学或办公场景的需求。
注意:EPPlus 5.x及以上版本对商业用途需要购买License,非商业用途可免费使用;若需商业使用,建议选择EPPlus 4.x(MIT协议)或确认License条款。
需求分析
-
业务场景
模拟班级学生成绩统计,生成包含以下内容的Excel表:
基础字段:学号、姓名、语文、数学、英语;
计算字段:总分(三科之和)、平均分(三科平均);
统计信息:班级平均分、最高分(每科及总分);
格式要求:
表头:加粗、居中、浅灰色背景;
数据行:学号左对齐,姓名居中,科目成绩右对齐;
计算字段:总分用蓝色字体,平均分用绿色字体;
条件格式:不及格(<60)的科目成绩标红(字体或背景);
输出:保存为“班级成绩表.xlsx”文件。 -
核心功能
动态填充学生成绩数据;
自动计算总分和平均分(用Excel公式,而非内存计算);
批量设置单元格样式;
添加条件格式规则;
生成统计行并设置醒目样式。
代码实现
前置准备
1.安装EPPlus:通过NuGet安装(示例用EPPlus 4.5.3.3,MIT协议):
bash
Install-Package EPPlus -Version 4.5.3.3
2.引用命名空间:
csharp
using OfficeOpenXml;
using OfficeOpenXml.Style;
using System;
using System.Collections.Generic;
using System.IO;
using System.Drawing;
完整代码
csharp
// ==================== 1. 学生成绩模型 ====================
public class StudentScore
{
public string StudentId { get; set; } = string.Empty;
public string Name { get; set; } = string.Empty;
public int Chinese { get; set; }
public int Math { get; set; }
public int English { get; set; }
}
// ==================== 2. Excel成绩表生成类 ====================
public static class ExcelScoreGenerator
{
public static void GenerateScoreSheet(List<StudentScore> scores, string outputPath)
{
// 1. 创建Excel包(使用using确保资源释放)
using var package = new ExcelPackage();
// 2. 添加工作表(命名为"班级成绩表")
var worksheet = package.Workbook.Worksheets.Add("班级成绩表");
// 3. 设置表头(第1行)
var headerRange = worksheet.Cells["A1:G1"]; // 表头覆盖A到G列
headerRange.Value = new object[] { "学号", "姓名", "语文", "数学", "英语", "总分", "平均分" };
// 4. 设置表头样式
headerRange.Style.Font.Bold = true; // 加粗
headerRange.Style.Font.Size = 12;
headerRange.Style.Font.Color.SetColor(Color.White); // 字体白色
headerRange.Style.Fill.PatternType = ExcelFillStyle.Solid;
headerRange.Style.Fill.BackgroundColor.SetColor(Color.DarkSlateGray); // 背景深灰
headerRange.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; // 居中对齐
headerRange.Style.VerticalAlignment = ExcelVerticalAlignment.Center;
headerRange.Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.Black); // 边框
// 5. 填充学生数据(从第2行开始)
int rowIndex = 2;
foreach (var score in scores)
{
worksheet.Cells[rowIndex, 1].Value = score.StudentId; // A列:学号
worksheet.Cells[rowIndex, 2].Value = score.Name; // B列:姓名
worksheet.Cells[rowIndex, 3].Value = score.Chinese; // C列:语文
worksheet.Cells[rowIndex, 4].Value = score.Math; // D列:数学
worksheet.Cells[rowIndex, 5].Value = score.English; // E列:英语
// 计算总分(F列:SUM(Cx:Ex))
worksheet.Cells[rowIndex, 6].Formula = $"SUM(C{rowIndex}:E{rowIndex})";
// 计算平均分(G列:AVERAGE(Cx:Ex),保留1位小数)
worksheet.Cells[rowIndex, 7].Formula = $"ROUND(AVERAGE(C{rowIndex}:E{rowIndex}),1)";
rowIndex++;
}
// 6. 设置数据行样式
var dataRange = worksheet.Cells["A2:G" + (rowIndex-1)];
dataRange.Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.LightGray); // 数据行边框
dataRange.Style.VerticalAlignment = ExcelVerticalAlignment.Center;
// 单独设置列对齐:学号左对齐,姓名居中,科目右对齐
worksheet.Column(1).Style.HorizontalAlignment = ExcelHorizontalAlignment.Left;
worksheet.Column(2).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
worksheet.Columns[3,5].Style.HorizontalAlignment = ExcelHorizontalAlignment.Right; // C-E列(科目)
worksheet.Columns[6,7].Style.HorizontalAlignment = ExcelHorizontalAlignment.Right; // F-G列(计算字段)
// 设置计算字段颜色:总分蓝色,平均分绿色
worksheet.Column(6).Style.Font.Color.SetColor(Color.Blue);
worksheet.Column(7).Style.Font.Color.SetColor(Color.Green);
// 7. 添加条件格式:不及格科目(<60)标红
var failRule = worksheet.Cells["C2:E" + (rowIndex-1)].ConditionalFormatting.AddCellValueCondition(ExcelConditionalFormattingRuleType.LessThan);
failRule.Formula = "60";
failRule.Style.Font.Color.SetColor(Color.Red);
failRule.Style.Font.Bold = true;
// 8. 添加统计行(最后一行)
int statsRow = rowIndex;
worksheet.Cells[statsRow,1].Value = "班级统计";
worksheet.Cells[statsRow,3].Formula = $"MAX(C2:C{rowIndex-1})"; // 语文最高分
worksheet.Cells[statsRow,4].Formula = $"MAX(D2:D{rowIndex-1})"; // 数学最高分
worksheet.Cells[statsRow,5].Formula = $"MAX(E2:E{rowIndex-1})"; // 英语最高分
worksheet.Cells[statsRow,6].Formula = $"MAX(F2:F{rowIndex-1})"; // 总分最高分
worksheet.Cells[statsRow,7].Formula = $"ROUND(AVERAGE(G2:G{rowIndex-1}),1)"; // 班级平均分
// 设置统计行样式
var statsRange = worksheet.Cells[statsRow,1:7];
statsRange.Style.Font.Bold = true;
statsRange.Style.Fill.BackgroundColor.SetColor(Color.LightYellow);
// 9. 自动调整列宽
worksheet.Cells.AutoFitColumns();
// 10. 保存到文件
File.WriteAllBytes(outputPath, package.GetAsByteArray());
Console.WriteLine($"✅ 成绩表已生成:{outputPath}");
}
}
// ==================== 3. 测试程序 ====================
class Program
{
static void Main(string[] args)
{
// 模拟学生成绩数据
var students = new List<StudentScore>
{
new StudentScore { StudentId = "2025001", Name = "张三", Chinese = 85, Math = 92, English = 78 },
new StudentScore { StudentId = "2025002", Name = "李四", Chinese = 70, Math = 58, English = 82 },
new StudentScore { StudentId = "2025003", Name = "王五", Chinese = 95, Math = 88, English = 90 },
new StudentScore { StudentId = "2025004", Name = "赵六", Chinese = 55, Math = 72, English = 65 }
};
// 生成Excel文件(保存到当前目录)
string outputPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "班级成绩表.xlsx");
ExcelScoreGenerator.GenerateScoreSheet(students, outputPath);
}
}
逐行讲解
-
模型类(StudentScore)
封装学生成绩的基础字段,与Excel表的列一一对应,方便数据传递。 -
Excel生成核心步骤
(1)创建Excel包
using var package = new ExcelPackage();
使用using语句确保资源自动释放(EPPlus实现了IDisposable);
ExcelPackage是EPPlus的入口类,代表整个Excel文件。
(2)添加工作表
var worksheet = package.Workbook.Worksheets.Add("班级成绩表");
每个Excel文件可包含多个工作表,用Add方法创建并命名。
(3)表头设置
headerRange = worksheet.Cells["A1:G1"]:选中表头的单元格范围(A1到G1);
样式设置:加粗、白色字体、深灰背景、居中对齐、边框——让表头醒目易读;
BorderAround:给表头添加边框,增强视觉效果。
(4)填充数据与计算
数据填充:循环学生列表,将每个字段写入对应单元格(行号从2开始,跳过表头);
公式使用:
oSUM(C{rowIndex}:E{rowIndex}):计算当前行的三科总分(C到E列);
oROUND(AVERAGE(...),1):计算平均分并保留1位小数,避免小数位数过多;
EPPlus会自动计算公式结果(无需手动触发)。
(5)数据样式与条件格式
列对齐:根据字段类型设置对齐方式(学号左对齐、姓名居中、成绩右对齐);
计算字段颜色:用不同颜色区分总分和平均分,提升可读性;
条件格式:AddCellValueCondition添加“小于60”的规则,将不及格成绩标红——直观识别问题。
(6)统计行与自动列宽
统计行:用MAX公式计算每科最高分,AVERAGE计算班级平均分;
AutoFitColumns:自动调整列宽,避免内容被截断。
(7)保存文件
File.WriteAllBytes(outputPath, package.GetAsByteArray());
将Excel包转换为字节数组,写入文件——生成最终的.xlsx文件。
基础知识拓展 - EPPlus核心类
| 类名 | 作用 |
|---|---|
| ExcelPackage | 代表整个Excel文件,管理工作表、样式、设置等。 |
| ExcelWorksheet | 代表单个工作表,处理单元格、公式、条件格式等。 |
| ExcelRange | 代表单元格范围(单个或多个),用于设置样式、值、公式。 |
| ExcelStyle | 代表单元格样式(字体、颜色、填充、对齐、边框等)。 |
| ExcelConditionalFormatting | 管理条件格式规则。 |
-
样式设置常见技巧
批量操作:优先选中单元格范围(如worksheet.Cells["A2:G10"])再设置样式,避免逐个单元格操作(性能更高);
样式复用:创建通用样式(如“表头样式”“数据样式”),通过Copy方法复用(style1.Copy(style2));
边框设置:除了BorderAround,还可设置单个边框(如Style.Border.Left.Style = ExcelBorderStyle.Thin)。 -
公式与函数
EPPlus支持Excel的所有内置函数(如SUM、AVERAGE、MAX、VLOOKUP等);
公式中的单元格引用需用Excel格式(如A1、C2:C10),注意行号列号的动态拼接;
若需手动触发公式计算,可调用worksheet.Calculate()。 -
性能优化
大数据量:避免频繁访问Cells,改用Range批量操作;使用worksheet.WriteValue方法批量写入数据;
禁用自动计算:对于百万行数据,可先禁用公式计算(package.Workbook.Calculate=false),填充完成后再启用;
压缩:保存时可设置压缩级别(package.CompressionLevel = CompressionLevel.Fastest)。 -
EPPlus版本差异
| 版本 | 特点 |
| ---- | ---- |
| 4.x | MIT协议,免费商用;功能完整,但不支持最新Excel特性(如动态数组)。 |
| 5.x+ | 支持最新Excel特性;非商业用途免费,商业用途需购买License;性能提升。 |
扩展思考
1.读取Excel:如何用EPPlus读取已有的成绩表并解析为StudentScore列表?
o用ExcelPackage.Load方法加载文件,遍历工作表的行和列,提取数据。
2.添加图表:如何在成绩表中添加“成绩分布柱状图”?
o使用worksheet.Drawings.AddChart方法,设置图表类型、数据源、标题等。
3.合并单元格:如何将统计行的“班级统计”合并为跨列单元格?
oworksheet.Cells[statsRow,1:2].Merge = true(合并A-B列)。
4.导出PDF:EPPlus 5.x支持将Excel导出为PDF,需引用EPPlus.Pdf包。
5.大数据量处理:对于10万行以上的数据,建议使用ExcelRangeBase.LoadFromCollection方法批量加载数据,提升性能。
总结
EPPlus是.NET开发者处理Excel的“瑞士军刀”——它不仅能快速生成Excel文件,还能精细控制格式、公式和条件格式,满足从简单报表到复杂统计的需求。本节通过学生成绩表的实例,覆盖了EPPlus的核心用法:从基础的单元格操作到高级的样式和条件格式设置。
在实际项目中,EPPlus常用于生成报表(如销售报表、财务报表)、导出数据(如用户列表、订单记录)、批量导入数据等场景。掌握EPPlus的关键是理解单元格范围的操作和样式的批量设置,同时注意性能优化和版本License问题。
通过本节学习,你可以快速上手EPPlus,并将其应用到自己的项目中,提升数据可视化和办公自动化的效率。
本站原创,转载请注明出处:https://www.xin3721.com/ArticlecSharp/c49422.html










