
本文详解如何从 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,提升数据导出的专业性与一致性。