从两个(不同的)Excel文件select.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() 

您不能使用一个OleDb连接来处理两个不同的文件。 您将需要为第二个文件创build另一个连接并以这种方式提取数据。

下面是我通常编写一个方法来检索工作表中的所有数据:

 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"); 

您正尝试在OleDb查询中使用OleDb的提供者语法。 连接到查询内部的外部Excel文件的语法是不同的。

而且,SQL没有文件的概念,只有表的概念; 您不能通过文件名(例如, filename2 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

链接:

  • IN子句
  • 内部联接