【问题标题】:skip first row in read of Excel file在读取 Excel 文件时跳过第一行
【发布时间】:2012-03-15 02:08:30
【问题描述】:

您好,我正在尝试将 Excel 文件转换为我的 dataGridView,但由于 Excel 文件的格式设置方式存在列名问题,文档的其余部分有两个设置单元格。然而,列名实际上在第 2 行。如何跳过读取的文件中的第一行,以便 dataGridView 中的列显示第二行的单元格值?

当前代码:

  var connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0; data source={0}; Extended Properties=Excel 8.0;", openFileDialog1.FileName);

string query = String.Format("select * from [{0}$]", "Sheet1");
var adapter = new OleDbDataAdapter(query, connectionString);

DataSet ds = new DataSet();

adapter.Fill(ds);

DataTable dt = ds.Tables[0];

techGrid.DataSource = dt;

【问题讨论】:

  • 您必须以编程方式进行......这意味着......删除第一行并获取第二行并将其作为列然后删除第二行。

标签: c# excel datagridview


【解决方案1】:

正确的方法是告诉 Excel 在工作表中的确切位置可以找到列标题和数据。导入整个工作表并尝试从任意数据行重建标题是很麻烦的。 OPENQUERY 不保证行顺序。在测试中,它似乎总是按顺序导入,但是一旦您将其移至具有多卷 tempdb 或负载较重的生产系统的系统,您的导入将不再排序,您的代码将尝试将您的数据解释为列标题。

代替:

string query = String.Format("select * from [{0}$]", "Sheet1");

使用:

string query = String.Format("select * from [{0}${1}]", "Sheet1","A2:ZZ");

编辑:使用"A2:end" 而不是"A2:ZZ"。

【讨论】:

  • 此解决方案唯一可能存在的问题是将列数限制为 ZZ。可以运行一个简单的 Top 查询首先获取有限的行,然后得到正确的列估计。但除此之外,这个解决方案比大多数解决方案都要好。谢谢。
【解决方案2】:

有一种比以编程方式删除行更简单的方法,即使用连接字符串的标题行属性。这应该为您跳过第一行,然后您可以从那里对其余行执行您所做的操作。来自ConnectionStrings.com:

Provider=Microsoft.ACE.OLEDB.12.0; Data Source=myOldExcelFile.xls; 
Extended Properties="Excel 12.0;HDR=YES";

“HDR=是的;”表示第一行包含列名,而不是 数据。 “HDR=否;”表示相反。

【讨论】:

    【解决方案3】:

    就像 Thit Lwin 评论的那样。在将 dt 设置为数据源之前删除第一行。

    DataRow row = dt.Rows[0];
    dt.Rows.Remove(row);
    techGrid.DataSource = dt;
    

    【讨论】:

    • 我知道这需要以编程方式完成,但是此代码会产生相同的结果。如何在设置我的 dataGridView 数据数据源之前正确删除该行?
    • 谢谢!这正是我想要的。
    【解决方案4】:

    您可以像这样跳过任意多行

    IEnumerable<DataRow> newRows = dt.AsEnumerable().Skip(numberOfRows);
    DataTable  dt2 = newRows.CopyToDataTable();
    

    【讨论】:

      猜你喜欢
      • 2012-03-25
      • 2014-01-26
      • 2013-03-25
      • 2016-03-28
      • 1970-01-01
      • 2020-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多