zoukankan      html  css  js  c++  java
  • NPOI操作Excel常用函数

    最近因项目接触了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

  • 相关阅读:
    Asp.net MVC3 Razor语法小记
    asp.net4的webform使用路由
    判断数据库中要创建的存储过程、函数等是否已经存在
    visual studio 解决方案版本互转
    sql语句创建表的时候加表注释和列注释
    Jquery在指定元素内查找元素(相对定位)
    .net便利的小方法
    sqlserver2008秘钥
    jquery星级评定效果(原创)
    清除GridView自带样式
  • 原文地址:https://www.cnblogs.com/yxhblog/p/7084025.html
Copyright © 2011-2022 走看看