2012-03-15 269 views
2

您好我正在嘗試將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

回答

2

就像Thit倫曾這樣評價。在將dt設置爲數據源之前刪除第一行。

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

我明白這需要編程完成,但是這段代碼會得到相同的結果。如何在設置我的dataGridView數據dataSource之前正確刪除該行? – ikathegreat 2012-03-15 02:51:20

5

有一種比編程式刪除行更簡單的方法,使用連接字符串的標題行屬性。這應該跳過你的第一行,然後你可以從那裏做其他行。從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

8

正確的方法是告訴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

0

您可以跳過你想這樣

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