2012-05-24 71 views
1

我想檢索Excel工作簿中的工作表的列表,但我收回的集合有表單名稱和數據列ID,這似乎被稱爲原定xlsx xml中的'Defined Names'。你能告訴我如何只返回工作表名稱?OleDb - 檢索Excel工作表名稱還檢索定義的名稱

我正在使用的代碼是沿着線:

OleDbConnection connExcel = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;" 
      + @"Data Source=" + FilePath + ";" 
      + @"Extended Properties=""Excel 8.0;HDR=Yes;"""); 

OleDbCommand cmdExcel = new OleDbCommand(); 
cmdExcel.Connection = connExcel; 
connExcel.Open(); 

DataTable testTable = connExcel.GetSchema("Tables"); 

所產生的TestTable的集合的內容包含TABLE_NAME下的條目:

  • DATA1
  • DATA2
  • DATA3
  • DATA4
  • DATA5
  • 工作表Sheet1 $
  • TEST1 -TEST2
  • TESTHKEY
  • TESTKEYS
  • TESTVKEY

他們都有TABLE的TABLE_TYPE。

與上述對應的原始工作簿將有1個包含5列的工作表,第一行將包含一個標題。我只對Sheet1 $條目感興趣。電子表格是在Excel 2010中創建的 ,我試圖在用C#編寫的ASP.NET 4應用程序中處理它。有可能,工作表名稱可能已被更改,所以我不能保證它始終是Sheet1 $。

回答

2

我的第一個想法是錯誤的,所以我想出了這個解決方法。返回的實際工作表名稱應該始終以$結尾,因此我會對其進行入侵檢查。凌亂,但你確定了一般想法。

OleDbConnection connExcel = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;" 
     + @"Data Source=c:\test.xlsx;" 
     + @"Extended Properties=""Excel 12.0 Xml;HDR=Yes;"""); 

     OleDbCommand cmdExcel = new OleDbCommand(); 
     cmdExcel.Connection = connExcel; 
     connExcel.Open(); 

     DataTable testTable = connExcel.GetSchema("Tables"); 

     String[] excelSheets = new String[testTable.Rows.Count]; 
     int i = 0; 

     foreach (DataRow row in testTable.Rows) 
     { 
      excelSheets[i] = row["TABLE_NAME"].ToString(); 

      if (excelSheets[i].EndsWith("$")) 
      { 
       Console.WriteLine(excelSheets[i] = row["TABLE_NAME"].ToString()); 
       i++; 
      } 
      else 
      { 
       i++; 
      } 

     } 

     Console.ReadLine(); 
+0

感謝您的回覆,作爲後期處理方法適合我! – Mike

+0

經過少許挖掘,我發現當通過從SAP導出數據創建電子表格時,會自動創建定義的名稱,結果輸出中的每個數據列似乎都有一個元素。 元素分組在元素中的組後面的父元素下。 GetSchema方法將它們全部選爲「表」。您可以通過選擇功能區中的公式,然後在「定義的名稱」部分中選擇「名稱管理器」來刪除Excel中定義的名稱。 – Mike

+0

我有類似的問題,我得到更多的工作表比實際,我沒有任何定義的名稱。如果我的工作表名稱是「abc」,那麼我有另一個名爲「abc $」的工作表。任何人都可以解釋爲什麼它的行爲如此嗎?我試圖通過sql導入導入該文件,並且還顯示了額外的工作表,我可以在打開excel文件時看到它們。 –