如何通过VBA在HTML表格行(TR)开头插入单元格(TD)元素?
现有实现
我用以下VBA代码从HTML文件提取数据,示例为列出HTML文件中的所有表格行(TR):
Dim IE As InternetExplorer Dim HTMLdoc As HTMLDocument Dim TRelements As IHTMLElementCollection Dim TRelement As HTMLTableCell Dim r As Long Set IE = New InternetExplorer With IE .Navigate filePath While .Busy Or .ReadyState <> READYSTATE_COMPLETE: DoEvents: Wend Set HTMLdoc = .Document End With Set TRelements = HTMLdoc.getElementsByTagName("TR")
通过上述代码,我可以这样定位数据(第5行第1个单元格),示例:
A = TRelements.Item(5).ChildNodes.Item(1).innerText
需求说明
我希望在HTML表格行(TR)的开头插入一个新的单元格(TD/TH)元素。
预期效果
原表格:
<div class="s-table-container"> <table class="s-table"> <thead> <tr> <th>NAME</th> <th>SURNAME</th> </tr> </thead> <tbody> <tr> <td>Walter</td> <td>White</td> </tr> </tbody> </table> </div>
添加DOB对应的单元格后:
<div class="s-table-container"> <table class="s-table"> <thead> <tr> <th>DOB</th> <th>NAME</th> <th>SURNAME</th> </tr> </thead> <tbody> <tr> <td>09-07-58</td> <td>Walter</td> <td>White</td> </tr> </tbody> </table> </div>
解决方案
要在TR开头插入新单元格,可利用HTMLDocument的createElement方法创建元素,再通过insertBefore方法将新元素插入到TR的第一个子节点前。
完整示例代码
Dim IE As InternetExplorer Dim HTMLdoc As HTMLDocument Dim TRelements As IHTMLElementCollection Dim tr As HTMLTableRow Dim newCell As IHTMLElement Dim filePath As String filePath = "你的HTML文件路径" '替换为实际文件路径 Set IE = New InternetExplorer With IE .Navigate filePath While .Busy Or .ReadyState <> READYSTATE_COMPLETE: DoEvents: Wend Set HTMLdoc = .Document End With '获取所有TR元素 Set TRelements = HTMLdoc.getElementsByTagName("TR") '处理表头行(第一个TR) Set tr = TRelements(0) Set newCell = HTMLdoc.createElement("TH") newCell.innerText = "DOB" '插入到第一个子节点前 tr.insertBefore newCell, tr.FirstChild '处理tbody里的数据行(以第二个TR为例) Set tr = TRelements(1) Set newCell = HTMLdoc.createElement("TD") newCell.innerText = "09-07-58" tr.insertBefore newCell, tr.FirstChild '批量处理所有行的写法(可选) 'For Each tr In TRelements ' If tr.ParentNode.tagName = "THEAD" Then ' Set newCell = HTMLdoc.createElement("TH") ' newCell.innerText = "DOB" ' Else ' Set newCell = HTMLdoc.createElement("TD") ' '可根据需求设置不同单元格内容 ' newCell.innerText = "对应日期" ' End If ' tr.insertBefore newCell, tr.FirstChild 'Next tr '保存修改后的HTML(可选) 'Open "修改后文件的保存路径" For Output As #1 'Print #1, HTMLdoc.documentElement.outerHTML 'Close #1 '关闭IE IE.Quit Set IE = Nothing
关键说明
createElement("TH")/createElement("TD"):根据行类型创建表头单元格或数据单元格insertBefore newCell, tr.FirstChild:将新单元格插入到当前TR的第一个子元素之前,实现开头插入的效果- 批量处理时,可通过判断TR的父节点(THEAD/TBODY)区分表头和数据行,设置对应内容
内容的提问来源于stack exchange,提问作者MK01111000
相关产品推荐
相关产品推荐

