2011-08-24 117 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