任何人都可以帮助我。 我想做这样的事情。
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 :(得分:2)
使用一个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");
答案 1 :(得分:2)
您正尝试在OleDb查询中使用OleDb的提供程序语法。连接到查询中的外部Excel文件的语法是不同的。
此外,SQL没有文件的概念,只有表格;您无法通过文件名引用特定文件中的字段(例如filename1
,filename2
)。但是,您可以将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
。
链接: