您好我正在尝试将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;
答案 0 :(得分:11)
正确的方法是告诉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"
。
答案 1 :(得分:7)
有一种比以编程方式删除行更简单的方法,使用连接字符串的标题行属性。这应该跳过你的第一行,然后你可以用那里的其余行做你做的事情。来自ConnectionStrings.com:
Provider=Microsoft.ACE.OLEDB.12.0; Data Source=myOldExcelFile.xls;
Extended Properties="Excel 12.0;HDR=YES";
“HDR =是;”表示第一行包含列名,而不是 数据。 “HDR =无;”表明相反。
答案 2 :(得分:4)
就像Thit Lwin评论的那样。在将dt设置为datasource之前删除第一行。
DataRow row = dt.Rows[0];
dt.Rows.Remove(row);
techGrid.DataSource = dt;
答案 3 :(得分:3)
您可以跳过所需的行数
IEnumerable<DataRow> newRows = dt.AsEnumerable().Skip(numberOfRows);
DataTable dt2 = newRows.CopyToDataTable();