C#自动判断Excel版本使用不同的连接字符串
用OLEDB通过设置连接字符串可以像读取sqlserver一样将excel中的数据读取出来,但是excel2003和excel2007/2010的连接字符串是不同的。
///<summary>
///把数据从Excel装载到DataTable
///</summary>
///<paramname="pathName">带路径的Excel文件名</param>
///<paramname="sheetName">工作表名</param>
///<paramname="tbContainer">将数据存入的DataTable</param>
///<returns></returns>
publicDataTableExcelToDataTable(stringpathName,stringsheetName)
{
DataTabletbContainer=newDataTable();
stringstrConn=string.Empty;
if(string.IsNullOrEmpty(sheetName)){sheetName="Sheet1";}
FileInfofile=newFileInfo(pathName);
if(!file.Exists){thrownewException("文件不存在");}
stringextension=file.Extension;
switch(extension)
{
case".xls":
strConn="Provider=Microsoft.Jet.OLEDB.4.0;DataSource="+pathName+";ExtendedProperties='Excel8.0;HDR=Yes;IMEX=1;'";
break;
case".xlsx":
strConn="Provider=Microsoft.ACE.OLEDB.12.0;DataSource="+pathName+";ExtendedProperties='Excel12.0;HDR=Yes;IMEX=1;'";
break;
default:
strConn="Provider=Microsoft.Jet.OLEDB.4.0;DataSource="+pathName+";ExtendedProperties='Excel8.0;HDR=Yes;IMEX=1;'";
break;
}
//链接Excel
OleDbConnectioncnnxls=newOleDbConnection(strConn);
//读取Excel里面有表Sheet1
OleDbDataAdapteroda=newOleDbDataAdapter(string.Format("select*from[{0}$]",sheetName),cnnxls);
DataSetds=newDataSet();
//将Excel里面有表内容装载到内存表中!
oda.Fill(tbContainer);
returntbContainer;
}
这里需要注意的地方是,当文件的后缀名为.xlsx(excel2007/2010)时的连接字符串是"Provider=Microsoft.ACE.OLEDB.12.0;....",注意中间红色部分不是"Jet"。