如何在OLEDB / JET DataTable中手动定义列类型?

时间:2013-01-14 19:10:59

标签: vb.net oledb jet

我将数据从Excel电子表格导入VB.NET DataTable。这个Excel电子表格在前18行中有很多垃圾数据,包括很多空单元格。我最终在后期处理中删除了这些行,但是我需要按原样访问Excel文件,而不需要手动修改它。

我意识到设置IMEX=1会指示Jet引擎假设所有列都是文本。但是,我有一个问题,将其设置为另一个值(下面将详细说明)。因此,默认的Jet引擎列类型扫描不会特别好。

我想要:

  1. 导入前手动定义列类型
  2. 强制Excel扫描更多行(我相信默认值为8)以确定列类型
  3. 但是,我确实遇到了#2的问题。我没有管理权限来打开regedit.exe,因此我无法使用该方法修改注册表。我之前通过某种方式导入密钥确实绕过了这个,但我不记得我是怎么做到的。所以#1将是一个理想的解决方案,除非有人可以帮助我实现#2的想法。

    这可能吗?目前,我使用以下方法:

    If _
        SetDBConnect( _
        "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & filepath & _
        ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1""", True) Then
    
        dtSchema = _dh.GetOleDbSchemaTable()
    
        If _dh.Errors <> "" Then
           Throw New Exception("::LoadFileToBuffer.GetOleDbSchemaTable::" & _dh.Errors())
        End If
    
        For Each sheetRow In dtSchema.Rows
           If sheetRow("TABLE_NAME").ToString() = "TOTAL_DOLLARS$" Then
              totalDollars = sheetRow("TABLE_NAME").ToString()
            ElseIf sheetRow("TABLE_NAME").ToString() = "TOTAL_UNITS$" Then
              totalUnits = sheetRow("TABLE_NAME").ToString()
           End If
        Next
    
        'Get total dollars table
         sql.Append("SELECT * FROM [" & totalDollars & "]")
         dtDollars = _dh.GetTable(sql.ToString())
    End If
    

    谢谢!

1 个答案:

答案 0 :(得分:1)

你应该可以说:

 sql.Append("SELECT * FROM [" & totalDollars & "$A18:X95]")

其中totalDollars是工作表名称,x95是最后一个有效行。除非在第18行提供,否则您将无法包含标题。