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里。