在读取Excel文件时跳过第一行

问题描述:

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

当前代码:

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; 
+0

你必须做程式设计这意味着尽可能多的行..删除第一行,并获得第二行,并将其作为列,然后删除第二行。 – 2012-03-15 02:17:36

就像Thit伦曾这样评价。在将dt设置为数据源之前删除第一行。

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

我明白这需要编程完成,但是这段代码会得到相同的结果。如何在设置我的dataGridView数据dataSource之前正确删除该行? – ikathegreat 2012-03-15 02:51:20

有一种比编程式删除行更简单的方法,使用连接字符串的标题行属性。这应该跳过你的第一行,然后你可以从那里做其他行。从ConnectionStrings.com

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

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

+0

这正是我所寻找的,谢谢 – Esen 2016-02-16 13:57:32

正确的方法是告诉Excel究竟在工作表中的哪个位置查找列标题和数据。导入整个工作表并尝试从任意数据行重新构建您的头文件会造成严重的麻烦。 OPENQUERY不保证行顺序。在测试中,它总是按顺序导入,但只要将它移动到具有多卷tempdb或负载较重的生产系统的系统中,您的导入将不再进行排序,您的代码将尝试将数据解释为列标题。

代替:

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

使用:

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

这个解决方案的唯一可能的问题是它限制了ZZ的列数。可以运行一个简单的Top查询来首先获取有限的行,然后获得正确的列估计。但是否则这个解决方案比大多数都好。谢谢。 – 2013-08-30 09:29:09

您可以跳过你想这样

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