在项目里以前一直使用写好的导入Excel函数!打开Excel遍历Excel单元格值最后转换成DataTabel这样用了好久,突然有一天要导入Excel发现如果Excel有一列日期类型(1900-1-1)导入就成了double类型,使我非常郁闷!
今天和同事的讨论下我们使用了oled连接打开获得excel存储到DataSet中最后使用,其中发现根据Excel的版本不同连接语句也有差别;
2003以下(包括2003)版本:string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=/"Excel 11.0;HDR=Yes;IMEX=1/"", 文件路径);
2007版本:string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=/"Excel 12.0;HDR=YES;/"",文件路径);
需要注意的是高版本兼容低版本,相反则报错!如果使用2003版本语句有可能会出现OleDbException,找不到可安装的 ISAM。这样大家最好使用2007版本语句就可以了(前提是要安装2007)!如果不出异常可以直接使用2003版本连接语句,本人太懒没有去处理2003版本的异常处理!直接使用了2007(我安装了2007)
-----------------下面是连接读取Excel的简单语句------------------------
string filePath = "F://****//*.xls";
int d = OfficeRigistKey.GetRigistKey(OfficeRigistKey.DocType.Excel);
string strConn = "";
if (d == 12) //office2007
{
strConn = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=/"Excel 12.0;HDR=YES;/"",filePath);
}
else //office2003及以下版本
{
strConn =string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=/"Excel 8.0;HDR=Yes;IMEX=1/"",filePath);
}
OleDbConnection conn = new OleDbConnection(strConn);
string strExcel = "select * from [sheet2$]";
conn.Open();
OleDbDataAdapter myCommand= new OleDbDataAdapter(strExcel, strConn);
DataSet ds = new DataSet();
myCommand.Fill(ds, "table1");
return ds;