C#操作Excel(NPOI)

这两天需要读取Excel文件,网上找了找,发现NPOI用的是最多的,于是研究了一下。这里大概介绍一下。

首先,在NPOI中一个Excel文件对应了一个IWorkbook对象,Excel中的一个工作表对应了NPOI中的一个ISheet。

在Excel中有行的概念IRow,但是没有列,取而代之的是单元格ICell。

下面简单介绍一下NPOI读取写入Excel的方法,我这里用的是NPOI2.0版本的

http://pan.baidu.com/s/1qXJsWXm 这是下载地址。

也可以来这里http://npoi.codeplex.com/看NPOI的官方文档。如果有用Java的同学,可以用poi来操作方法都是一样的。

自offic2003之后,excel多了一种格式即xlsx格式,所以在引用NPOI时,需要把那几个dll全部引用,如果只引用ICSharpCode.SharpZipLib.dll和NPOI.dll 则只能读取xls格式的excel。

首先看一下如何向Excel 中写入:

 //HSSF可以读取xls格式的Excel文件
            IWorkbook workbook = new HSSFWorkbook();
            //XSSF可以读取xlsx格式的Excel文件
            //IWorkbook workbook = new XSSFWorkbook();

            //Excel文件至少要有一个工作表sheet
            ISheet sheet = workbook.CreateSheet("工作表");
            //创建行
            for (int i = 0; i < 10; i++)
            {
                IRow row = sheet.CreateRow(i); //i表示了创建行的索引,从0开始
                //创建单元格
                for (int j = 0; j < 5; j++)
                {
                    ICell cell = row.CreateCell(j);  //同时这个函数还有第二个重载,可以指定单元格存放数据的类型
                    cell.SetCellValue(i.ToString() + j.ToString());
                }
            }
            
            //表格制作完成后,保存
            //创建一个文件流对象
            using (FileStream fs = File.Open("test.xls", FileMode.OpenOrCreate))
            {
                workbook.Write(fs);
                //最后记得关闭对象
                workbook.Close();
            }

        }

然后我们还是用这个excel文件来读取一下

 //首先根据需要读取的文件创建一个文件流对象
            using (FileStream fs = File.OpenRead("test.xls"))
            {
                IWorkbook workbook = null;
                //这里需要根据文件名格式判断一下
                //HSSF只能读取xls的
                //XSSF只能读取xlsx格式的
                if (Path.GetExtension(fs.Name) == ".xls")
                {
                    workbook = new HSSFWorkbook(fs);
                }
                else if (Path.GetExtension(fs.Name) == ".xlsx")
                {
                    workbook = new XSSFWorkbook(fs);
                }
                //因为Excel表中可能不止一个工作表,这里为了演示,我们遍历所有工作表
                for (int i = 0; i < workbook.NumberOfSheets; i++)
                {
                    //得到当前sheet
                    ISheet sheet = workbook.GetSheetAt(i);
                    //也可以通过GetSheet(name)得到
                    //遍历表中所有的行
                    //注意这里加1,这里得到的最后一个单元格的索引默认是从0开始的
                    for (int j = 0; j < sheet.LastRowNum + 1; j++)
                    {
                        //得到当前的行
                        IRow row = sheet.GetRow(j);
                        //遍历每行所有的单元格
                        //注意这里不用加1,这里得到的最后一个单元格的索引默认是从1开始的
                        for (int k = 0; k < row.LastCellNum; k++)
                        {
                            //得到当前单元格
                            ICell cell = row.GetCell(k, MissingCellPolicy.CREATE_NULL_AS_BLANK);
                            Console.Write(cell.StringCellValue+" ");
                        }
                        Console.WriteLine();
                    }
                }
            }

这就是读取完成后控制台显示的结果,和Excel文件中一模一样。

下一篇我们介绍一下如果将Excel文件导入到数据库中或者将数据库的文件导出到Excel里。

posted @ 2016-09-20 14:54  啊王会  阅读(11264)  评论(0编辑  收藏  举报