1

任何人都可以帮我解决这个问题。我想做这样的事情。

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()
4

2 回答 2

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");
于 2012-12-03T18:08:05.657 回答
2

您正在尝试在 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使用表格,请使用 aJOIN而不是UNION+ WHERE

链接:

于 2012-12-04T11:17:11.820 回答