public static string GetConnectionString(string FileName) { if (FileName.ToLower().EndsWith("xls")) { return "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FileName + ";Extended Properties='Excel 8.0;HDR=No;IMEX=1;';Persist Security Info=False";//2003 } else if (FileName.ToLower().EndsWith("xlsx")) { return "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FileName + ";Extended Properties='Excel 12.0;HDR=No;IMEX=1;';Persist Security Info=False";//2007 } else return "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FileName + ";Extended Properties='Text;FMT=Delimited;HDR=YES;IMEX=1;'";//读取文本文档(.csv,.txr等) 此处filename是指文本文件所在路径,不包含文件名 } /// <summary> /// 读取文件数据 /// </summary> /// <param name="FileName">读取excel时,此参数是文件全路径(带文件名,eg:E:\data\abc.xls),读取文本文件时,此参数是文件路径(不带文件名 eg:E:\data)</param> /// <param name="SheetName">读取excel时,此参数是sheet名 eg:sheet1,读取文本文件时,此参数是文件名 eg:abc.cvs</param> /// <returns></returns> public static DataTable ToDataTable(string FileName, string SheetName) { OleDbDataAdapter adp = new OleDbDataAdapter("select * from [" + SheetName + "]", GetConnectionString(FileName)); DataTable dt = new DataTable(); adp.Fill(dt); return dt; }
以上是主要代码
需要注意的地方:
1,03和07的链接字符串不同,写错会报错:外部表不是预期的格式
2,cvs和txt的链接字符串和excel不同,它是指向目录的而不是文件,文件名需要在sql语句中作为sheet名给出
3,导入 cvs或txt时,每列的数据格式必须相同,否则会丢失数据。最好将所有非字符串格式的数据加上双引号
4,sheet名,必须在后边加上 $ 如:Sheet1$ 否则 :Microsoft Office Access 数据库引擎找不到对象“Sheet1”。请确定该对象存在,并正确拼写其名称和路径名。