2014-09-02 134 views
0

你也許我重定向到這一個環節,但我會是第一個告訴你們:我用這個了很多次,我真不這次不知道什麼問題。asp.net - 閱讀Excel工作表的名稱不返回數據表

我的情況是:我需要將Excel數據導入到數據庫中。聽起來很簡單,對吧?現在,首先我需要知道表單名稱。這就是我的問題開始的地方。我再說一遍,我已經使用了多次,我不知道我做錯了什麼這一次:

的「它」,我指的是這段代碼:

public string[] GetSheetNames(string excelPath) { 

      try 
      { 

      string[] ar = null; 

      if (Path.GetExtension(excelPath) == ".xls") 
      { 
       conString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + excelPath + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\""); 
      } 

      else if (Path.GetExtension(excelPath) == ".xlsx") 
      { 
       conString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelPath + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES\";"); 
      } 

       using (oleConn = new OleDbConnection(conString)) 
       { 
        oleConn.Open(); 

        if (oleConn.State == ConnectionState.Open) 
        { 

         //DataTable dt = oleConn.GetSchema("Tables"); 

         //DataTable dt = oleConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] {null, null, null, "TABLE"}); 

         DataTable dt = oleConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 

         if (dt == null) 
         { 
          return null; 
         } 

         ar = new string[dt.Rows.Count]; 
         int t = 0; 

         foreach(DataRow dr in dt.Rows){ 

          ar[t] = dr["TABLE_NAME"].ToString(); 
          t++; 
         } 


        } 


        return ar; 
       } 

      } 
      catch (Exception) 
      { 

       throw; 
      } 
     } 

它拋出一個異常,稱該數據表的行數爲0。我也用DataTable dt = oleConn.GetSchema("Tables")

DataTable dt = oleConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, 
      new Object[] {null, null, null, "TABLE"}); 

,但他們都返回相同。

可能是什麼問題?它可能是Excel文件嗎?但我試過其他Excel文件,都失敗了。

+0

你可以發佈'DataTable dt'的調試可視化器嗎? – Hassan 2014-09-02 04:34:19

回答

1

試試這個代碼:

OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename + ";Extended Properties='Excel 12.0 xml;HDR=YES;'"); 
         connection.Open(); 
         DataTable Sheets = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 

      foreach (DataRow dr in Sheets.Rows) 
        { 
         string sht = dr[2].ToString().Replace("'", ""); 
         OleDbDataAdapter dataAdapter = new OleDbDataAdapter("select * from [" + sht + "]", connection); 
    } 
+0

兄弟,我需要獲取工作表名稱,而不是在特定工作表中查詢。 – DustineTheGreat 2014-09-02 03:45:41

+0

好,我是編輯 – 2014-09-02 03:50:58

+0

甚至不能進入我的foreach循環,因爲該行數爲0 – DustineTheGreat 2014-09-02 03:51:26

-1
private DataSet GetExcelWorkSheet(string pathName, string fileName, int workSheetNumber) 
{ 
    OleDbConnection ExcelConnection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + @"\" + fileName + ";Extended Properties=Excel 8.0;"); 
    OleDbCommand ExcelCommand = new OleDbCommand(); 
    ExcelCommand.Connection = ExcelConnection; 
    OleDbDataAdapter ExcelAdapter = new OleDbDataAdapter(ExcelCommand); 

    ExcelConnection.Open(); 
    DataTable ExcelSheets = ExcelConnection.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); 
    string SpreadSheetName = "[" + ExcelSheets.Rows[workSheetNumber]["TABLE_NAME"].ToString() + "]"; 

    DataSet ExcelDataSet = new DataSet(); 
    ExcelCommand.CommandText = @"SELECT * FROM " + SpreadSheetName; 

    ExcelAdapter.Fill(ExcelDataSet); 

    ExcelConnection.Close(); 
    return ExcelDataSet; 
} 
+2

它有助於提供解答,而不僅僅是代碼轉儲。 – mason 2014-09-02 04:10:30

1

我不知道你是否還需要選擇,但這個只是發生在我身上,我得到了一個解決方案。

我的問題是文件本身,複製到本地文件夾時,我沒加進行擴展,以便在連接打開它創建一個沒有表的空文件(即沒有表讀)

如果你是將文件移動到本地文件夾,查看該文件並查看它是否沒有損壞,並且在複製後確實需要閱讀某些內容。

+0

這是此錯誤的可能原因之一。文件路徑或文件名可能是錯誤的。也許這可以幫助某人。 – Julia 2017-06-02 13:04:11