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

标签 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。

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

最佳答案

这是来自 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 做一些事情。

关于c# - 读取具有不同工作表名称的多个 Excel 工作表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18592424/

相关文章:

c# - 是否可以使用 Visual Studio 获取集成测试的代码覆盖率数据?

c# - 确定 html 节点的样式

excel - "#N/A"的值和变体类型?

excel - 单击工作表时运行excel VBA函数

c# - 使用 C# 访问 Excel 电子表格有时会为某些单元格返回空白值

c# - 使用 Oledb 导出到没有标题的 excel 文件 c#

c# - 如何对具有日期时间值但显示为字符串的 DataGridView 列进行排序?

c# - 在 Windows 服务程序中记录事件

excel - 如何在Excel单元格中添加多个链接?

asp.net - “The ' Microsoft.Jet.OLEDB.4.0 ' provider is not registered on the local machine”…DNN