• npoi z


    http://blog.csdn.net/fireghost57/article/details/25623143

    http://www.cnblogs.com/jiagoushi/archive/2012/12/19/2825712.html

    为了操作Excel,npoi.net当然也需要对应的类来对应不同的分类,其中

    HSSFWorkbook对应的就是Excel文件  工作簿,

    HSSFSheet对应的就是Excel中sheet 工作表,

    HSSFCell对应的就是Excel的单元格,

    HSSFRow对应的就是Excel的行。

    有了这几个不同的类,我们就可以创建Excel文件,创建sheet,给sheet重命名或删除sheet,创建行,添加单元格,为单元格设置格式,我个人感觉其他的都很简单,唯独这个给单元格设置格式的做法很令人讨厌

    public class NpoiNet
        {
            public void CreateWorkBook()
            {
                string filePath = HttpContext.Current.Server.MapPath("~/npoi.xls");
                //表示一个文件流
                FileStream fileStream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite);
                HSSFWorkbook workBook = new HSSFWorkbook();//相当于创建了一个内存中的Excel 只是还没有写到硬盘上
                try
                {
                    /*按照约定在每个Excel文件中至少要包含一个sheet,如果没有任何sheet,打开Excel文件的时候会报错。
                   在以前的npoi版本中,如果不是自己手动的创建一个sheet,npoi框架是不会自动创建一个的,但是在最新版的1.2.5中,
                   我发现即使你忘记了创建sheet的操作,框架会自动创建一个sheet,当然如果你手动创建了一个sheet,则框架就不会
                    自动的创建一个sheet,这就像构造函数,如果没有写任何一个,.Net会默认存在一个,但是你创建了一个构造函数,则
                     * 框架就不会自动创建了
                     * */
    
                    workBook.CreateSheet("guozhiqi");//sheet的名称为guozhiqi
                    workBook.CreateSheet();//sheet的名称为sheet1  从1开始命名
                    workBook.CreateSheet("yuanjinzhou");
                    workBook.CreateSheet();//这个sheet的名称应该为什么?答案是sheet3
                    //创建了sheet 下面我们来创建单元格
                    HSSFSheet sheetGuozhiqi = (HSSFSheet)workBook.GetSheet("guozhiqi");//获取到sheet名称为guozhiqi的那个工作簿
                    //创建了工作簿 添加单元格之前首先要添加行
                    //在这里请注意  行和列的下标都是从0开始的 而不是Excel文件中的1
                    for (int i = 0; i <= 10; i++)
                    {
                        sheetGuozhiqi.CreateRow(i);//创建了11行
                    }
    
                    //创建了行之后 就要在每个行中创建单元格
                    //如果没有在之前创建行
                    //  HSSFRow newRow = (HSSFRow)sheetGuozhiqi.GetRow(12);这是错误的 程序会报异常 这就告诉我们 如果行还没有创建
                    //就不可以获取
                    HSSFRow newRow = (HSSFRow)sheetGuozhiqi.GetRow(0);
    
                    HSSFCell[] cells = new HSSFCell[11];
                    //在第0行的位置创建单元格
                    for (int i = 0; i <= 10; i++)
                    {
                        cells[i] = (HSSFCell)newRow.CreateCell(i);//为第0行创建了10个单元格 
                    }
                    //这里取得单元格的异常出现位置相同 就是如果没有创建就不要试图获取
                    HSSFCell newCell = (HSSFCell)newRow.GetCell(0);//取得第0行第0个单元格
    
                    //获取到了单元格 赋值 为了方便说明 我多获取几个单元格的值
                    //Excel单元格有很多类型 例如字符串 数字 bool等类型,
                    cells[0].SetCellValue(false);//赋值为bool型
                    cells[1].SetCellValue(DateTime.Now);//赋值为日期型
                    cells[2].SetCellValue(3.1415926);//赋值为double类型
                    cells[3].SetCellValue("guozhiqi");//赋值为字符串guozhiqi
    
                    //为单元格赋值以后 我们就要开始取值了
                    bool cell0 = cells[0].BooleanCellValue;
                   // string cell00 = cells[0].StringCellValue; 错误 这句话的意思就是说存储的时候是什么类型 就必须用对应的
                    //取值方法取值
                    DateTime dateTime = cells[1].DateCellValue;
                    double cell2 = cells[2].NumericCellValue;
                    string cell3 = cells[3].StringCellValue;
    
                    //可以正常创建单元格 从单元格取值是远远不够的 还有就是客户可能会要求合并单元格  为单元格设置样式
                    //合并单元格的操作不必要创建所有的行或列,只需要制定范围即可
                    sheetGuozhiqi.AddMergedRegion(new NPOI.SS.Util.Region(1,1,20,20));//合并单元格
    
                    HSSFCellStyle cellStyle = (HSSFCellStyle)workBook.CreateCellStyle();
                    cellStyle.Alignment = HorizontalAlignment.CENTER;//居中显示
                    cellStyle.FillBackgroundColor = 244;
                    cellStyle.FillPattern = FillPatternType.BRICKS;//填充模式
                    cellStyle.IsHidden = false;//单元格是否隐藏
                    cellStyle.IsLocked = false;//单元格是否锁定
                    cellStyle.VerticalAlignment = VerticalAlignment.CENTER;//垂直居中
                    
                    //设置单元格字体
                    HSSFFont font =(HSSFFont) workBook.CreateFont();
                    font.Color = 200;
                    font.FontHeight = 18;//设置字体大小
                    font.FontName = "黑体";//设置字体为黑体
                    font.IsItalic = false;//是否是斜体
                    font.IsStrikeout = true;//是否有中间线
                    font.Underline = (byte)FontUnderlineType.DOUBLE;//设置下划线
    
                    cellStyle.SetFont(font);
                    //将设置好的样式应用到对应的单元格上 否则是没有效果的
                    cells[0].CellStyle = cellStyle;
    
                    if (!workBook.IsWriteProtected)
                    {
                        workBook.Write(fileStream);
                    }
                }
                catch (Exception ex)
                {
                    HttpContext.Current.Response.Write(ex.Message+ex.Source+ex.StackTrace);
                }
                finally
                {
                    if (fileStream != null)
                    {
                        fileStream.Close();
                    }
                }
            }
        }
    

     使用npoi.net会遇到的一些小问题总结一下。

    1. 在实例化了一个WorkBook之后,最好添加一个sheet,虽然在最新版的Npoi.net中自动添加了,但是遇到迁移到原来版本就会出现问题。所以我建议还是最少添加一个sheet
    2. 在从单元格取值时要注意单元格的类型,一定要用对应的类型的方法来取单元格中的对应类型的值,如果不确定,那只能是强制转换成为string类型,毕竟string类型是excel中其他类型都可以转换过来的
    3. 在获取sheet中的某一行或者某一行的某一个单元格的时候,还要注意就是一定要确保创建了该行,并且取单元格还要确保创建了单元格,否则会报Null reference not to object 这个我们经常会看到的异常信息。在外层一定要加上try捕获异常
    4. 合并单元格是sheet的工作,因此需要获取对应的sheet,然后调用其AddMergedRegion方法合并单元格,在合并单元格的时候,我们不需要确保该单元格已经存在或创建。
    5. 在为单元格设置样式的过程中,我们会发现所有和样式相关的类的创建都是通过workBook.Create(Font)..这种方式来执行的,我们不可以直接new一个类的实例。
    6. 如果前面的工作都已经做好,需要把内存中的excel表写到硬盘上时,需要调用 workBook.write()方法,传入一个文件流进行创建。在这里有可能会出现一个问题,就是你要创建的文件你已经打开了,这时程序就会出现异常, 因此我们在调试程序的时候一定要记得打开了excel文件以后要关闭
    7. 最后需要注意的就是文件流,在我们把excel写到硬盘上以后,要显式的调用其close()方法关闭文件流。因为如果不关闭文件流的话,以后就会出现无法重新创建该文件的错误,并且会提示 某文件正由另一进程使用,因此该进程无法访问此文件。
  • 相关阅读:
    今天的进度又慢了
    继续还有一些基本功能
    没什么事情
    今天好冷啊
    估计下周一就不去了
    再次出发
    诡异的php curl error Empty reply from server
    postgresql interval 字段拼接
    使用root用户通过SSH登录Linux实例时报“Permission denied, please try again”的错误
    pgsql 记录类型
  • 原文地址:https://www.cnblogs.com/zeroone/p/4109026.html
Copyright © 2020-2023  润新知