You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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对象来处理单元格内的富文本样式(包括上标、粗体、下划线等)。具体实现步骤如下:

  1. 解析HTML单元格内容,拆分富文本片段
    对每个包含HTML格式的单元格内容进行解析,拆分出不同样式的文本片段。比如示例中的System Architect<sup>5</sup>,需要拆分成普通文本System Architect和上标文本5。可以用正则表达式或HTML解析库(如HtmlAgilityPack)完成这一步。

  2. 使用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);
    }
    
  3. 批量处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 06:12:05