zoukankan      html  css  js  c++  java
  • NPOI操作excel之读取excel数据

    NPOI 是 POI 项目的 .NET 版本。POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。

     一、下载引用

    去NPOI官网http://npoi.codeplex.com/下载需要引用的dll,即:NPOI.dll,NPOI.OOXML.dll,NPOI.OpenXml4Net.dll,ICSharpCode.SharpZipLib.dll(office2007版需要此dll)。

    二、Excel转datatable类

    excel数据:

    Excel转datatable类如下:

      1 using System;
      2 using System.Data;
      3 using System.IO;
      4 using NPOI.SS.UserModel;
      5 using NPOI.XSSF.UserModel;
      6 using NPOI.HSSF.UserModel;
      7 
      8 namespace NPOIOprateExcel
      9 {
     10     public class ExcelUtility
     11     {
     12         /// <summary>
     13         /// 将excel导入到datatable
     14         /// </summary>
     15         /// <param name="filePath">excel路径</param>
     16         /// <param name="isColumnName">第一行是否是列名</param>
     17         /// <returns>返回datatable</returns>
     18         public static DataTable ExcelToDataTable(string filePath, bool isColumnName)
     19         {
     20             DataTable dataTable = null;
     21             FileStream fs = null;
     22             DataColumn column = null;
     23             DataRow dataRow = null;
     24             IWorkbook workbook = null;
     25             ISheet sheet = null;
     26             IRow row = null;
     27             ICell cell = null;
     28             int startRow = 0;
     29             try
     30             {
     31                 using (fs = File.OpenRead(filePath))
     32                 {
     33                     // 2007版本
     34                     if (filePath.IndexOf(".xlsx") > 0)
     35                         workbook = new XSSFWorkbook(fs);
     36                     // 2003版本
     37                     else if (filePath.IndexOf(".xls") > 0)
     38                         workbook = new HSSFWorkbook(fs);
     39 
     40                     if (workbook != null)
     41                     {
     42                         sheet = workbook.GetSheetAt(0);//读取第一个sheet,当然也可以循环读取每个sheet
     43                         dataTable = new DataTable();
     44                         if (sheet != null)
     45                         {
     46                             int rowCount = sheet.LastRowNum;//总行数
     47                             if (rowCount > 0)
     48                             {
     49                                 IRow firstRow = sheet.GetRow(0);//第一行
     50                                 int cellCount = firstRow.LastCellNum;//列数
     51 
     52                                 //构建datatable的列
     53                                 if (isColumnName)
     54                                 {
     55                                     startRow = 1;//如果第一行是列名,则从第二行开始读取
     56                                     for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
     57                                     {
     58                                         cell = firstRow.GetCell(i);
     59                                         if (cell != null)
     60                                         {
     61                                             if (cell.StringCellValue != null)
     62                                             {
     63                                                 column = new DataColumn(cell.StringCellValue);
     64                                                 dataTable.Columns.Add(column);
     65                                             }
     66                                         }
     67                                     }
     68                                 }
     69                                 else
     70                                 {
     71                                     for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
     72                                     {
     73                                         column = new DataColumn("column" + (i + 1));
     74                                         dataTable.Columns.Add(column);
     75                                     }
     76                                 }
     77 
     78                                 //填充行
     79                                 for (int i = startRow; i <= rowCount; ++i)
     80                                 {
     81                                     row = sheet.GetRow(i);
     82                                     if (row == null) continue;
     83 
     84                                     dataRow = dataTable.NewRow();
     85                                     for (int j = row.FirstCellNum; j < cellCount; ++j)
     86                                     {
     87                                         cell = row.GetCell(j);                                        
     88                                         if (cell == null)
     89                                         {
     90                                             dataRow[j] = "";
     91                                         }
     92                                         else
     93                                         {
     94                                             //CellType(Unknown = -1,Numeric = 0,String = 1,Formula = 2,Blank = 3,Boolean = 4,Error = 5,)
     95                                             switch (cell.CellType)
     96                                             {
     97                                                 case CellType.Blank:
     98                                                     dataRow[j] = "";
     99                                                     break;
    100                                                 case CellType.Numeric:
    101                                                     short format = cell.CellStyle.DataFormat;
    102                                                     //对时间格式(2015.12.5、2015/12/5、2015-12-5等)的处理
    103                                                     if (format == 14 || format == 31 || format == 57 || format == 58)
    104                                                         dataRow[j] = cell.DateCellValue;
    105                                                     else
    106                                                         dataRow[j] = cell.NumericCellValue;
    107                                                     break;
    108                                                 case CellType.String:
    109                                                     dataRow[j] = cell.StringCellValue;
    110                                                     break;
    111                                             }
    112                                         }
    113                                     }
    114                                     dataTable.Rows.Add(dataRow);
    115                                 }
    116                             }
    117                         }
    118                     }
    119                 }
    120                 return dataTable;
    121             }
    122             catch (Exception)
    123             {
    124                 if (fs != null)
    125                 {
    126                     fs.Close();
    127                 }
    128                 return null;
    129             }
    130         }
    131     }
    132 }

    三、返回结果

    调用上述方法:

    private void ReadExcelData()
            {
                DataTable dataTable = null;//接受从excel读取的数据
                string filePath = MapPath("/ExcelFile/excel1.xls");//文件路径姑且写死
                dataTable = ExcelUtility.ExcelToDataTable(filePath, true);
            }

    返回的datatable如下:

    以上就是NPOI读取excel的方法,接下来就可以把datatable插入数据库了,此处省略。

  • 相关阅读:
    PHP基本的语法以及和Java的差别
    Linux 性能測试工具
    【Oracle 集群】Linux下Oracle RAC集群搭建之Oracle DataBase安装(八)
    【Oracle 集群】Oracle 11G RAC教程之集群安装(七)
    【Oracle 集群】11G RAC 知识图文详细教程之RAC在LINUX上使用NFS安装前准备(六)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 特殊问题和实战经验(五)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之缓存融合技术和主要后台进程(四)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 工作原理和相关组件(三)
    Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之ORACLE集群概念和原理(二)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之集群概念介绍(一)
  • 原文地址:https://www.cnblogs.com/qk2014/p/5021152.html
Copyright © 2011-2022 走看看