对于出现如题的错误,本人的另一篇博文已经指出原因,那么怎样才能自动获得Excel中各个sheet的名称呢?这样就能动态的选中返回那个sheet的数据,即使用户更改了名称也不怕,完全可以把所有sheet的名称列出来供用户选择。下面就把解决问题的代码列出来,主要用到了OleDbConnection.GetOleDbSchemaTable()方法。
///
/// 执行导入
///
/// Excel文件名
/// DataSet
public static DataSet doImport(string strFileName)
{
if (strFileName == "")
return null;
else
{
DataSet ExcelDs = new DataSet();
try
{
//Excel数据库连接串
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = '" + strFileName + "';Extended Properties ='Excel 8.0;HDR=NO;IMEX=1'";
OleDbConnection OleDB = new OleDbConnection(strConn);//打开数据源连接
OleDB.Open();//打开连接
//返回Excel的架构,包括各个sheet表的名称,类型,创建时间和修改时间等
System.Data.DataTable dtSheetName = OleDB.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" });
//声明包含excel中表名的字符串数组
string[] strTableNames = new string[dtSheetName.Rows.Count];
//将表名存入数组中
for (int k = 0; k < dtSheetName.Rows.Count; k++)
{
strTableNames[k] = dtSheetName.Rows[k]["TABLE_NAME"].ToString();
}
//从指定的表名查询数据
string strSheet = "select * from [" + strTableNames[0] + "]";
OleDbDataAdapter ExcelDA = new OleDbDataAdapter(strSheet, OleDB);//连接数据库
ExcelDA.Fill(ExcelDs, "ExcelInfo");
}
catch (Exception err)
{
MessageBox.Show(err.Message.Tostring(), "错误提示");
}
return ExcelDs;
}