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
上面的代码运行的结果如下所示。