VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > c#编程 >
  • 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条款。
需求分析

  1. 业务场景
    模拟班级学生成绩统计,生成包含以下内容的Excel表:
    基础字段:学号、姓名、语文、数学、英语;
    计算字段:总分(三科之和)、平均分(三科平均);
    统计信息:班级平均分、最高分(每科及总分);
    格式要求:
    表头:加粗、居中、浅灰色背景;
    数据行:学号左对齐,姓名居中,科目成绩右对齐;
    计算字段:总分用蓝色字体,平均分用绿色字体;
    条件格式:不及格(<60)的科目成绩标红(字体或背景);
    输出:保存为“班级成绩表.xlsx”文件。
  2. 核心功能
    动态填充学生成绩数据;
    自动计算总分和平均分(用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);
	}
	}

逐行讲解

  1. 模型类(StudentScore)
    封装学生成绩的基础字段,与Excel表的列一一对应,方便数据传递。
  2. 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文件。
    基础知识拓展
  3. EPPlus核心类
类名 作用
ExcelPackage 代表整个Excel文件,管理工作表、样式、设置等。
ExcelWorksheet 代表单个工作表,处理单元格、公式、条件格式等。
ExcelRange 代表单元格范围(单个或多个),用于设置样式、值、公式。
ExcelStyle 代表单元格样式(字体、颜色、填充、对齐、边框等)。
ExcelConditionalFormatting 管理条件格式规则。
  1. 样式设置常见技巧
    批量操作:优先选中单元格范围(如worksheet.Cells["A2:G10"])再设置样式,避免逐个单元格操作(性能更高);
    样式复用:创建通用样式(如“表头样式”“数据样式”),通过Copy方法复用(style1.Copy(style2));
    边框设置:除了BorderAround,还可设置单个边框(如Style.Border.Left.Style = ExcelBorderStyle.Thin)。
  2. 公式与函数
    EPPlus支持Excel的所有内置函数(如SUM、AVERAGE、MAX、VLOOKUP等);
    公式中的单元格引用需用Excel格式(如A1、C2:C10),注意行号列号的动态拼接;
    若需手动触发公式计算,可调用worksheet.Calculate()。
  3. 性能优化
    大数据量:避免频繁访问Cells,改用Range批量操作;使用worksheet.WriteValue方法批量写入数据;
    禁用自动计算:对于百万行数据,可先禁用公式计算(package.Workbook.Calculate=false),填充完成后再启用;
    压缩:保存时可设置压缩级别(package.CompressionLevel = CompressionLevel.Fastest)。
  4. 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


相关教程