Html table to array merge cell - VB
Формулировка задачи:
Добрый день!
Пытаюсь таблицу из html передать в массив без использования копирования на лист Excel. Все осложняется тем, что в таблице есть объединенные ячейки по горизонтали и вертикале. И как раз с этим у меня вопрос. На выходе мне нужен массив в котором вместо объединенных ячеек были бы соответствующие данные относящиеся к объединенным ячейкам.
для понимания простенький пример на картинке.
Пытаюсь таблицу из 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>