OleDb读取Excel 的方法|.Net开发|码途山海.智隐长卷 -

程序人生|重庆纽新

找回密码
立即注册

QQ登录

只需一步,快速开始

欢迎访问【程序人生-重庆纽新】,本网站为软件开发人员视觉的IT资讯、软件开发中各种问题的解决办法!!
搜索
发新帖


2308

积分

0

好友

259

主题
楼主
发表于 2015-11-18 14:52:34 | 查看: 3924| 回复: 0
OleDb: 用这种方法读取Excel速度还是非常的快的,但这种方式读取数据的时候不太灵活,不过可以在 DataTable 中对数据进行一些删减修改
这种方式将Excel作为一个数据源,直接用Sql语句获取数据了。所以读取之前要知道此次要读取的Sheet(当然也可以用序号,类似dt.Row[0][0]。这样倒是不需要知道Sheet)
以上是读取Excel的Sheet名,xls和xlsx的连接字符串也不一样的,可以根据文件的后缀来区别。这里需要注意的一点,Excel里面只有一个Sheet,但通过这种方式读取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. OleDbConnection conn new OleDbConnection(connStr);
  6. DataTable dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
复制代码

【在使用过程中发现取出的Sheet和实际excel不一致, 会多出不少。目前总结后有两种情况:
1. 取出的名称中,包括了XL命名管理器中的名称(参见XL2007的公式--命名管理器, 快捷键Crtl+F3);
2. 取出的名称中,包括了FilterDatabase后缀的, 这是XL用来记录Filter范围的
对于第一点比较简单, 删除已有命名管理器中的内容即可;第二点处理起来比较麻烦, Filter删除后这些名称依然保留着,简单的做法是新增sheet然后将原sheet Copy进去】
---------------------------------
但实际情况并不能为每个Excel做以上检查,先看代码吧
  1. for (int i = 0; i < dtSheetName.Rows.Count; i++)

  2. {

  3. SheetName = (string)dtSheetName.Rows[i]["TABLE_NAME"];

  4. if (SheetName .Contains("$") && !SheetName .Replace("'", "").EndsWith("$"))continue;//过滤无效SheetName完毕....
  5. da.SelectCommand = new OleDbCommand(String.Format(sql_F, tblName), conn);
  6. DataSet dsItem = new DataSet();
  7. da.Fill(dsItem, tblName);

  8. }
复制代码


因为读取出来无效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.             if (fileType == ".xls")
  12.                 connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filePath+ ";" + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";
  13.             else
  14.                 connStr = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + filePath+ ";" + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\"";
  15.             string sql_F = "Select * FROM [{0}]";

  16.             OleDbConnection conn = null;
  17.             OleDbDataAdapter da = null;
  18.             DataTable dtSheetName= null;

  19.             DataSet ds = new DataSet();
  20.             try
  21.             {
  22.                 // 初始化连接,并打开
  23.                 conn = new OleDbConnection(connStr);
  24.                 conn.Open();

  25.                 // 获取数据源的表定义元数据                        
  26.                 string SheetName = "";
  27.                 dtSheetName= conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

  28.                 // 初始化适配器
  29.                 da = new OleDbDataAdapter();
  30.                 for (int i = 0; i < dtSheetName.Rows.Count; i++)
  31.                 {
  32.                     SheetName = (string)dtSheetName.Rows[i]["TABLE_NAME"];

  33.                     if (SheetName .Contains("$") && !SheetName .Replace("'", "").EndsWith("$"))
  34.                     {
  35.                         continue;
  36.                     }

  37.                     da.SelectCommand = new OleDbCommand(String.Format(sql_F, SheetName ), conn);
  38.                     DataSet dsItem = new DataSet();
  39.                     da.Fill(dsItem, tblName);

  40.                     ds.Tables.Add(dsItem.Tables[0].Copy());
  41.                 }
  42.             }
  43.             catch (Exception ex)
  44.             {
  45.             }
  46.             finally
  47.             {
  48.                 // 关闭连接
  49.                 if (conn.State == ConnectionState.Open)
  50.                 {
  51.                     conn.Close();
  52.                     da.Dispose();
  53.                     conn.Dispose();
  54.                 }
  55.             }
  56.             return ds;
  57.         }
  58.   
复制代码





收藏回复 只看该作者 道具 举报

高级模式
B Color Image Link Quote Code Smilies



QQ|小黑屋| 码途山海.智隐长卷 渝ICP备15002301号-2   渝公网安备50011202504426

GMT+8, 2025-5-18 02:46 , Processed in 0.047211 second(s), 27 queries .

©Copyright 程序人生!

©2012-2015重庆纽新

快速回复 返回顶部 返回列表