欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#自动判断Excel版本使用不同的连接字符串

程序员文章站 2023-01-11 08:14:37
用oledb通过设置连接字符串可以像读取sqlserver一样将excel中的数据读取出来,但是excel2003和excel2007/2010的连接字符串是不同的。...

用oledb通过设置连接字符串可以像读取sqlserver一样将excel中的数据读取出来,但是excel2003和excel2007/2010的连接字符串是不同的。

  /// <summary>
  /// 把数据从excel装载到datatable
  /// </summary>
  /// <param name="pathname">带路径的excel文件名</param>
  /// <param name="sheetname">工作表名</param>
  /// <param name="tbcontainer">将数据存入的datatable</param>
  /// <returns></returns>
  public datatable exceltodatatable(string pathname, string sheetname)
  {
    datatable tbcontainer = new datatable();
    string strconn = string.empty;
    if (string.isnullorempty(sheetname)) { sheetname = "sheet1"; }
    fileinfo file = new fileinfo(pathname);
    if (!file.exists) { throw new exception("文件不存在"); }
    string extension = file.extension;
    switch (extension)
    {
      case ".xls":
        strconn = "provider=microsoft.jet.oledb.4.0;data source=" + pathname + ";extended properties='excel 8.0;hdr=yes;imex=1;'";
        break;
      case ".xlsx":
        strconn = "provider=microsoft.ace.oledb.12.0;data source=" + pathname + ";extended properties='excel 12.0;hdr=yes;imex=1;'";
        break;
      default:
        strconn = "provider=microsoft.jet.oledb.4.0;data source=" + pathname + ";extended properties='excel 8.0;hdr=yes;imex=1;'";
        break;
    }
    //链接excel
    oledbconnection cnnxls = new oledbconnection(strconn);
    //读取excel里面有 表sheet1
    oledbdataadapter oda = new oledbdataadapter(string.format("select * from [{0}$]", sheetname), cnnxls);
    dataset ds = new dataset();
    //将excel里面有表内容装载到内存表中!
    oda.fill(tbcontainer);
    return tbcontainer;
  }

这里需要注意的地方是,当文件的后缀名为.xlsx(excel2007/2010)时的连接字符串是"provider=microsoft.ace.oledb.12.0;....",注意中间红色部分不是"jet"。