我想知道如何在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。
现在我关心的是如何使用现有代码循环这些工作表名称。
答案 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
执行某些操作。