C#NPOI导出Excel详解

C#NPOI导出Excel详解

开发工具与技术:工具:Visual Studio/C#.Net,技术:C#
作者:刘胜
撰写时间:2019-05-08


NPOI简介

NOP是一个开源的C#读写Excel、WORD等微软OLE2组件的项目,使用NPOI你就可以在没有安装Office或者相应的机器上对WORD/EXCEL文件档进行读写。

实例
首先创建HSSWorkbook的对象用来调用NPOI文件,如果你导入的数据时没有调用ICellStyle类的对象设置的样式话,那么出来的数据在Excel是不加任何的样式。也就是说数据过多的话,数据会挤在一排,而且超出会隐藏。所以要设置ICellStyle的属性才行。

//二:代码创建一个Excel表格(这里称为工作簿)
//创建Excel文件的对象 工作簿(调用NPOI文件)
HSSFWorkbook excelBook = new HSSFWorkbook();
ICellStyle style = excelBook.CreateCellStyle();

关于ICellStyle怎么调用下面有详细的,先创建Excel工作表Sheet,再创建Excel表格的第一行是头部的标题。

//创建Excel工作表 Sheet=故障码信息
ISheet sheet1 = excelBook.CreateSheet("某某");
IRow row1 = sheet1.CreateRow(0);
//给标题的每一个单元格赋值
row1.CreateCell(0).SetCellValue("故障码DTC");//0

如果要添加每行数据,可以用for()循环先填充Sheet1对象的CreateRow()行索引,给每一个单元格添加值。

//查询数据
var listFaultInfo = listFaultCodePush(FaultCodeID, DTC);
//添加数据行:将表格数据逐步写入sheet1各个行中(也就是给每一个单元格赋值)
            for (int i = 0; i < listExaminee.Count; i++)
            {
                //sheet1.CreateRow(i).
                //创建行
                IRow rowTemp = sheet1.CreateRow(i + 1);
                rowTemp.Height = 62 * 20;
                //故障码DTC
                rowTemp.CreateCell(0).SetCellValue(listFaultInfo[i].DTC);
            }

这是关于设置NPOI导出Excel的样式设置。
在这里插入图片描述
还可以设置字体的颜色是通过IFont去设置

IFont font = excelBook.CreateFont();
font.Color = IndexedColors.RED.Index;
style1.SetFont(font);

最后输出文件名称,将工作薄写入文件流

//输出的文件名称
            string fileName = "故障码信息" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss-ffff") + ".xls";
            //把Excel转为流,输出
            //创建文件流
            System.IO.MemoryStream bookStream = new System.IO.MemoryStream();
            //将工作薄写入文件流
            excelBook.Write(bookStream);

            //输出之前调用Seek(偏移量,游标位置) 把0位置指定为开始位置
            bookStream.Seek(0, System.IO.SeekOrigin.Begin);
            //Stream对象,文件类型,文件名称
            return File(bookStream, "application/vnd.ms-excel", fileName);

下面我用一个实例来举例,见下面代码

#region NPOI导出到Excel 
        //NPOI导出到Excel(故障码)
        public ActionResult ExportToExcel(string DTC)
        {
            int FaultCodeID = 0;//故障码ID

            //查询数据
            var listFaultInfo = listFaultCodePush(FaultCodeID, DTC);
            List<PlatformClass> listExaminee = listFaultInfo;
            //二:代码创建一个Excel表格(这里称为工作簿)
            //创建Excel文件的对象 工作簿(调用NPOI文件)
            HSSFWorkbook excelBook = new HSSFWorkbook();
            ICellStyle style1 = excelBook.CreateCellStyle();//声明style1对象,设置Excel表格的样式
            ICellStyle style2 = excelBook.CreateCellStyle();
            ICellStyle style3 = excelBook.CreateCellStyle();
            IFont font = excelBook.CreateFont();
            font.Color = IndexedColors.RED.Index;
            style3.SetFont(font);
            style1.Alignment = HorizontalAlignment.JUSTIFY;//两端自动对齐(自动换行)
            style1.VerticalAlignment = VerticalAlignment.CENTER;
            style2.Alignment = HorizontalAlignment.CENTER;
            style2.VerticalAlignment = VerticalAlignment.CENTER;
            style3.Alignment = HorizontalAlignment.CENTER;
            style3.VerticalAlignment = VerticalAlignment.CENTER;
            //创建Excel工作表 Sheet=故障码信息
            ISheet sheet1 = excelBook.CreateSheet("故障码信息");
            //给Sheet(故障码信息)添加第一行的头部标题
            IRow row1 = sheet1.CreateRow(0);
            //给标题的每一个单元格赋值
            row1.CreateCell(0).SetCellValue("故障码DTC");//0
            row1.CreateCell(1).SetCellValue("故障码(hex)");//1
            row1.CreateCell(2).SetCellValue("故障码英文描述");//2
            row1.CreateCell(3).SetCellValue("故障码中文描述");//3
            row1.CreateCell(4).SetCellValue("故障码运行条件");//4
            row1.CreateCell(5).SetCellValue("故障码设置条件");//5
            row1.CreateCell(6).SetCellValue("故障码设置时发生的操作");//6
            row1.CreateCell(7).SetCellValue("故障恢复条件");//7
            row1.CreateCell(8).SetCellValue("激近故障灯原则");//8
            row1.CreateCell(9).SetCellValue("熄灭故障灯原则");//9
            row1.CreateCell(10).SetCellValue("清除故障码条件");//10
            row1.GetCell(0).CellStyle = style2;//初始化设置样式
            row1.GetCell(1).CellStyle = style2;//初始化设置样式
            row1.GetCell(2).CellStyle = style2;//初始化设置样式
            row1.GetCell(3).CellStyle = style2;//初始化设置样式
            row1.GetCell(4).CellStyle = style2;//初始化设置样式
            row1.GetCell(5).CellStyle = style2;//初始化设置样式
            row1.GetCell(6).CellStyle = style2;//初始化设置样式
            row1.GetCell(7).CellStyle = style2;//初始化设置样式
            row1.GetCell(8).CellStyle = style2;//初始化设置样式
            row1.GetCell(9).CellStyle = style2;//初始化设置样式
            row1.GetCell(10).CellStyle = style2;//初始化设置样式
            sheet1.SetColumnWidth(0, 10 * 256);//初始化设置宽度
            sheet1.SetColumnWidth(0, 10 * 256);//初始化设置宽度
            sheet1.SetColumnWidth(0, 10 * 256);//初始化设置宽度
            sheet1.SetColumnWidth(0, 10 * 256);//初始化设置宽度
            sheet1.SetColumnWidth(1, 10 * 256);//初始化设置宽度
            sheet1.SetColumnWidth(0, 10 * 256);//初始化设置样式
            sheet1.SetColumnWidth(2, 17 * 256);//初始化设置宽度
            sheet1.SetColumnWidth(3, 30 * 256);//初始化设置宽度
            sheet1.SetColumnWidth(4, 34 * 256);//初始化设置宽度
            sheet1.SetColumnWidth(5, 20 * 256);//初始化设置宽度
            sheet1.SetColumnWidth(6, 26 * 256);//初始化设置宽度
            sheet1.SetColumnWidth(7, 29 * 256);//初始化设置宽度
            sheet1.SetColumnWidth(8, 14 * 256);//初始化设置宽度
            sheet1.SetColumnWidth(9, 14 * 256);//初始化设置宽度
            sheet1.SetColumnWidth(10, 99 * 256);//初始化设置宽度
            //添加数据行:将表格数据逐步写入sheet1各个行中(也就是给每一个单元格赋值)
            for (int i = 0; i < listExaminee.Count; i++)
            {
                //sheet1.CreateRow(i).
                //创建行
                IRow rowTemp = sheet1.CreateRow(i + 1);
                rowTemp.Height = 62 * 20;
                //故障码DTC
                rowTemp.CreateCell(0).SetCellValue(listFaultInfo[i].DTC);
                //故障码(hex)
                rowTemp.CreateCell(1).SetCellValue(listFaultInfo[i].HEX);
                //故障码英文描述
                rowTemp.CreateCell(2).SetCellValue(listFaultInfo[i].EfaultCode);
                //故障码中文描述
                rowTemp.CreateCell(3).SetCellValue(listFaultInfo[i].CfaultCode);
                ///故障码运行条件
                rowTemp.CreateCell(4).SetCellValue(listFaultInfo[i].OperatingCondition.Replace("<br>", " "));
                //故障码设置条件
                rowTemp.CreateCell(5).SetCellValue(listFaultInfo[i].SetCriteria.Replace("<br>", " "));
                //故障码设置时发生的操作
                rowTemp.CreateCell(6).SetCellValue(listFaultInfo[i].SetingOperation);
                //故障恢复条件
                rowTemp.CreateCell(7).SetCellValue(listFaultInfo[i].RestoreConditions);
                //激近故障灯原则
                rowTemp.CreateCell(8).SetCellValue(listFaultInfo[i].ActivateRule);
                //熄灭故障灯原则
                rowTemp.CreateCell(9).SetCellValue(listFaultInfo[i].OutRule);
                //清除故障码条件
                rowTemp.CreateCell(10).SetCellValue(listFaultInfo[i].CleanCondition.Replace("<br>"," "));
                rowTemp.GetCell(0).CellStyle = style3;
                rowTemp.GetCell(1).CellStyle = style3;
                rowTemp.GetCell(2).CellStyle = style2;
                rowTemp.GetCell(3).CellStyle = style2;
                rowTemp.GetCell(4).CellStyle = style1;
                rowTemp.GetCell(5).CellStyle = style1;
                rowTemp.GetCell(6).CellStyle = style1;
                rowTemp.GetCell(7).CellStyle = style1;
                rowTemp.GetCell(8).CellStyle = style2;
                rowTemp.GetCell(9).CellStyle = style2;
                rowTemp.GetCell(10).CellStyle = style1;
            }
            //输出的文件名称
            string fileName = "故障码信息" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss-ffff") + ".xls";
            //把Excel转为流,输出
            //创建文件流
            System.IO.MemoryStream bookStream = new System.IO.MemoryStream();
            //将工作薄写入文件流
            excelBook.Write(bookStream);

            //输出之前调用Seek(偏移量,游标位置) 把0位置指定为开始位置
            bookStream.Seek(0, System.IO.SeekOrigin.Begin);
            //Stream对象,文件类型,文件名称
            return File(bookStream, "application/vnd.ms-excel", fileName);
        }
        #endregion

上面的代码运行的结果如下所示。
在这里插入图片描述

  • 15
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
使用C#和NPOI库可以方便地导出Excel表格。下面是一个简单的示例: 1. 首先,你需要安装NPOI库,可以使用NuGet包管理器进行安装。 2. 在代码中,首先创建一个工作簿和一个工作表: ``` using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System.IO; ... // 创建一个工作簿 var workbook = new XSSFWorkbook(); // 创建一个工作表 var sheet = workbook.CreateSheet("Sheet1"); ``` 3. 接下来,你可以向表格中添加数据。以下是将数据添加到第一行的示例: ``` // 创建第一行并添加数据 var headerRow = sheet.CreateRow(0); headerRow.CreateCell(0).SetCellValue("ID"); headerRow.CreateCell(1).SetCellValue("Name"); headerRow.CreateCell(2).SetCellValue("Age"); ``` 4. 然后,你可以循环遍历数据并将其添加到表格中。以下是将数据添加到第二行和第三行的示例: ``` // 模拟数据 var data = new List<Person> { new Person { ID = 1, Name = "Alice", Age = 18 }, new Person { ID = 2, Name = "Bob", Age = 20 } }; // 循环遍历数据 for (int i = 0; i < data.Count; i++) { var row = sheet.CreateRow(i + 1); row.CreateCell(0).SetCellValue(data[i].ID); row.CreateCell(1).SetCellValue(data[i].Name); row.CreateCell(2).SetCellValue(data[i].Age); } ``` 5. 最后,将工作簿保存到文件中: ``` // 保存工作簿到文件 using (var fileStream = new FileStream("output.xlsx", FileMode.Create)) { workbook.Write(fileStream); } ``` 完整的代码示例: ``` using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System.Collections.Generic; using System.IO; class Person { public int ID { get; set; } public string Name { get; set; } public int Age { get; set; } } ... // 创建一个工作簿 var workbook = new XSSFWorkbook(); // 创建一个工作表 var sheet = workbook.CreateSheet("Sheet1"); // 创建第一行并添加数据 var headerRow = sheet.CreateRow(0); headerRow.CreateCell(0).SetCellValue("ID"); headerRow.CreateCell(1).SetCellValue("Name"); headerRow.CreateCell(2).SetCellValue("Age"); // 模拟数据 var data = new List<Person> { new Person { ID = 1, Name = "Alice", Age = 18 }, new Person { ID = 2, Name = "Bob", Age = 20 } }; // 循环遍历数据 for (int i = 0; i < data.Count; i++) { var row = sheet.CreateRow(i + 1); row.CreateCell(0).SetCellValue(data[i].ID); row.CreateCell(1).SetCellValue(data[i].Name); row.CreateCell(2).SetCellValue(data[i].Age); } // 保存工作簿到文件 using (var fileStream = new FileStream("output.xlsx", FileMode.Create)) { workbook.Write(fileStream); } ```
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值