NPOI简介
NPOI就是POI的.NET版本,NPOI能够帮助我们在没有安装微软Office的情况下读写Office文件,如xls, doc, ppt等。
名词介绍
Workbook(工作簿):一个Excel文件
Sheet页:一个工作簿中可包含多个Sheet页
NPOI源码
https://github.com/nissl-lab/npoi
Nuget
install-package NPOI
入门
生成一个Excel文件
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
{
//创建工作簿
using (IWorkbook workbook = new HSSFWorkbook())
{
//创建sheet页
ISheet sheet1 = workbook.CreateSheet("sheet1");
//创建第一行
{
IRow header = sheet1.CreateRow(0);
//创建单元格
ICell cell1 = header.CreateCell(0);
cell1.SetCellValue("ID");
ICell cell2 = header.CreateCell(1);
cell2.SetCellValue("姓名");
ICell cell3 = header.CreateCell(2);
cell3.SetCellValue("年龄");
ICell cell4 = header.CreateCell(3);
cell4.SetCellValue("数学成绩");
ICell cell5 = header.CreateCell(4);
cell5.SetCellValue("语文成绩");
}
//创建第二行
{
IRow row = sheet1.CreateRow(1);
ICell cell1 = row.CreateCell(0);
cell1.SetCellValue(1);
ICell cell2 = row.CreateCell(1);
cell2.SetCellValue("fan1");
ICell cell3 = row.CreateCell(2);
cell3.SetCellValue(18);
ICell cell4 = row.CreateCell(3);
cell4.SetCellValue(99.5);
ICell cell5 = row.CreateCell(4);
cell5.SetCellValue(100);
}
//导出
var path = Path.Combine(Directory.GetCurrentDirectory(), "test.xls");
using (var fs = new FileStream(path, FileMode.Create))
{
workbook.Write(fs, true);
}
}
}
单元格数据格式
在Excel中我们经常要设置格式,比如说日期格式(2018-1-1)、小数点格式(1.20)、货币格式($2000)、百分比格式(99.99%)等等,这些东西在过去我们恐怕只能在服务器端生成好,不但增加了服务器端的代码量,还造成了不必要的字符串替换操作,如今NPOI将让服务器从这种完全没有必要的操作中解放出来,一切都将由Excel在客户端处理。
所有的格式都是通过 CellStyle.DataFormat
赋给单元格的,而不是直接赋给单元格,设置单元格数据展示的格式有两种方法。
excel内部设置了很多格式,如下图所示:
使用内置格式
如果我们想使用这些内置的格式,可用通过 DataFormat.GetBuildinFormat('格式')
来使用,使用实例如下:
cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00"); //两位小数,内置格式
使用自定义格式
有时候内置的格式不能满足我们的要求,这时候就可以使用 workbook.CreateDataFormat().GetFormat("格式")
自定义格式了,使用语法如下:
cellStyle.DataFormat= workbook.CreateDataFormat().GetFormat("yyyy年m月d日 hh时mm分ss秒");//显示中文日期和时间,自定义格式
数据格式案例
{
IWorkbook workbook = new HSSFWorkbook();
ISheet sheet = workbook.CreateSheet("new sheet");
//设置日期格式,2018年5月5日格式
ICell cell = sheet.CreateRow(0).CreateCell(0);
cell.SetCellValue(new DateTime(2018, 5, 5, 11, 31, 56));
ICellStyle cellStyle = workbook.CreateCellStyle();
cellStyle.DataFormat = workbook.CreateDataFormat().GetFormat("yyyy年m月d日 hh时mm分ss秒");
//cellStyle.DataFormat = workbook.CreateDataFormat().GetFormat("yyyy/mm/dd hh:mm:ss");
cell.CellStyle = cellStyle;
//保留2位小数
ICell cell2 = sheet.CreateRow(1).CreateCell(0);
cell2.SetCellValue(12.346666);
ICellStyle cellStyle2 = workbook.CreateCellStyle();
cellStyle2.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00");
cell2.CellStyle = cellStyle2;
//货币格式
ICell cell3 = sheet.CreateRow(2).CreateCell(0);
cell3.SetCellValue(1234.66666);
ICellStyle cellStyle3 = workbook.CreateCellStyle();
cellStyle3.DataFormat = workbook.CreateDataFormat().GetFormat("¥#,##0.00");//美元的话格式为 $#,##0.00,其中#,##0表示千分号
cell3.CellStyle = cellStyle3;
//百分比
ICell cell4 = sheet.CreateRow(3).CreateCell(0);
cell4.SetCellValue(1.236666);
ICellStyle cellStyle4 = workbook.CreateCellStyle();
//cellStyle4.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00%");//保留两位小数
cellStyle4.DataFormat = HSSFDataFormat.GetBuiltinFormat("0%");
cell4.CellStyle = cellStyle4;
//中文大写数字
ICell cell5 = sheet.CreateRow(4).CreateCell(0);
cell5.SetCellValue(111);
ICellStyle cellStyle5 = workbook.CreateCellStyle();
cellStyle5.DataFormat = workbook.CreateDataFormat().GetFormat("[DbNum2][$-804]0.00");//不保留小数: [DbNum2][$-804]0
cell5.CellStyle = cellStyle5;
//科学计数法
ICell cell6 = sheet.CreateRow(5).CreateCell(0);
cell6.SetCellValue(1234.6666);
ICellStyle cellStyle6 = workbook.CreateCellStyle();
cellStyle6.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00E+00");
cell6.CellStyle = cellStyle6;
var path = Path.Combine(Directory.GetCurrentDirectory(), "test1.xls");
using (FileStream file = new FileStream(path, FileMode.Create))
{
workbook.Write(file,true);
}
}
单元格合并
{
IWorkbook workbook = new HSSFWorkbook();
ISheet sheet = workbook.CreateSheet("sheet1");
sheet.AddMergedRegion(new CellRangeAddress(0, 3, 1, 10));//合并单元格,4个参数依次为为startRow,endRow,startCol,endCol
ICell cell1 = sheet.CreateRow(0).CreateCell(1);
cell1.SetCellValue("合并区域1");
sheet.AddMergedRegion(new CellRangeAddress(5, 8, 0, 10));//合并单元格,4个参数依次为为startRow,endRow,startCol,endCol
ICell cell2 = sheet.CreateRow(5).CreateCell(0);
cell2.SetCellValue("合并区域2");
var path = Path.Combine(Directory.GetCurrentDirectory(), "test2.xls");
using (FileStream file = new FileStream(path, FileMode.Create))
{
workbook.Write(file, true);
}
}
单元格样式
案例1
HSSFWorkbook workbook = new HSSFWorkbook();
ISheet sheet = workbook.CreateSheet("sheet1");
//------------------单元格合并
sheet.AddMergedRegion(new CellRangeAddress(1, 2, 1, 5));//合并单元格,4个参数依次为为startRow,endRow,startCol,endCol
ICell cell = sheet.CreateRow(1).CreateCell(1);
cell.SetCellValue("合并的区域");
cell.Row.HeightInPoints = 40;//行高
ICellStyle cellstyle = workbook.CreateCellStyle();
//----------------设置单元格常用风格
cellstyle.Alignment = HorizontalAlignment.Left;//水平居左,可选Right,Center
cellstyle.VerticalAlignment = VerticalAlignment.Bottom;//垂直居中,可选Top,Center
cellstyle.WrapText = true;//自动换行
cellstyle.Indention = 4;//缩进4个字节
//cellstyle.Rotation = 90;//字体旋转90度,取值范围是[-90,90]
//---------------字体,字体大小、颜色
IFont font = workbook.CreateFont();
font.FontHeightInPoints = 24;//字号为24,可以用font.FontHeight = 24 * 20;FontHeight的单位是1/20点
font.FontName = "楷体";//字体
font.Boldweight = 700;//加粗
font.Color = HSSFColor.Blue.Index;//字体颜色
cellstyle.SetFont(font);
cell.CellStyle = cellstyle;
using (FileStream file = new FileStream(@"D:/TestFiles/test.xls", FileMode.Create))
{
workbook.Write(file);
}
案例2
IWorkbook workbook = new HSSFWorkbook();
ISheet sheet = workbook.CreateSheet("sheet1");
ICell cell = sheet.CreateRow(1).CreateCell(1);
cell.SetCellValue("hello");
ICellStyle cellstyle = workbook.CreateCellStyle();
//设置宽度,把第2列设成20字节宽;参数1指定列的索引;参数2指定宽度,单位是1/256个字符宽度
sheet.SetColumnWidth(1, 20 * 256);
//高度设成40,单位是点;也可以用cell2.Row.Height = 40 * 20;Height的单位是1/20点
cell.Row.HeightInPoints = 40;
//右边框设置成点画线
cellstyle.BorderRight = BorderStyle.MediumDashDot;
//右边框设成粉色
cellstyle.RightBorderColor = HSSFColor.Pink.Index;
//前景色填充模式,实心
cellstyle.FillPattern = FillPattern.SolidForeground;
//前景色填充颜色,黄色
cellstyle.FillForegroundColor = HSSFColor.Yellow.Index;
//背景色
//cellstyle2.FillBackgroundColor = HSSFColor.Green.Index;//背景色设成green
cell.CellStyle = cellstyle;
using (FileStream file = new FileStream(@"D:/TestFiles/test.xls", FileMode.Create))
{
workbook.Write(file);
}
参考:
https://www.cnblogs.com/wyy1234/p/10039767.html