2016-09-15 4 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, как я сказал, что первые два типа работает хорошо, проблема, когда я начинаю сравнивать тип данных даты. У меня есть эта идея, если столбец является типом даты: если программа возвращает пустую ячейку (как я уже говорил ранее, строковые данные возвращают меня как пустые ячейки), то программа получает адрес ячейки для замены. Я уже написал метод подстановки ... только по мере того, как параметры должны были бы пройти, это сегодняшняя дата, точный адрес ячейки и имя столбца.

Я хотел бы проверить адрес текущей ячейки цикла, когда переменная "ITM" является Null (A4, B3, С50 .... Etc)

enter image description here

ответ

0

Я не» t см. любую ссылку на Excel.Interop в вашем коде. В течение первых 26 столбцов можно использовать Chr:

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

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

я использую Interop, чтобы определить количество столбцов, страниц, и используемый диапазон. Функция, которую я показываю здесь, предназначена только для сравнения данных в ячейках ... Я хотел бы проверить текущую ячейку цикла, когда переменная «itm» имеет значение Null. – TwoDent

0

Одобренные ванты, я нашел решение этой проблемы. Я не использовал interop, но я получаю то, что хотел.

Сначала мне нужно было получить письмо в соответствии с названием колонки. Я нашел в Интернете функция, которая возвращает буквы столбцов Excel, передав в качестве параметра один номер

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 

вставить счетчик в функцию, которая обнаруживает ошибки, этот счетчик будет считать ячейки в столбце, а получить номер столбца, я создаю другую функцию, которая переносила столбцы в 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/

Смежные вопросы