在C#中利用NPOI操作Excel表格非常方便,几乎上支持所有的Excel表格本身所有的功能,如字体设置、颜色设置、单元格合并、数值计算、页眉页脚等等。

这里准备使用NPOI生成一个班级成绩单Excel表格,表格中包含的信息包括学号、姓名、各科成绩、平均成绩、排名等。

实现原理很简单,主要是NPOI的一些操作,具体实现的功能包括下边几个:

  • 单元格合并
  • 字体大小、颜色设置
  • 背景颜色设置
  • 边框粗细设置
  • 多个单元格SUM求和
  • 数据写入和读取

完整C#代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.SS.UserModel;
using System.IO;
using System.Data;namespace Score_Excel
{class Program{static void Main(string[] args){IWorkbook workbook = new HSSFWorkbook();//声明工作簿对象,可以创建xls或xlsx Excel文件ISheet sheet1 = workbook.CreateSheet("Score Record"); //创建工作表ICell sheet1Title = sheet1.CreateRow(0).CreateCell(0); //创建第一行第一个单元格sheet1Title.SetCellValue("国家体育总局附属二小幼儿园小一班体育成绩表"); //表头sheet1Title.CellStyle = GetTitleCellStyle(workbook);sheet1.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, 9));  //合并单元格DataTable dt = GetData();IRow row;ICell cell;ICellStyle cellStyle1 = GetCellStyle(workbook, 2);ICellStyle cellStyle2 = GetCellStyle(workbook, 0);double[] aveScore = new double[8]; //平均成绩数组int[] rankNum = new int[8];  //名次数组//表头数据row = sheet1.CreateRow(1);cell = row.CreateCell(0);cell.SetCellValue("学号");cell.CellStyle = cellStyle1;cell = row.CreateCell(1);cell.SetCellValue("姓名");cell.CellStyle = cellStyle1;cell = row.CreateCell(2);cell.SetCellValue("排球");cell.CellStyle = cellStyle1;cell = row.CreateCell(3);cell.SetCellValue("乒乓球");cell.CellStyle = cellStyle1;cell = row.CreateCell(4);cell.SetCellValue("跳水");cell.CellStyle = cellStyle1;cell = row.CreateCell(5);cell.SetCellValue("举重");cell.CellStyle = cellStyle1;cell = row.CreateCell(6);cell.SetCellValue("自由泳");cell.CellStyle = cellStyle1;cell = row.CreateCell(7);cell.SetCellValue("体操");cell.CellStyle = cellStyle1;cell = row.CreateCell(8);cell.SetCellValue("平均成绩");cell.CellStyle = cellStyle1;cell = row.CreateCell(9);cell.SetCellValue("名次");cell.CellStyle = cellStyle1;// 写入数据for (int i = 0; i < dt.Rows.Count; i++){DataRow dataR = dt.Rows[i];row = sheet1.CreateRow(i + 2);cell = row.CreateCell(0);cell.SetCellValue(dataR["学号"].ToString());cell.CellStyle = cellStyle2;cell = row.CreateCell(1);cell.SetCellValue(dataR["姓名"].ToString());cell.CellStyle = cellStyle2;cell = row.CreateCell(2);cell.SetCellValue((Double)dataR["排球"]);cell.CellStyle = cellStyle2;cell = row.CreateCell(3);cell.SetCellValue((Double)dataR["乒乓球"]);cell.CellStyle = cellStyle2;cell = row.CreateCell(4);cell.SetCellValue((Double)dataR["跳水"]);cell.CellStyle = cellStyle2;cell = row.CreateCell(5);cell.SetCellValue((Double)dataR["举重"]);cell.CellStyle = cellStyle2;cell = row.CreateCell(6);cell.SetCellValue((Double)dataR["自由泳"]);cell.CellStyle = cellStyle2;cell = row.CreateCell(7);cell.SetCellValue((Double)dataR["体操"]);cell.CellStyle = cellStyle2;cell = row.CreateCell(8);cell.SetCellFormula(String.Format("SUM($C{0}:$H{0})/6", i + 3));cell.CellStyle = cellStyle2;for (int j = 2; j < 8; j++){aveScore[i] += row.Cells[j].NumericCellValue;}aveScore[i] /= 6;  //每个人平均成绩}//以下for循环实现对每个人的成绩进行排名for (int i = 0; i < 8; i++){rankNum[i] = 1;for (int j = 0; j < 8; j++){if (aveScore[i] < aveScore[j]){rankNum[i]++;}}}//排名写入“名次”列for (int i = 0; i < 8; i++){row = sheet1.GetRow(i + 2);cell = row.CreateCell(9);cell.SetCellValue(rankNum[i]);cell.CellStyle = cellStyle2;}if (!Directory.Exists(@"E:\Score Excel"))  //检查是否存在文件夹,不存在则新建{Directory.CreateDirectory(@"E:\Score Excel");}FileStream file = new FileStream(@"E:\Score Excel\Score Record.xls", FileMode.Create);workbook.Write(file);file.Close();workbook.Close();}static DataTable GetData()   //原始数据{DataTable dt = new DataTable();dt.Columns.Add("学号", typeof(System.Int32));dt.Columns.Add("姓名", typeof(System.String));dt.Columns.Add("排球", typeof(System.Double));dt.Columns.Add("乒乓球", typeof(System.Double));dt.Columns.Add("跳水", typeof(System.Double));dt.Columns.Add("举重", typeof(System.Double));dt.Columns.Add("自由泳", typeof(System.Double));dt.Columns.Add("体操", typeof(System.Double));dt.Rows.Add("231603001", "张继科", 100, 83, 69.5, 90, 61, 92);dt.Rows.Add("231603002", "傅园慧", 99, 100, 99.9, 100, 100, 99.5);dt.Rows.Add("231603003", "孙杨", 92, 64, 78.5, 64, 69, 90.5);dt.Rows.Add("231603004", "福原爱", 76, 93.5, 69.5, 85, 87, 61);dt.Rows.Add("231603005", "大魔王", 99, 102, 92, 78, 96.5, 89.5);dt.Rows.Add("231603006", "林丹", 87, 98.5, 78.5, 69.5, 97, 89);dt.Rows.Add("231603007", "丁宁", 85, 93, 87.5, 90.5, 69, 79.5);dt.Rows.Add("231603008", "宁泽涛", 79, 62.5, 87.5, 98, 78, 93.5);return dt;}//设置单元格格式函数,边框粗细3个可选static ICellStyle GetCellStyle(IWorkbook workbook, int borderThickness){ICellStyle cellStyle = workbook.CreateCellStyle();NPOI.SS.UserModel.BorderStyle borderType;switch (borderThickness){case 0:borderType = NPOI.SS.UserModel.BorderStyle.Thin;break;case 1:borderType = NPOI.SS.UserModel.BorderStyle.Medium;break;case 2:borderType = NPOI.SS.UserModel.BorderStyle.Thick;break;default:borderType = NPOI.SS.UserModel.BorderStyle.Thin;break;}cellStyle.BorderBottom = borderType;cellStyle.BorderTop = borderType;cellStyle.BorderLeft = borderType;cellStyle.BorderRight = borderType;IFont font = workbook.CreateFont();//设置字体大小和颜色font.FontName = "宋体";font.FontHeightInPoints = 13;cellStyle.SetFont(font);return cellStyle;}//设置表头格式函数static ICellStyle GetTitleCellStyle(IWorkbook workbook){ICellStyle cell1Style = workbook.CreateCellStyle();cell1Style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;cell1Style.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;cell1Style.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;cell1Style.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;cell1Style.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;cell1Style.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;IFont font = workbook.CreateFont(); //设置字体大小和颜色font.FontName = "微软雅黑";font.FontHeightInPoints = 13;font.Color = NPOI.HSSF.Util.HSSFColor.Blue.Index;cell1Style.SetFont(font);cell1Style.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.LightGreen.Index;cell1Style.FillPattern = FillPattern.SolidForeground;return cell1Style;}}
}

执行后,在E盘指定目录下生成了名字是“Score Excel”的表格:

“名次”列的排名实现:

先声明了一个大小为8的Int数组,默认值设为1,依次拿当前的平均成绩和其他7个的平均成绩对比,有几个大于当前平均成绩的元素,就在当前数组值上加上几,最后得到的就是每个人的排名,实现如下:

//以下for循环实现对每个人的成绩进行排名for (int i = 0; i < 8; i++){rankNum[i] = 1;for (int j = 0; j < 8; j++){if (aveScore[i] < aveScore[j]){rankNum[i]++;}}}

用NPOI、C#操作Excel表格生成班级成绩单相关推荐

  1. 使用VC来操作Excel表格的源码

    下面的代码段是关于使用VC来操作Excel表格的的代码,应该对小伙伴们也有用. if (CoInitialize(NULL) != 0) { AfxMessageBox("初始化COM支持库 ...

  2. android jxl.jar 使用,使用jxl.jar在Android中操作Excel表格——重中之重——对隐藏表的处理...

    曾简单了解过C#,将Excel(数据库表)表中的数据导入到C#中,使用C#制作的图形化界面进行对Excel表中数据进行操作. 今天想试试,在Android中导入Excel表格进行操作.在网上查阅资料, ...

  3. Java 操作excel表格 - JXL(Java excel api)

    Java 操作excel表格 Java 操作 Excel 最常用的就是JXL(Java excel api)和POI,用起来挺简单的,不过相应的其功能也并非很强大,够用就行! 首先,下载jxl.jar ...

  4. JAVA 操作 excel 并生成 xml

    并不是每一份文档最初都是用 XML 写的,这可能与您想像的正好相反.事实上,大多数文档都是用其他一些工具准备出来,然后再转换成 XML 的.许多文档来源于 关系数据库,或者来源于 Microsoft ...

  5. Python Pandas操作Excel表格文件:创建新表格,追加数据

    前言: python操作excel表格文件的增删读写,一般需要用到的第三方库有xlwt,xlrd.xlrd负责读取excel,xlwt负责写入excel文件.这种操作方法比较繁琐,效率还不错,通俗易懂 ...

  6. C#操作Excel表格,不积硅步无以至千里

    本文主要介绍一下c#来操作excel表格,主要介绍我使用的,我是使用第三方提供的函数库(NPOI)来进行excel的操作,而NPOI库函数在其官网下,我这里就不拿出来了. 1:NPOI库函数 NPOI ...

  7. Java 通过POI 操作excel表格:读取、写入

    Java操作excel表格是很常见的,在下面的例子中我将展示使用Java如何对excel进行读取和写入操作.(我是在ssm中实现的) 一.导入依赖 (如果是在普通Java项目中需要导入相应jar包) ...

  8. python excel操作单元格_python 操作excel表格的方法

    说明:由于公司oa暂缺,人事妹子在做考勤的时候,需要通过几个excel表格去交叉比对员工是否有旷工或迟到,工作量大而且容易出错. 这时候it屌丝的机会来啦,花了一天时间给妹子撸了一个自动化脚本. 1. ...

  9. python 编辑excel需要什么包_Python 中操作EXCEL表格的包

    今天,马云爸爸又来贡献金句了,比王健林公公一亿一个小目标还高,"一个月挣一二十个亿很难受!!!",作为在传统企业主要为电商部门提供数据分析的数据分析师,体验太深刻了. 双11前后, ...

最新文章

  1. DownloadProvider 源码详细分析
  2. Cannot place PIO comp S on the proposed PIO site PB6C / F5 because the types of their IOLOGICs a...
  3. Spring JdbcTemplate CRUD增删改查操作
  4. Android—EventBus使用与源码分析
  5. 【转】分布式事务的常见解决方案
  6. php开源mvccms_轻松理解MYSQL MVCC 实现机制
  7. 计算机网络之物理层:3、奈式准则和香农公式
  8. UML表示实体类型和属性
  9. 面试 其实就是短时间内展现出你最好的自我
  10. java实验报告_Java实验报告(一)
  11. 基2FFT算法matlab程序编写,基2时抽8点FFT的matlab实现流程及FFT的内部机理
  12. 桌面上计算机图标怎么改成中文,怎么修改电脑桌面上的图标
  13. linux ps-e和-ax区别,Linux编程 6 (查看进程 ps 及输出风格)
  14. Unity3D教程:简单的碰撞检测
  15. opensips安装教程
  16. JAVA 项目打包和部署一站式解决方案
  17. STM32(基于HAL库)驱动0.96寸OLED屏幕(四脚且中英文皆可显示)
  18. 流动资金池:我们需要知道的一切
  19. 39度发烧堂:常用音频格式有什么区别?
  20. 数据库系统概论(第五版)学习笔记

热门文章

  1. 算法(五)——字符串排序
  2. selenium怎样避免被服务器检测
  3. 拔河分组问题 python
  4. 学生管理系统 结构体+链表(登录,注册,查询,修改,删除,排序,求平均)
  5. 区块链+住房公积金:创新应用,跑赢时代
  6. 重庆自考专升本和普通专升本的区别?
  7. 联想千万元投资个性定制网站
  8. 51nod1989 竞赛表格
  9. trunc函数的用法
  10. 烟台一职学校计算机,烟台一职是个什么样的学校??