c#做excel读取到DataTable的时候,启动报错:
刚解决完“未在本地计算机注册Microsoft.ACE.oledb.12.0提供程序”以为调用可以成功了,结果又报这个错。
代码如下:
public static DataTable ReadExcelToTable()//excel存放的路径
{
try
{
String path = System.Windows.Forms.Application.StartupPath + "\\lcdm.xlsx";
//连接字符串
string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';"; // Office 07及以上版本 不能出现多余的空格 而且分号注意
//string connstring = Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';"; //Office 07以下版本
using (OleDbConnection conn = new OleDbConnection(connstring))
{
conn.Open();
DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); //得到所有sheet的名字
string firstSheetName = sheetsName.Rows[0][2].ToString(); //得到第一个sheet的名字
string sql = string.Format("SELECT * FROM [{0}]", firstSheetName); //查询字符串
OleDbDataAdapter ada = new OleDbDataAdapter(sql, connstring);
DataSet set = new DataSet();
ada.Fill(set);
return set.Tables[0];
}
}
catch (Exception er)
{
MessageBox.Show(er.Message.ToString());
return null;
}
}
怎么看都不像有错,网上查了一些资料,情况无非两种:
1、文件被占用
2、关键字冲突
3、还有就是sheet名字后面加一个"$"
,
例如select * from [Sheet1$]
,
但是select * from [{0}]
这样就不需要加$
的。
4、还有一种就是拼接文件名,需要加“'”
new OleDbDataAdapter("SELECT * FROM " + fileName, sConnection);
这种应该改成
new OleDbDataAdapter("SELECT * FROM `" + fileName + "`", sConnection);
但是最后,发现笔者都不是以上问题。
最后,我想会不会是文件路径的问题啊,于是做调试,path去掉文件名字,必然报错!
String path = System.Windows.Forms.Application.StartupPath ;
查看报错信息,路径果然不对,那个路径我没放文件,于是重新将文件防止对应的路径。
程序正常,解决问题了!