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插入数据库了,此处省略。

  • 相关阅读:
    [IOI1998] Pictures
    【C++】位操作(3)-获取某位的值
    PAT A 1013. Battle Over Cities (25)【并查集】
    hihoCoder 1391 Countries【预处理+排序+优先队列】2016北京网络赛
    PAT A 1014. Waiting in Line (30)【队列模拟】
    codeforces Round#379 div.2
    PAT A 1004. Counting Leaves (30)【vector+dfs】
    POJ 1163:The Triangle
    LeetCode39/40/22/77/17/401/78/51/46/47/79 11道回溯题(Backtracking)
    BZOJ 3680 吊打XXX
  • 原文地址:https://www.cnblogs.com/qk2014/p/5021152.html
Copyright © 2011-2022 走看看