NPOI操作Excel常用函数
2017-06-27 10:58 杨新华 阅读(2764) 评论(0) 编辑 收藏 举报最近因项目接触了NPOI,感觉还是蛮不错的,网络上的教程普遍版本较老,本篇记录所常用操作,采用NPOI 2.0版本。
新建Excel
合并单元格
sheet1.AddMergedRegion(newCellRangeAddress(2,3,0,1));//合并A3-B4
//CellRangeAddress(起始行,终止行,起始列,终止列);
添加边框
ICellStyle style2 = hssfworkbook.CreateCellStyle(); style2.BorderBottom= NPOI.SS.UserModel.BorderStyle.THIN; style2.BorderLeft=NPOI.SS.UserModel.BorderStyle.THIN; style2.BorderRight= NPOI.SS.UserModel.BorderStyle.THIN; style2.BorderTop= NPOI.SS.UserModel.BorderStyle.THIN;
//添加斜线
style2.BorderDiagonal = BorderDiagonal.BACKWARD; style2.BorderDiagonalLineStyle= NPOI.SS.UserModel.BorderStyle.THIN;
cell2.CellStyle= style2;
添加边框要对上下左右边框都进行描述。
设置对齐相关设置
ICellStyle style3 = hssfworkbook.CreateCellStyle(); style3.Alignment= NPOI.SS.UserModel.HorizontalAlignment.CENTER;//居中style3.VerticalAlignment=VerticalAlignment.CENTER;//垂直居中 style3.WrapText=true;//自动换行
sheet1.GetRow(0).GetCell(2).CellStyle= style3;
--======================补充
通常正常导出的Excel文件的单元格内容显示不全,那么如何设置才能显示全呢,通过如下两种方式解决
1、缩小字体填充
2、设置列宽
第一种方式
HSSFWorkbook wk = new HSSFWorkbook();//你用来操作的HSSFWorkbook的实例 ICellStyle cellStyle = wk.CreateCellStyle();
cellStyle.ShrinkToFit = true; //缩小字体填充
ICell Cell = sheet.CreateRow(0).CreateCell(0); Cell.CellStyle = cellStyle; Cell.SetCellValue("测试格式效果");
- 注意:
- 创建样式是基于HSSFWorkbook,而不是ISheet。
第二种方式
解决方法一:通过sheet.AutoSizeColumn(i) 这个方法只对英文与数字有效,对中文无效
解决方法二:设置列宽只有一函数sheet.SetColumnWidth(),该函数有两个参数,第一个是行索引,第二个是行列宽
for (int columnNum = 0; columnNum <= 26; columnNum++)
{
int columnWidth = ffSheet.GetColumnWidth(columnNum) / 256;//获取当前列宽度
for (int rowNum = 1; rowNum <= ffSheet.LastRowNum; rowNum++)//在这一列上循环行
{
IRow currentRow = ffSheet.GetRow(rowNum);
ICell currentCell = currentRow.GetCell(columnNum);
int length = Encoding.GetEncoding("GB2312").GetBytes(currentCell.ToString()).Length;//获取当前单元格的内容宽度
if (columnWidth < length + 1)
{
columnWidth = length + 1;
}//若当前单元格内容宽度大于列宽,则调整列宽为当前单元格宽度,后面的+1是我人为的将宽度增加一个字符
}
ffSheet.SetColumnWidth(columnNum, columnWidth * 256);
}
columnNum是列号,从0开始循环到表格最后一列,循环的范围可以自己指定,原理很简单,就是在先循环列,在列上循环行,比对行内容宽度与列宽度,若行内容宽度大于列宽则增大列宽,循环以后,每列宽度等于该列中最宽的那一行的宽度。
值得注意的是使用UTF8编码来计算的,在UTF8编码中数字和英文字母宽度为2,汉字宽度为3。而且字号越小,其效果就越好。在实际使用中内容为10磅的时候,其效果就相当不错。发现使用GB2312更好,UTF8列太宽
仅仅有宽度自适应是不够的,宽度自适应只是针对较短的内容而言的,如果单元格内容很长采用这个方法会将表格拉的非常宽。下面来谈一谈高度自适应解决方法,高度自适应是指内容换行后行高能够自动增加以完整的显示内容,高度自适应是我自己想出来的,和宽度自适应很类似:
for (int rowNum = 2; rowNum <= ffSheet.LastRowNum; rowNum++)
{
IRow currentRow = ffSheet.GetRow(rowNum);
ICell currentCell = currentRow.GetCell(27);
int length = Encoding.UTF8.GetBytes(currentCell.ToString()).Length;
currentRow.HeightInPoints = 20 * (length / 60 + 1);
}
参考文档:
http://blog.csdn.net/echoshinian100/article/details/38540321
http://www.cnblogs.com/likeli/p/3896667.html?utm_source=tuicool&utm_medium=referral