我这样连接Excel表:
try
{
string filepath = Server.MapPath("test.xls");
        String strConnectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;IMEX=1'", filepath);        OleDbConnection Excel_conn = new OleDbConnection(strConnectionString);        string query = "SELECT *   FROM [Sheet1$]";
        
        OleDbDataAdapter oleAdapter = new OleDbDataAdapter(query, Excel_conn);
        DataSet myDataSet = new DataSet();
        Excel_conn.Open();
        oleAdapter.Fill(myDataSet, "Excel_Sheet1");
        Excel_conn.Close();
}
catch (Exception ex)
            {
                Label1.Text = ex.Message;
            }如果test.xls的第一个工作表名称是Sheet1时,运行正常
如果test.xls的第一个工作表名称是asdfg时,出现错误:'Sheet1$' 不是一个有效名称。请确认它不包含无效的字符或标点,且名称不太长。且不能释放系统资源:文件“test.xls”正由另一进程使用,因此该进程无法访问该文件。
这时不能修改删除test.xls表,要重启系统后才能修改或删除。
请问:
1、如何在连接Excel表是首选取得工作表名,使不同的工作表名也能正常运行不会出错?
2、如果出错应如何完全释放系统资源,可以使用另一个工作表?

解决方案 »

  1.   

    1、   string query = "SELECT *  FROM [Sheet1$]"; Sheet1$ 相当于数据库表的名称,你要查询肯定要先确定表名 啊2、第二个问题在finally里面关闭连接
    try
    {
    }
    catch
    {
    }
    finally
    {
       Excel_conn.Close(); 
    }
      

  2.   

    对于第一个问题,要是不确定Excel文件里面工作薄名称的话,试试用using Excel,操作Excel文件的方法能不能获得第一个工作薄的名称。我估计这种方法应该可行!
      

  3.   

    多谢了,
    由于Excel工作是上传的,可能会出现某人上传的他的工作表名已改为另一名称,这样使整个系统不能用也即另外一个人也不能用此系统。
      

  4.   

    string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("/") + "Stu2009-10-15.xls" + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";
                OleDbConnection objConn = new OleDbConnection(strConn);         
                List<string> SheetNameList = new List<string>();           
                    objConn.Open();
                    DataTable dtExcelSchema = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
                    string SheetName = "";
                    for (int i = 0; i < dtExcelSchema.Rows.Count; i++)
                    {
                        SheetName = dtExcelSchema.Rows[i]["TABLE_NAME"].ToString();
                        SheetNameList.Add(SheetName);
                    }
                    GridView1.DataSource =SheetNameList;
                    GridView1.DataBind();
    表名,一般是三个