2012-12-03 22 views
1

任何人都可以幫助我解決這個問題。 我想做這樣的事情。從兩個(不同的)Excel文件中選擇.NET

strSQL = SELECT [filename1].[" & xlSheet.Name & "$].Col1 
, [filename1].[" & xlSheet.Name & "$].Col2 
FROM [filename1].[" & xlSheet.Name & "$] 
UNION ALL 
SELECT [filename2].[" & xlSheet2.Name & "$].Col1 
, [filename2].[" & xlSheet2.Name & "$].Col2 
FROM [Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename2+ ";Extended Properties=Excel 12.0;HDR=Yes].[" & xlSheet2.Name & "$] 
WHERE [filename1].[" & xlSheet.Name & "$].Col1= [filename2].[" & xlSheet2.Name & "$].Col1 

Using conExcel As New OleDb.OleDbConnection() 
conExcel.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename1 + ";Extended Properties=Excel 12.0;HDR=Yes" 
conExcel.Open() 
cmdSelect.CommandText = strSQL 
cmdSelect.Connection = conExcel 
intRowsCount = cmdSelect.ExecuteNonQuery() 
+0

我已經編輯了 「代碼」 的東西更相似。 錯誤是一個OleDbException「FROM子句中的語法錯誤」。 – Mac

+0

我想你會更好地運行每個單獨的和將結果轉儲到數據表。 – Limey

回答

1

您無法使用一個OleDb連接處理兩個不同的文件。您需要爲第二個文件創建另一個連接並以這種方式提取數據。

下面是我平時的代碼檢索表中的所有數據的方法:

private DataTable RetrieveData(string filename, string sheetName) 
{ 
    string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename + ";Extended Properties=\"Excel 12.0;HDR=YES\""; 
    string query = "SELECT * from [" + sheetName + "$]"; 
    DataTable dt = new DataTable(); 

    using (OleDbConnection conn = new OleDbConnection(connectionString)) 
    { 
     conn.Open(); 

     using (OleDbDataAdapter dataAdapter = new OleDbDataAdapter(query, conn)) 
     { 
      dataAdapter.Fill(dt); 
     } 

     conn.Close(); 
    } 

    return dt; 
} 

然後你可以使用每個文件的調用它:

DataTable dt1 = RetrieveData("filename1.xlsx", "Sheet1"); 
DataTable dt2 = RetrieveData("filename2.xlsx", "Sheet1"); 
+0

謝謝西德。 謝謝大家! – Mac

+0

它**是**可以加入兩個外部Excel文件(請參閱我的答案),但使用數據表顯然更簡單。 –

1

你試圖在OleDb查詢中使用OleDb的提供者語法。連接到查詢內部的外部Excel文件的語法不同。

此外,SQL沒有文件的概念,只有表的概念;您不能通過其文件名引用特定文件中的字段(例如filename1filename2)。但是,您可以將UNION的FROM子句中的第二個文件定義爲第二個表。

var strSQL = String.Format(@" 
    SELECT [{0}$].Col1, 
     [{0}$].Col2, 
    FROM [{0}$] 

    UNION ALL 
    SELECT [{1}$].Col1, 
     [{1}$].Col1 
    FROM [{1}$] IN ""{2}"" ""Excel 12.0;"" 

    WHERE [{0}$].Col1 = [{1}$].Col1 
", xlSheet.Name, xlSheet2.Name, @"C:\path\to\exce\file"); 

如果你想JOIN表,使用JOIN代替UNION + WHERE

鏈接:

+0

有趣的是,我不知道你可以做到這一點。 –