Html table to array merge cell - VB

Узнай цену своей работы

Формулировка задачи:

Добрый день!
Пытаюсь таблицу из html передать в массив без использования копирования на лист Excel. Все осложняется тем, что в таблице есть объединенные ячейки по горизонтали и вертикале. И как раз с этим у меня вопрос. На выходе мне нужен массив в котором вместо объединенных ячеек были бы соответствующие данные относящиеся к объединенным ячейкам.
для понимания простенький пример на картинке.

Решение задачи: «Html table to array merge cell»

textual
Листинг программы
border=1cellspacing=0cellpadding=4width='50%'><table <span="" style="color: #ff0000;">   
<tbody><tr><td <span="" style="color: #ff0000;">rowspan=2>A</td><td <span="" style="color: #ff0000;">colspan=2>C</td><td <span="" style="color: #ff0000;">rowspan=3>E</td><td>~1
</td></tr><tr><td>B</td><td>~2</td><td <span="" style="color: #ff0000;">rowspan=2>F
</td></tr><tr><td <span="" style="color: #ff0000;">colspan=3>~3


</td></tr></tbody></table><table width="95%" border="0" bgcolor="#DDDDDD" cellspacing="0" cellpadding="4" style="border: solid 1px #888888; margin :10px"><tbody><tr height="1"><td style="font: bold 11px Arial;">+ Code</td></tr><tr style="display:none"><td style="font : xx-small Verdana,Arial; padding : 7px" bgcolor="#EFEFFF"><pre class="src lang-vbnet">Option Explicit

Sub merge_cells()
    Dim oDom As Object, oTable As Object, oRow As Object, oCell As Object
    Dim iRows As Integer, iCols As Integer
    Dim x As Integer, y As Integer
    Dim xx As Integer, yy As Integer
    Dim colspan As Integer, rowspan As Integer
    Dim real_y As Integer
    Dim txt As String
    Dim data()
Dim idx() As Byte
    
    Set oDom = GetObject("c:\temp\tablecells.htm", "htmlFile")
    DoEvents
    
    Set oTable = oDom.getElementsByTagName("table")(0)
    DoEvents
    
    'кол-во строк в таблице = кол-во "строк" в массиве
    iRows = oTable.rows.Length
    
    'кол-во "столбцов" в массиве
    For x = 0 To iRows - 1
        Set oRow = oTable.rows(x)
        real_y = 0
        For y = 0 To oRow.Cells.Length - 1
            real_y = real_y + oRow.Cells(y).colspan
        Next y
        If iCols < real_y Then iCols = real_y
    Next x
    
    ReDim data(1 To iRows, 1 To iCols)
    ReDim idx(1 To iRows, 1 To iCols)
    
    For x = 0 To iRows - 1
        Set oRow = oTable.rows(x)
        real_y = 1
        
        For y = 0 To oRow.Cells.Length - 1
            Set oCell = oRow.Cells(y)
            colspan = oCell.colspan - 1
            rowspan = oCell.rowspan - 1
            txt = oCell.innerText
            
While idx(x + 1, real_y) > 0
                real_y = real_y + 1
            Wend
            
            For xx = x + 1 To x + 1 + rowspan
                For yy = real_y To real_y + colspan
                    If Len(txt) > 0 Then
                        data(xx, yy) = txt
                    End If
idx(xx, yy) = 1
                Next yy
            Next xx
            
            real_y = real_y + colspan + 1
            
        Next y
    Next x
    
    Set oCell = Nothing
    Set oRow = Nothing
    Set oTable = Nothing
    Set oDom = Nothing
    
    '<debug></debug>
    For x = LBound(data) To UBound(data)
        Debug.Print x & ":[ ";
        For y = LBound(data, 2) To UBound(data, 2)
            Debug.Print y & ":[" & data(x, y) & "] ";
        Next y
        Debug.Print "]"
    Next x
    '
End Sub
</pre>
</td></tr></tbody></table><table width="95%" border="0" bgcolor="#DDDDDD" cellspacing="0" cellpadding="4" style="border: solid 1px #888888; margin :10px"><tbody><tr height="1"><td style="font: bold 11px Arial;">+ Immediate</td></tr><tr style="display:none"><td style="font : xx-small Verdana,Arial; padding : 7px" bgcolor="#EFEFFF"><pre class="src lang-vbnet">1:[ 1:[A] 2:[C] 3:[C] 4:[E] 5:[~1] ]
2:[ 1:[A] 2:[B] 3:[~2] 4:[E] 5:[F] ]
3:[ 1:[~3] 2:[~3] 3:[~3] 4:[E] 5:[F] ]
</pre>
</td></tr></tbody></table> 


        

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5