如何在 VB.NET 中从 HTML 表格单元格提取并应用背景色到 Excel

本文介绍如何在 vb.net 中正确读取 html 表格(通过 webbrowser 控件)中 `

` 元素的 `background-color` 样式,并将其准确转换为 excel 单元格的填充色,解决因直接访问 `style(backcolor)` 导致的类型转换异常问题。

在将 HTML 表格导出至 Excel 时,仅复制文本内容远远不够——保留原始样式(尤其是单元格背景色)对数据可读性和业务语义至关重要。但 HtmlElement.Style 并不支持通过索引器(如 Style("backco

lor"))直接获取单个 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 中实现所见即所得的样式迁移。