【问题标题】:Is there an easy way to remove/ignore rows above column names in an Excel file using OleDbConnection?有没有一种简单的方法可以使用 OleDbConnection 删除/忽略 Excel 文件中列名上方的行?
【发布时间】:2017-11-05 14:48:03
【问题描述】:

我有这样的代码用于读取 Excel 文件:

string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;" +
    "数据源="+路径+";扩展属性=\"Excel 12.0;HDR=YES\";";

使用 (OleDbConnection conn = new OleDbConnection(connStr))
{
    conn.Open();
    DataTable dtSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
    字符串 sheetName = dtSchema.Rows[0].Field("TABLE_NAME");
    OleDbDataAdapter sheetAdapter = new OleDbDataAdapter("select * from [" + sheetName + "]", conn);
    sheetAdapter.Fill(sheetData);

    DataTable dtColumns = conn.GetSchema("Columns", new string[] { null, null, sheetName, null });

    ...
}

我的代码需要使用/查看列标题。以上仅在列标题是第一行时才有效。有时,我们从客户那里收到的 Excel 文件在列标题上方有几行,其中包含一些关于 Excel 中数据的元数据。发生这种情况时,列标题将位于第 10 行。

我可以打开 Excel 文件并手动删除列标题上方的多余行,这解决了问题。但我们想删除这个手动步骤。

是否有任何简单的方法可以删除/忽略列标题上方的这些额外的起始行?还是我必须想出自定义代码?我能想到的最好方法是关闭HDR,然后每列中具有值的第一行就是列标题行。有没有更简单的方法?

【问题讨论】:

    标签: c# excel row oledbconnection


    【解决方案1】:

    我有从 Excel 读取的代码,需要忽略工作表中的前 11 行,并从 A 到 P 列读取最多 64000 行。

    // Read columns A - P after skipping 11 rows to read the header row
    string ExcelDataQuery = string.Concat("SELECT * FROM [", sheetname, "A12:P64012]");
    

    【讨论】:

      【解决方案2】:

      据我所知(过去检查过该问题),如果标题未放在第 1 行中,则无法使用 SQL 查询从 excel 文件中选择带有 System.Data.OleDb 的表。
      我的解决方案(就像你做的那样)是在查询工作表之前删除标题行上方的所有行 - 只需打开带有Microsoft.Office.Interop 的工作簿,删除多余的行,关闭它而不是查询它。

      Excel 是一个非常强大的工具,但从来没有被设计为像数据库一样工作(例如 SQL\访问文件)。

      【讨论】:

      • 这是非常不正确的。您可以指定单元格范围、列范围或命名范围作为FROM 子句的主题——请参阅here
      猜你喜欢
      • 2023-04-03
      • 2011-04-22
      • 1970-01-01
      • 2011-02-17
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多