C#读取Excel五种方式的体会

  • A+
所属分类:C#

C#读取Excel五种方式的体会 - 逐梦科学 - CSDN博客

C#读取Excel五种方式的体会

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

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

?
1. if (fileType == ".xls")

  1. connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + fileName + ";" + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";

  2. else

  3. 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);

  1. DataTable dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

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

【在使用过程中发现取出的Sheet和实际excel不一致, 会多出不少。目前总结后有两种情况:
1. 取出的名称中,包括了XL命名管理器中的名称(参见XL2007的公式--命名管理器, 快捷键Crtl+F3);

  1. 取出的名称中,包括了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.
  2. {
  3. ?
  4. SheetName = (string)dtSheetName.Rows[i]["TABLE_NAME"];
    6.

  5. 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. ?
13. }

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

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin