2016-09-15 32 views
0

是的。我正在使用几乎没有人喜欢的图书馆(COM/Interop)。我在练习一个分析Excel工作簿的程序,确定它的列并且用户拨打每个列的类型。一切都很完美,我可以检测每个列的类型错误(例如,如果数字列中有字符串),但我遇到问题的唯一类型是日期。我昨天在这里问了一个关于日期的问题(因为我在想什么),但我从这个问题知道日期只是数字....这是没有问题的,因为我可以使用Date.fromOADate。¿如何获得细胞的确切地址? (VB.NET/INTEROP.EXCEL)

那么,我面对的情况是,如果Excel列包含日期信息,例如,您在该日期列中添加数据字符串时,在程序中加载Excel书籍时,该数据字符串未标记它作为一个错误..。但把它当作一个空单元格(让我感到惊讶的事情)。

这是我写的标记每列的

Protected Friend Function obtenerErroresColumna(ByVal column As String, ByVal page As String, ByVal tipe As String) As Integer 
    If (Not String.IsNullOrEmpty(column)) Then 
     Dim cmd As String = "Select [" & column & "] from [" & page & "$]" 
     Dim errors As Integer = 0 
     Dim table As New DataTable 
     Try 
      Dim adapter As New OleDbDataAdapter(cmd, conexion) 
      adapter.Fill(table) 
      adapter.Dispose() 
      For Each itm In table.Rows 
       If (tipe.Equals("String")) Then 
        If (Not IsDBNull(itm(0))) Then 
         If (IsNumeric(itm(0))) Then 
          errors += 1 
          setValueError = itm(0) 
         End If 
        End If 
       ElseIf (tipe.Equals("Numeric")) Then 
        If (Not IsDBNull(itm(0))) Then 
         If (Not IsNumeric(itm(0))) Then 
          errors += 1 
          setValueError = itm(0) 
         End If 
        End If 
       ElseIf (tipe.Equals("Date")) Then 
        If (Not IsDBNull(itm(0))) Then 
         If (Not IsDate(itm(0))) Then 
          errors += 1 
          setValueError = itm(0) 
         End If 
        End If 
       End If 
      Next 
      table.Dispose() 
      Return errors 
     Catch ex As Exception 
      boxMessage("Error", ex.Message, My.Resources._error).ShowDialog() 
      Return errors 
     End Try 
    Else 
     Return 0 
    End If 
End Function 

OK了错误,因为我说的是前两种类型是运行良好的功能,问题是,当我开始比较日期数据类型。如果列是日期类型,我有这个想法:如果程序返回一个空单元格(如前所述,字符串数据将我作为空单元格返回),那么程序将获取单元格的地址以进行替换。我已经编写了替代方法......只有参数必须通过今天的日期,单元格的确切地址和列名称。

我想检查该循环的当前小区的ADRESS当变量 “ITM” 为Null(A4,B3,C50 ....等)

enter image description here

回答

0

我不在你的代码中看到任何对Excel.Interop的引用。对于第26列,你可以使用Chr

Dim adr = Function(col%, row%) Chr(64 + col) & row 

Dim B3 = adr(2, 3) ' "B3" 
+0

我使用互操作检测列,页数,以及使用范围。我在这里展示的函数仅用于单元格中的比较数据...我想在变量“itm”为Null时检查循环的当前单元格。 – TwoDent

0

玉家伙,我发现这个问题的解决方案。我没有使用interop,但我得到了我想要的。

首先我需要根据列名得到字母。我在网上找到了通过作为参数传递一个号码

Private Function ColumnIndexToColumnLetter(colIndex As Integer) As String 
    Dim div As Integer = colIndex 
    Dim colLetter As String = String.Empty 
    Dim modnum As Integer = 0 

    While div > 0 
     modnum = (div - 1) Mod 26 
     colLetter = Chr(65 + modnum) & colLetter 
     div = CInt((div - modnum) \ 26) 
    End While 

    Return colLetter 
End Function 

我插入检测错误功能的计数器返回Excel中的列字母的功能,这个计数器将计算在列的单元格,同时获得列号,我创建了另一个函数,它携带了一个arrayList中的列。

我拿的indexOf功能

Protected Friend Function obtenerErroresColumna(ByVal columna As String, ByVal hoja As String, ByVal tipo As String) As Integer 
    If (Not String.IsNullOrEmpty(columna)) Then 
     Dim cmd As String = "Select [" & columna & "] from [" & hoja & "$]" 
     Dim errores As Integer = 0 
     Dim tabla As New DataTable 
     Dim cell As Integer = 2 
     Dim column As New ArrayList 
     column = cargarMatrizColumnas(hoja) 
     Try 
      Dim adapter As New OleDbDataAdapter(cmd, conexion) 
      adapter.Fill(tabla) 
      adapter.Dispose() 
      For Each itm In tabla.Rows 
       If (tipo.Equals("Cadena")) Then 
        If (Not IsDBNull(itm(0))) Then 
         If (IsNumeric(itm(0))) Then 
          errores += 1 
          setValoresError = itm(0) 
         End If 
        End If 
       ElseIf (tipo.Equals("Numerico")) Then 
        If (Not IsDBNull(itm(0))) Then 
         If (Not IsNumeric(itm(0))) Then 
          errores += 1 
          setValoresError = itm(0) 
         End If 
        End If 
       ElseIf (tipo.Equals("Fecha")) Then 
        If (Not IsDBNull(itm(0))) Then 
         If (Not IsDate(itm(0))) Then 
          errores += 1 
          setValoresError = itm(0) 
         End If 
        Else 
         MsgBox("Direccion: " & ColumnIndexToColumnLetter(column.IndexOf(columna) + 1) & cell) 
        End If 
        cell += 1 
       End If 
      Next 
      tabla.Dispose() 
      Return errores 
     Catch ex As Exception 
      cajaMensaje("Error inesperado", ex.Message, My.Resources._error).ShowDialog() 
      PantallaPrincipal.lbldireccion.ForeColor = Color.Red 
      Return errores 
     End Try 
    Else 
     Return 0 
    End If 
End Function 

enter image description here

来源的功能:https://www.add-in-express.com/creating-addins-blog/2013/11/13/convert-excel-column-number-to-name/