【问题标题】:How to put RTF/HTML into Excel cell using OpenXML in C#如何在 C# 中使用 OpenXML 将 RTF/HTML 放入 Excel 单元格
【发布时间】:2020-01-20 23:40:39
【问题描述】:

我需要从富文本编辑器中获取 HTML 并将其放入 Excel 工作表中。要求是呈现 html 并且看起来与它在富文本编辑器中所做的相同。

我们使用 OpenXML 来满足我们的 Excel 需求,但我似乎找不到将 HTML 放入单元格的方法。我可以设置值,但只显示字符串。

例如,我需要这个 HTML 在单元格中呈现:

<p style="text-align: center"><strong>This is a test!</strong></p><p><s>a</s></p><p><br></p><p><u style="color: rgb(32, 43, 250)">test</u></p><ul><li>test<ul><li><span style="background-color: rgb(156, 224, 29)">test</span></li></ul></li></ul><p><br></p><p><em style="font-size: 24pt; font-family: &quot;Lucida Console&quot;">d</em></p>

有没有办法做到这一点,或者我正在寻找一些无法完成的事情?

【问题讨论】:

  • 如果您能说服 Excel 以某种方式将 HTML 呈现到单元格中,我会感到非常惊讶。在 UI 中,您可以创建一个字符串(可能包含行尾),并且可能包含多种字符格式(例如,一些单词加粗,其他颜色不同,其他文字较大)。这就是您可以从 Excel 用户界面执行的全部操作。如果你这样做,并使用OpenXML Productivity Tool(你应该下载)打开工作表,你会看到像这样的单元格将其内容保存为由 Word 样式的“运行”组成的共享字符串,每个都有不同的格式。
  • Open XML SDK 的 Excel 部分没有与 WordProcessing altChunk 等效的功能 - IOW 没有将 HTML(或其他内容)转换为 Excel Open XML 的内置方法。您需要编写自己的转换。

标签: c# excel openxml


【解决方案1】:

正如 cmets 中已经提到的,您必须编写自己的转换来将 HTML 标记转换为 SpreadsheetML 标记。比如我们看下面这段文字。

这是粗体斜体文本。

上述示例文本的 HTML 表示非常简单:

<p>This is <strong>bold</strong> and <em>italic</em> text.</p>

您需要将上述 HTML 标记转换为以下 SpreadsheetML 标记(准确地说是一个 si 元素):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="1" uniqueCount="1">
  <si>
    <r>
      <t xml:space="preserve">This is </t>
    </r>
    <r>
      <rPr>
        <b/>
        <sz val="11"/>
        <color theme="1"/>
        <rFont val="Calibri"/>
        <family val="2"/>
        <scheme val="minor"/>
      </rPr>
      <t>bold</t>
    </r>
    <r>
      <rPr>
        <sz val="11"/>
        <color theme="1"/>
        <rFont val="Calibri"/>
        <family val="2"/>
        <scheme val="minor"/>
      </rPr>
      <t xml:space="preserve"> and </t>
    </r>
    <r>
      <rPr>
        <i/>
        <sz val="11"/>
        <color theme="1"/>
        <rFont val="Calibri"/>
        <family val="2"/>
        <scheme val="minor"/>
      </rPr>
      <t>italic</t>
    </r>
    <r>
      <rPr>
        <sz val="11"/>
        <color theme="1"/>
        <rFont val="Calibri"/>
        <family val="2"/>
        <scheme val="minor"/>
      </rPr>
      <t xml:space="preserve"> text.</t>
    </r>
  </si>
</sst>

为此,您确实需要了解 SpreadsheetML 标记,特别是 Shared String Tablesst 元素),您可以在其中呈现转换后的标记(作为一个或多个 si 元素)。

转换最好作为纯函数转换来实现。查看XmlTransformationTests 类,了解一个类似的示例。它将类似 HTML 的 XML 转换为 WordprocessingML。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 2015-07-02
    相关资源
    最近更新 更多