在读取Excel文件时跳过第一行
您好,我想翻译一个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;
就像Thwin Lwin所评论的那样。 在将dt设置为数据源之前删除第一行。
DataRow row = dt.Rows[0]; dt.Rows.Remove(row); techGrid.DataSource = dt;
正确的方法是告诉Excel究竟在工作表中的哪里find你的列标题和数据。 导入整个工作表并尝试从任意数据行重新构build您的头文件是非常麻烦的。 OPENQUERY不保证行顺序。 在testing中,它总是按顺序导入,但只要将其移动到具有多卷tempdb或负载较重的生产系统的系统中,就不会再导入您的导入,您的代码将尝试解释您的数据作为列标题。
代替:
string query = String.Format("select * from [{0}$]", "Sheet1");
使用:
string query = String.Format("select * from [{0}${1}]", "Sheet1","A2:ZZ");
有一个比编程式删除行更简单的方法,使用连接string的标题行属性。 这应该跳过你的第一行,然后你可以做从你那里做的其他行。 从ConnectionStrings.com :
Provider=Microsoft.ACE.OLEDB.12.0; Data Source=myOldExcelFile.xls; Extended Properties="Excel 12.0;HDR=YES";
“HDR =是;” 表示第一行包含列名,而不是数据。 “HDR =无;” 表明相反。
你可以像这样跳过任意数量的行
IEnumerable<DataRow> newRows = dt.AsEnumerable().Skip(numberOfRows); DataTable dt2 = newRows.CopyToDataTable();