读取具有不同工作表名称的多个Excel工作表

时间:2013-09-03 12:32:14

标签: c# excel oledb

我想知道如何在c#中使用不同的工作表名称读取多个excel工作表,并使用oledb。

我有这种现有方式来读取多张工作表(但具有固定的工作表名称):

DataSet ds = new DataSet();
var excelConnectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0", path); 
OleDbConnection connection = new OleDbConnection();
connection.ConnectionString = excelConnectionString;

var i = 1;
while (i <= 4)
{
    string query = "SELECT * FROM [Sheet" + i + "$]";
    ds.Clear();
    OleDbDataAdapter data = new OleDbDataAdapter(query, connection);
    data.Fill(ds);

    // other stuff
    i = i + 1;
}

这个有效。但我现在处于不同的情况,其中工作表名称不固定,例如:Sheet1是Dog,Sheet2是Cat Sheet3是Bird。

现在我关心的是如何使用现有代码循环这些工作表名称。

1 个答案:

答案 0 :(得分:4)

这是来自VB.net,但不确定它的翻译效果,返回包含所有工作表名称的字符串列表:

OleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"})

<强> MSDN Link

获得工作表名称列表后,您可以执行一个简单的For Each循环来迭代。

修改

这应该适用于C#

添加功能

static DataTable GetSchemaTable(string connectionString)
{
    using (OleDbConnection connection = new 
               OleDbConnection(connectionString))
    {
        connection.Open();
        DataTable schemaTable = connection.GetOleDbSchemaTable(
            OleDbSchemaGuid.Tables,
            new object[] { null, null, null, "TABLE" });
        return schemaTable;
    }
}

您的代码将更改为:

DataSet ds = new DataSet();
var excelConnectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0", path); 
OleDbConnection connection = new OleDbConnection();
connection.ConnectionString = excelConnectionString;

DataTable sheets = GetSchemaTable(excelConnectionString);

foreach (dataRow r in sheets.rows)
{
    string query = "SELECT * FROM [" + r.Item(0).ToString + "]";
    ds.Clear();
    OleDbDataAdapter data = new OleDbDataAdapter(query, connection);
    data.Fill(ds);

}

请确保在每次迭代后使用ds执行某些操作。