关闭

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

标签: NPOI操作ExcelC#工程班级成绩单
3083人阅读 评论(0) 收藏 举报
分类:


在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]++;
                    }
                }
            }



1
0
查看评论

NPOI导出Excel(复杂表头)

  • 2015-09-12 08:28
  • 966KB
  • 下载

NPOI Excel表格处理

//创建一个Excel文件 HSSFWorkbook work = new HSSFWorkbook(); //新建一个工作表 ISheet sheet1 = work.CreateSheet("工作表名称"); //新增 //新建一行,行号从0开始 IRow row = sh...
  • letnet1981
  • letnet1981
  • 2016-09-01 11:08
  • 193

C#利用NPOI处理excel的类 NPOIHelper.cs

个人的NPOIHelp类,包括datatable导出到excel,dataset导出到excel,excel导入到datatable,excel导入到dataset, 更新excel中的数据,验证导入的Excel是否有数据等操作 using System; using System.Collec...
  • jumtre
  • jumtre
  • 2015-01-12 23:29
  • 20879

NPOI读取模板导出Excel(合并单元格)

  • 2012-04-18 17:36
  • 20KB
  • 下载

NPOI 通过excel模板写入数据并导出

private void ToExcel(string id) { //模板文件 string TempletFileName = Server.MapPath("template.xls"); //导出文件 ...
  • chuntian1983
  • chuntian1983
  • 2014-01-17 08:50
  • 19324

初探:使用NPOI导出Excel(已有Excel模板)

最近在写个功能,要导出Excel到本地,第一次使用的方法是用office COM组件Microsoft.Office.Intertrop.Excel.dll,在我的机器上功能好用,但放到一个同事的机器上,始终会出现一个问题:“COM类工厂。。。没有注册”的bug,首先尝试的方法是修改Excel ap...
  • gjban
  • gjban
  • 2014-09-03 17:56
  • 4252

NPOI Excel模板填充数据后导出

引入Npoi包  添加引用dotnet2 或dotnet4 Excel模板   (  .xlsx) public void NpoiExportExcel() {            strin...
  • sinat_16998945
  • sinat_16998945
  • 2016-08-02 13:56
  • 1597

C#项目中操作Excel文件——使用NPOI库

实际C#项目中经常会涉及到需要对本地Excel文件进行操作,特别是一些包含数据记录、分析、汇总功能模块的项目。常用的操作Excel文件的方法主要有三个: 1. OleDb: 这种方式是把整个Excel文件当做一个数据源来进行数据的读取操作。 优点:实现方式简单,读取速度快; 缺点:读取Excel...
  • dcrmg
  • dcrmg
  • 2016-08-29 20:23
  • 18697

NPOI使用手册

NOPI使用手册 目录 1. 认识NPOI   2. 使用NPOI生成xls文件 2.1 创建基本内容 2.1.1 创建Workbook和Sheet 2.1.2 创建DocumentSummaryInformation和SummaryInformation 2.1.3 创建单元格 2.1....
  • pan_junbiao
  • pan_junbiao
  • 2014-10-01 11:43
  • 84664

在C#中创建、读、写EXCEL文件(基于COM)

1. EXCEL Library 在使用C#中的excel模块之前,我们需要先把excel library加入到project中。 首先创建一个空项目,然后创建一个按钮。随后,如下图点击“项目”->“添加引用”: 随后选择microsoft excel 1X.0 object l...
  • zzukun
  • zzukun
  • 2016-03-08 21:14
  • 7396
    个人资料
    • 访问:1007480次
    • 积分:10846
    • 等级:
    • 排名:第1793名
    • 原创:256篇
    • 转载:14篇
    • 译文:1篇
    • 评论:411条
    博客专栏
    最新评论