有没有一种简单的方法可以使用 OleDbConnection 删除/忽略 Excel 文件中列名上方的行?

Posted

技术标签:

【中文标题】有没有一种简单的方法可以使用 OleDbConnection 删除/忽略 Excel 文件中列名上方的行?【英文标题】:Is there an easy way to remove/ignore rows above column names in an Excel file using OleDbConnection? 【发布时间】: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,然后每列中具有值的第一行就是列标题行。有没有更简单的方法?

【问题讨论】:

【参考方案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。

以上是关于有没有一种简单的方法可以使用 OleDbConnection 删除/忽略 Excel 文件中列名上方的行?的主要内容,如果未能解决你的问题,请参考以下文章

有没有一种简单的方法可以在 PostgreSQL 查询中使用变量? [复制]

有没有一种简单的方法可以将 Ajax 更改为 WebSocket?

有没有一种简单的方法可以使用 Deno.serveHttp 获取 IP 客户端?

有没有一种简单的方法可以使用 OleDbConnection 删除/忽略 Excel 文件中列名上方的行?

有没有一种简单的方法可以使用 TypeScript 更改嵌套 json 数据中的一个值?

有没有一种简单的方法可以将 C# 类转换为 PHP?