我想知道如何在 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。
现在我关心的是如何使用现有代码在这些工作表名称上循环。
最佳答案
这是来自 VB.net 但不确定它翻译得如何,返回包含所有工作表名称的字符串列表:
OleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"})
一旦您有了工作表名称列表,您就可以执行一个简单的 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
做一些事情。
关于c# - 读取具有不同工作表名称的多个 Excel 工作表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18592424/