2012-04-04 70 views
4

使用.Net的OleDb我嘗試導入第一行可以爲空的Excel表。我想保留DataTable中的空行,以便將單元格稍後映射到Excel樣式的單元名稱「A1,A2,...」。但是不管我做什麼,第一行都被刪除了。爲什麼在使用OleDb的Excel導入中忽略第一個空行

Excel文件看起來像:

- - - 
ABC XY ZZ 
1 2 3 
4 4 5 

其中 「 - 」 是一個空單元格。 (我有沒有影響到進口的格式。)

簡化代碼:

 string cnnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"file.xls\";Extended Properties=\"Excel 8.0;HDR=No;IMEX=1\""; 
     string mySheet = "Sheet1$"; 

     OleDbConnection connection = new OleDbConnection(cnnStr); 
     DataSet Contents = new DataSet(); 
     using (OleDbDataAdapter adapter = new OleDbDataAdapter("select * from [" + mySheet + "]", connection)) 
     { 
      adapter.Fill(Contents); 
     } 

     Console.WriteLine(Contents.Tables[0].Rows.Count); // prints: 3 
     Console.WriteLine(Contents.Tables[0].Rows[0].ItemArray[0]); // prints: ABC 

任何想法如何保留該空行?

ps:我發現How to count empty rows when reading from Excel,但無法重現它。

+1

如果第二行是您的實際標題行,您爲什麼需要保留空行?否則,如果您需要保留一致的功能,您是否可以不將簡單的空行插入到您的轉換中? – 2012-04-04 12:01:47

+0

正如我所說的,我想將單元格映射到Excel樣式單元格名稱(A1,B2等)。更具體地說:如果Excel包含一個不需要的值或未知的標題名稱,我希望是abte告訴用戶「單元格A2中的值不正確。」目前這個工作如果沒有空行存在。空行時,編號被移位。 – Hannobo 2012-04-04 13:25:41

+0

我現在有同樣的問題。你有沒有設法解決這個問題? – 2015-05-19 11:43:15

回答

0

OleDbDataAdapter將第一行視爲標頭。 爲了得到第一行,從數據表的頭部創建一個數據行。 並插入第一個位置。

DataTable dt = Contents.Tables[0]; 

    DataRow dr = new DataRow(); 
    int i = 0; 
    foreach (DataColumn column in dt.Columns) 
    { 
    dr[i] = column.ColumnName.ToString(); 
    i++; 
    } 
    dt.Rows.InsertAt(dr, 0); 
+0

我相信這是不正確的。當第一行包含任何單元格中的任何值時,它將作爲DataTable的一部分返回,例如,行數爲4.此外,ColumnName包含F1,F2,F3,... - 請注意,connStr包含HDR = No,但將其設置爲yes具有相同的效果:第一行將被忽略。 – Hannobo 2012-04-06 11:23:38

2

該問題似乎與OLEDB提供程序的TypeGuessRows功能有關。簡而言之,Excel列中的數據可以是任何類型的。 OLEDB提供程序通過掃描工作表的前8行來猜測數據類型,以確定多數類型 - 樣本中值數最多的數據類型。任何不屬於多數類型的東西都會被丟棄。

See this blog post for a more detailed explanation.

除了這個MS KB Article,討論的行爲。

(跳過了變通辦法部分爲TypeGuessRows行爲)

作爲一個測試,我創建了類似於你貼,但格式化所有列的文本和保存文件的樣本文件。運行你發佈的代碼,我能看到4行返回,第一行是一個空字符串。

您可能還想嘗試修改註冊表以查看是否將TypeGuessRows設置更改爲0(掃描文件中的所有數據以確定每列的數據類型)有助於返回第一個空行。我的直覺是,這不會幫助。

+0

我意識到這一點,但它似乎沒有關係:我沒有處理8 +行,效果只與文本/數字相同,並且註冊表值不會更改任何內容(測試)。 「將所有列格式化爲文本」使得包含第一行,因爲任何**格式更改爲第一行單元格之一被認爲是「內容」(在富文本中)。更改第一行中一個單元格的背景色具有相同的效果。只有一個完全未觸摸的未格式化的空第一行(在第二行剛剛開始時就是這種情況)似乎被適配器視爲不需要。 :( – Hannobo 2012-07-23 08:20:38

相關問題