如何在 VB.NET 中读取 HTML 表格单元格的背景色并同步到 Excel

10次阅读

如何在 VB.NET 中读取 HTML 表格单元格的背景色并同步到 Excel

本文详解如何从 webbrowser 控件中的 html 表格提取单元格背景色(background-color),并通过 colortranslator 正确转换为 excel 单元格填充色,避免因样式字符串解析错误导致的运行时异常。

在使用 WebBrowser.Document 解析 html 表格并导出至 excel 时,HtmlElement.Style 属性返回的是完整 css 样式字符串(如 “BACKGROUND-COLOR: #b0c4de; border-TOP: #aaaaaa 1px solid;”),不能直接用 cols(j).Style(“backcolor”) 访问——该语法非法,VB.net 不支持通过索引器读取样式属性,故会抛出“无法将颜色值转换为整数”的异常。

正确做法是:先获取完整的 Style 字符串,再手动解析 BACKGROUND-COLOR 值。注意以下关键点:

  • Style 属性返回的 CSS 属性名统一为大写、带连字符(如 BACKGROUND-COLOR),且值前可能含空格;
  • 需对 : 和分号 ; 做健壮分割,并 Trim 空格;
  • ColorTranslator.FromHtml() 仅接受标准十六进制格式(如 #b0c4de 或 #B0C4DE),不支持 rgb(176, 196, 222) 或命名色(如 lightsteelblue)——若需兼容,应额外添加 RGB 解析逻辑。

以下是整合进原导出逻辑的完整示例代码(含错误防护):

For i As Integer = 0 To rows.Count - 1     Dim cols As HtmlElementCollection = rows(i).GetElementsByTagName("td")     For j As Integer = 0 To cols.Count - 1         Dim cellText As String = If(cols(j).InnerText, "")         Dim excelCell As Excel.Range = worksheet.Cells(i + 1, j + 1)         excelCell.Value = cellText          ' ✅ 安全读取背景色并应用到 Excel 单元格         If Not String.IsNullOrEmpty(cols(j).Style) Then             Dim styleParts() As String = cols(j).Style.Split(";"c)             For Each part As String In styleParts                 Dim trimmedPart As String = part.Trim()                 If trimmedPart.StartsWith("BACKGROUND-COLOR:", StringComparison.OrdinalIgnoreCase) Then                     Dim colorValue As String = trimmedPart.Substring("BACKGROUND-COLOR:".Length).Trim()                     ' 移除末尾可能的分号(虽已分割,但防冗余)                     colorValue = colorValue.Trim(";"c, " "c)                     try                         Dim c As Color = ColorTranslator.FromHtml(colorValue)                         excelCell.Interior.Color = c.ToArgb() ' 注意:Excel 使用 ARGB 整数(而非 Color 对象catch ex As ArgumentException                         ' 忽略无效颜色值(如 transparent、inherit 或 rgb())                         Continue For                     End Try                     Exit For ' 找到即退出,避免重复处理                 End If             Next         End If     Next Next

? 重要注意事项

立即学习前端免费学习笔记(深入)”;

  • Excel 的 Interior.Color 属性接收 32 位 ARGB 整数(Color.ToArgb()),而非 System.Drawing.Color 对象,务必调用 .ToArgb();
  • 若 HTML 中使用 transparent、initial 或 rgb(r,g,b) 等非十六进制格式,FromHtml() 会抛异常,建议用 Try…Catch 包裹并跳过;
  • WebBrowser 渲染引擎(Trident/IE)可能将内联样式与 CSS 类合并后输出 Style,但 Style 属性仅返回内联样式(style=”…”),不包含外部或
  • 导出后建议调用 excelapp.Visible = True 方便调试,正式部署时设为 False 并记得 workbook.Close(SaveChanges:=True) 和 excelApp.Quit() 释放资源。

通过上述方法,即可精准还原 HTML 表格的视觉样式至 Excel,提升数据导出的专业性与一致性。

text=ZqhQzanResources