代码改变世界

NPOI操作Excel常用函数

2017-06-27 10:58  杨新华  阅读(2662)  评论(0编辑  收藏  举报

最近因项目接触了NPOI,感觉还是蛮不错的,网络上的教程普遍版本较老,本篇记录所常用操作,采用NPOI 2.0版本。

推荐:

新建Excel

HSSFWorkbook hssfworkbook =newHSSFWorkbook();
ISheet sheet1 = hssfworkbook.CreateSheet("sheet1");//建立Sheet1

 

保存(导出)Excel
FileStream file =newFileStream(@"e:\HSSFWorkbook.xls",FileMode.Create);
hssfworkbook.Write(file);
file.Close();

 

导入Excel
FileStream file =newFileStream(@"template/Template.xls",FileMode.Open,FileAccess.Read);
hssfworkbook =newHSSFWorkbook(file);

 

添加文字
ICell cell1 =HSSFCellUtil.CreateCell(sheet1.CreateRow(0),0,"A1");//添加A1到A1单元,并对Row0实例化
ICell cell2 = HSSFCellUtil.CreateCell(sheet1.GetRow(0), 1, " B1 ");//添加B1到B1单元,此方法需Row0实例化后才可使用
sheet1.GetRow(0).CreateCell(2).SetCellValue("C1");//添加C1到C1单元,此方法需Row0实例化才可使用
sheet1.CreateRow(1).CreateCell(0).SetCellValue("A2");//添加A2到A2单元,并对Row1实例化
 
注意添加文字时候对单元格实例化问题,如果在同一单元格,多次实例化后,会覆盖同行的文字。提供了两种添加文字方式,各有优缺点吧。

 

设置字体格式
IFont font1 = hssfworkbook.CreateFont();
font1.FontName="宋体";//字体
font1.FontHeightInPoints = 20;//字号
font1.Color = HSSFColor.RED.index;//颜色
font1.Boldweight = 700;//粗体
font1.IsItalic = true;//斜体
font1.Underline = (byte)FontUnderlineType.DOUBLE;//添加双下划线
 
ICellStyle style1 = hssfworkbook.CreateCellStyle();
style1.SetFont(font1);
字体格式绑定在Style中,Style包含了字体格式、颜色、边框等设置,当设置好Style后,赋值给单元格即可。
 
cell1.CellStyle= style1;
sheet1.GetRow(1).GetCell(0).CellStyle= style1;

 

合并单元格

sheet1.AddMergedRegion(newCellRangeAddress(2,3,0,1));//合并A3-B4

//CellRangeAddress(起始行,终止行,起始列,终止列);

 

添加边框

ICellStyle style2 = hssfworkbook.CreateCellStyle(); style2.BorderBottom= NPOI.SS.UserModel.BorderStyle.THINstyle2.BorderLeft=NPOI.SS.UserModel.BorderStyle.THINstyle2.BorderRight= NPOI.SS.UserModel.BorderStyle.THINstyle2.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