zoukankan      html  css  js  c++  java
  • [转载]C#读取Excel几种方法的体会

    C#读取Excel几种方法的体会

    转载地址:http://developer.51cto.com/art/201302/380622.htm

    (1) OleDb: 用这种方法读取Excel速度还是非常的快的,但这种方式读取数据的时候不太灵活,不过可以在 DataTable 中对数据进行一些删减修改

    这种方式将Excel作为一个数据源,直接用Sql语句获取数据了。所以读取之前要知道此次要读取的Sheet(当然也可以用序号,类似dt.Row[0][0]。这样倒是不需要知道Sheet)
    ?

    1. if (fileType == ".xls")  
    2.    connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + fileName + ";" + ";Extended Properties="Excel 8.0;HDR=YES;IMEX=1"";  
    3. else 
    4.    connStr = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + fileName + ";" + ";Extended Properties="Excel 12.0;HDR=YES;IMEX=1"";  
    5.    
    6. OleDbConnection conn new OleDbConnection(connStr);  
    7. DataTable dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { nullnullnull"TABLE" }); 

    以上是读取Excel的Sheet名,xls和xlsx的连接字符串也不一样的,可以根据文件的后缀来区别。这里需要注意的一点,Excel里面只有一个Sheet,但通过这种方式读取Sheet可能会大于一个。原因已经有人在别的网站说过了,偷一下懒O(∩_∩)O,下面文段来自【cdwolfling

    【在使用过程中发现取出的Sheet和实际excel不一致, 会多出不少。目前总结后有两种情况:

    1. 取出的名称中,包括了XL命名管理器中的名称(参见XL2007的公式--命名管理器, 快捷键Crtl+F3);

    2. 取出的名称中,包括了FilterDatabase后缀的, 这是XL用来记录Filter范围的,  参见http://www.mrexcel.com/forum/showthread.php?t=27225

    对于第一点比较简单, 删除已有命名管理器中的内容即可;第二点处理起来比较麻烦, Filter删除后这些名称依然保留着,简单的做法是新增sheet然后将原sheet Copy进去】

    ---------------------------------

    但实际情况并不能为每个Excel做以上检查【cdwolfling】也给出了过滤的方案,当时还是有点问题,本来补充了一点。总之先看代码吧

    1. for (int i = 0; i < dtSheetName.Rows.Count; i++)  
    2.  
    3. {  
    4. ?  
    5. SheetName = (string)dtSheetName.Rows[i]["TABLE_NAME"];  
    6.    
    7. if (SheetName .Contains("$") && !SheetName .Replace("'""").EndsWith("$"))continue;//过滤无效SheetName完毕....  
    8.  
    9. da.SelectCommand = new OleDbCommand(String.Format(sql_F, tblName), conn);  
    10. DataSet dsItem = new DataSet();  
    11. da.Fill(dsItem, tblName);  
    12. ?  

    因为读取出来无效SheetName一般情况最后一个字符都不会是$。如果SheetName有一些特殊符号,读取出来的SheetName会自动加上单引号,比如在Excel中将SheetName编辑成:MySheet(1),此时读取出来的SheetName就为:'MySheet(1)$',所以判断最后一个字符是不是$之前最好过滤一下单引号。

    优点:读取方式简单、读取速度快

    缺点:除了读取过程不太灵活之外,这种读取方式还有个弊端就是,当Excel数据量很大时。会非常占用内存,当内存不够时会抛出内存溢出的异常。

    不过一般情况下还是非常不错的

    读取Excel完整代码:

      1. /// <summary>  
      2.         /// 读取Excel文件到DataSet中  
      3.         /// </summary>  
      4.         /// <param name="filePath">文件路径</param>  
      5.         /// <returns></returns>  
      6.         public static DataSet ToDataTable(string filePath)  
      7.         {  
      8.             string connStr = "";             
      9.             string fileType = System.IO.Path.GetExtension(fileName);  
      10.             if (string.IsNullOrEmpty(fileType)) return null;  
      11.    
      12.             if (fileType == ".xls")  
      13.                 connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filePath+ ";" + ";Extended Properties="Excel 8.0;HDR=YES;IMEX=1"";  
      14.             else 
      15.                 connStr = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + filePath+ ";" + ";Extended Properties="Excel 12.0;HDR=YES;IMEX=1"";  
      16.             string sql_F = "Select * FROM [{0}]";  
      17.    
      18.             OleDbConnection conn = null;  
      19.             OleDbDataAdapter da = null;  
      20.             DataTable dtSheetName= null;  
      21.    
      22.             DataSet ds = new DataSet();  
      23.             try 
      24.             {  
      25.                 // 初始化连接,并打开  
      26.                 conn = new OleDbConnection(connStr);  
      27.                 conn.Open();  
      28.    
      29.                 // 获取数据源的表定义元数据                         
      30.                 string SheetName = "";  
      31.                 dtSheetName= conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { nullnullnull"TABLE" });  
      32.    
      33.                 // 初始化适配器  
      34.                 da = new OleDbDataAdapter();  
      35.                 for (int i = 0; i < dtSheetName.Rows.Count; i++)  
      36.                 {  
      37.                     SheetName = (string)dtSheetName.Rows[i]["TABLE_NAME"];  
      38.    
      39.                     if (SheetName .Contains("$") && !SheetName .Replace("'""").EndsWith("$"))  
      40.                     {  
      41.                         continue;  
      42.                     }  
      43.    
      44.                     da.SelectCommand = new OleDbCommand(String.Format(sql_F, SheetName ), conn);  
      45.                     DataSet dsItem = new DataSet();  
      46.                     da.Fill(dsItem, tblName);  
      47.    
      48.                     ds.Tables.Add(dsItem.Tables[0].Copy());  
      49.                 }  
      50.             }  
      51.             catch (Exception ex)  
      52.             {  
      53.             }  
      54.             finally 
      55.             {  
      56.                 // 关闭连接  
      57.                 if (conn.State == ConnectionState.Open)  
      58.                 {  
      59.                     conn.Close();  
      60.                     da.Dispose();  
      61.                     conn.Dispose();  
      62.                 }  
      63.             }  
      64.             return ds;  
      65.         } 
  • 相关阅读:
    基础1-安装zookeeper
    Logstash-input-file 配置
    Logstash-input-rabbitmq 配置
    EF 部分更新 忽略NULL
    CoreApi 3.1
    logstash基于RabbitMQ的输入配置
    史上最详细的linux三剑客讲解-grep-awk-sed
    CDN概述
    HttpDNS和传统DNS的区别
    Linux性能分析工具之----mpstat
  • 原文地址:https://www.cnblogs.com/longshaoye/p/3426861.html
Copyright © 2011-2022 走看看