如何用EPPlus导出带格式的HTML表格至Excel并保留上标样式?
问题
我有一个包含<sup>标签的HTML表格,示例单元格为<td>System Architect<sup>5</sup></td>。需要将带有粗体、上标、下划线格式的HTML表格导出到Excel文件并保留样式。我已有处理程序可将表格转换为DataTable,但不清楚如何生成Excel XML的<r>标签,请问EPPlus能否实现该需求?
HTML格式示例
<table id="example" class="display" cellspacing="0" width="100%"> <thead> <tr> <th>First name</th> <th>Last name</th> <th>Position</th> <th>Office</th> <th>Salary</th> </tr> </thead> <tbody> <tr> <td>Tiger</td> <td>Nixon</td> <td>System Architect<sup>5</sup></td> <td>Edinburgh</td> <td>$320,800</td> </tr> </tbody> </table>
Excel XML目标格式示例
<r><t xml:space="preserve">System Architect</t></r> <r><rPr><vertAlign val="superscript"/></rPr><t>5</t></r>
当前使用的EPPlus代码
using (ExcelPackage pack = new ExcelPackage()) { ExcelWorksheet ws = pack.Workbook.Worksheets.Add(""); ws.Cells["A1"].LoadFromDataTable(dt, true); var ms = new System.IO.MemoryStream(); pack.SaveAs(ms); ms.WriteTo(HttpContext.Current.Response.OutputStream); }
解决方案
EPPlus完全可以实现这个需求,不需要手动生成Excel XML的<r>标签,它提供了RichText对象来处理单元格内的富文本样式(包括上标、粗体、下划线等)。具体实现步骤如下:
解析HTML单元格内容,拆分富文本片段
对每个包含HTML格式的单元格内容进行解析,拆分出不同样式的文本片段。比如示例中的System Architect<sup>5</sup>,需要拆分成普通文本System Architect和上标文本5。可以用正则表达式或HTML解析库(如HtmlAgilityPack)完成这一步。使用EPPlus的RichText API构建富文本
放弃直接用LoadFromDataTable(该方法仅支持纯文本导入),改为逐个单元格设置内容,通过ExcelRange.RichText属性添加不同样式的文本片段:示例代码:
using (ExcelPackage pack = new ExcelPackage()) { ExcelWorksheet ws = pack.Workbook.Worksheets.Add("Sheet1"); // 以示例单元格C2为例 var targetCell = ws.Cells["C2"]; // 添加普通文本片段 var normalSegment = targetCell.RichText.Add("System Architect"); // 若需设置普通文本样式,可直接修改属性 // normalSegment.Bold = false; // 添加上标文本片段 var supSegment = targetCell.RichText.Add("5"); // 设置上标样式 supSegment.VerticalAlign = ExcelVerticalAlignmentFont.Superscript; // 如需粗体或下划线,直接设置对应属性 // supSegment.Bold = true; // supSegment.UnderLine = true; // 其他单元格按相同逻辑处理... var ms = new System.IO.MemoryStream(); pack.SaveAs(ms); ms.WriteTo(HttpContext.Current.Response.OutputStream); }批量处理DataTable中的富文本单元格
若DataTable中存储了带HTML标签的内容,可遍历每个单元格,解析HTML后用RichText设置样式。以下是基于HtmlAgilityPack的解析示例:// 需先引用HtmlAgilityPack库 var htmlDoc = new HtmlAgilityPack.HtmlDocument(); htmlDoc.LoadHtml(cellHtmlContent); // cellHtmlContent为DataTable单元格中的HTML内容 foreach (var node in htmlDoc.DocumentNode.ChildNodes) { string text = node.InnerText; switch(node.Name) { case "sup": var supRt = targetCell.RichText.Add(text); supRt.VerticalAlign = ExcelVerticalAlignmentFont.Superscript; break; case "b": case "strong": var boldRt = targetCell.RichText.Add(text); boldRt.Bold = true; break; case "u": var underlineRt = targetCell.RichText.Add(text); underlineRt.UnderLine = true; break; default: targetCell.RichText.Add(text); break; } }
关键说明
- EPPlus的
RichText集合会自动映射到Excel XML中的<r>标签,每个ExcelRichText对象对应一个<r>节点,样式设置会自动生成<rPr>中的属性。 - 不要使用
LoadFromDataTable导入富文本内容,该方法会过滤所有HTML格式,仅保留纯文本。
内容的提问来源于stack exchange,提问作者Jefferson
相关产品推荐
相关产品推荐

