
本文介绍如何在 vb.net 中正确读取 html 表格(通过 webbrowser 控件)中 `
在将 HTML 表格导出至 Excel 时,仅复制文本内容远远不够——保留原始样式(尤其是单元格背景色)对数据可读性和业务语义至关重要。但 HtmlElement.Style 并不支持通过索引器(如 Style("backcolor"))直接获取单个 CSS 属性,该写法会引发运行时异常:“无法将颜色值转换为整数”。根本原因在于:HtmlElement.Style 返回的是一个只读的完整内联样式字符串(如 "BACKGROUND-COLOR: #b0c4de; BORDER-TOP: #aaaaaa 1px solid;"),而非键值对集合。
✅ 正确做法是:先获取完整的 Style 字符串,再手动解析其中的 BACKGROUND-COLOR 值。以下为完整、健壮的实现方案:
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 = cols(j).InnerText
worksheet.Cells(i + 1, j + 1).Value = cellText
' ✅ 安全提取 BACKGROUND-COLOR 并应用到 Excel 单元格
Dim styleStr As String = cols(j).Style
If Not String.IsNullOrEmpty(styleStr) Then
Dim bgColorHex As String = ExtractCssColor(styleStr, "BACKGROUND-COLOR")
If Not String.IsNullOrEmpty(bgColorHex) Then
Try
Dim clr As Color = ColorTranslator.FromHtml(bgColorHex.Trim())
Dim excelCell As Excel.Range = worksheet.Cells(i + 1, j + 1)
excelCell.Interior.Color = clr.ToArgb() ' 注意:Excel 使用 ARGB 整数(非 Color 对象)
Catch ex As Exception
' 忽略无效颜色值(如 transparent、inherit 或格式错误)
Debug.WriteLine($"Invalid background color in cell ({i+1},{j+1}): {bgColorHex}")
End Try
End If
End If
Next
Next配套的辅助函数(推荐封装复用):
Private Function ExtractCssColor(styleString As String, cssProperty As String) As String
' 不区分大小写匹配,支持 BACKGROUND-COLOR 或 background-color
Dim pattern As String = $"\b{Regex.Escape(cssProperty)}\s*:\s*([^;]+)"
Dim match As Match = Regex.Match(styleString, pattern, RegexOptions.IgnoreCase)
Return If(match.Success, match.Groups(1).Value.Trim(), Nothing)
End Function⚠️ 关键注意事项:
立即学习“前端免费学习笔记(深入)”;
- ColorTranslator.FromHtml() 仅支持标准十六进制(#rrggbb 或 #rgb)、命名颜色(如 "red"、"lightblue"),不支持 rgba()、hsl()、transparent 或 CSS 变量;
- Excel 的 Interior.Color 属性需传入 32 位 ARGB 整数(Color.ToArgb()),而非 Color 对象本身;
- 建议添加异常捕获与日志输出,避免单个坏颜色导致整个导出失败;
- 若 HTML 使用外部 CSS 或 class/id 样式,HtmlElement.Style 将无法获取计算后样式 —— 此时需改用 IHTMLCurrentStyle(需 COM 互操作)或服务端预渲染。
通过上述方法,你即可精准还原 HTML 表格的视觉层次,在 Excel 中实现所见即所得的样式迁移。











