2011-08-24 115 views
1

有一個程序使用OLEDB讀取Excel文件並將其轉換爲製表符分隔的文本文件。該循環處理轉換。VB.NET - 爲什麼我的Excel讀取跳過第一行?

While reader.Read 
      Dim count As Integer = 0 
      Try 
       While (True) 
        temp = reader(count).ToString + ControlChars.Tab 
        output_file.Write(temp) 
        count += 1 
       End While 
      Catch ex As Exception 
       output_file.WriteLine() 
      End Try 


     End While 

不是最優雅的代碼是肯定的,但它在每個單元逐個讀取,然後在該行的末尾拋出一個異常寫一個換行符。唯一的問題是它跳過Excel文檔的第一行。任何想法爲什麼?

+0

Excel文件的第一行是標題行嗎? – Tim

+0

@Tim它確實有頭信息,是的,但有沒有一個特定的設置來指定一行作爲Excel中的頭?我並沒有真正使用excel(我甚至沒有自己的,我現在使用的是Open Office查看器) – cost

+0

我不知道如何設置指定行作爲標題,但如果第一個行是簡單的標題行,我不會擔心它,除非你想複製你的製表符分隔的文件。讓我稍微查看一下,看看我能找到什麼,如果有的話。 – Tim

回答

6

對於一個更優雅的解決方案,試試這個:

While reader.Read() 

    For i As Integer = 0 To reader.FieldCount - 1 
     output_file.Write(reader(i).ToString() + ControlChars.Tab) 
    Next 

    output_file.WriteLine() 
End While 

閱讀來自讀者的每一行,並處理該行中的字段在for循環中,使用該行中的字段數(.FieldCount )。

每個FOR循環完成後,結束文件中的行。

重複閱讀器中的每一行。

這是很好的做法,使用異常處理代碼中的事件,可以以其他方式處理(例如,拋出一個處理一個FileNotFoundException異常 - 或拋出一個 - 而不是簡單地做一個File.Exits檢查)。\

UPDATE 確實有點谷歌上搜索,它似乎可以包括/通過連接字符串排除標題:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1";

注日e HDR =是的一部分。根據Connection strings for Excel這是用來表示是否第一行是標題。

您可能嘗試的另一件事是,使用reader.GetName(int index)(其中index是列(字段)的從零開始的序號)來查看讀者的字段是否在其Name屬性中具有值。

+0

是的,這是更好。我只用while循環,因爲我不知道如何輕鬆獲取字段數。儘管我會做出這樣的改變,謝謝 – cost

+0

我停止使用異常來處理類似的事情,但這是我編程初期遺留下來的一個實用工具,所以不良實踐依然存在。 – cost

+0

添加HDR =沒有修復它,謝謝 – cost