OOXML SDK非法字符替换

时间:2011-05-03 20:29:59

标签: c# openxml export-to-excel openxml-sdk

我遇到使用MS的Open XML SDK 2.0创建XLSX文档的问题。

我的问题是我需要在Excel工作表中显示一些非法字符,但如果我只是将它们添加到工作表中,则不会加载文档。

我正在使用此功能

    private static string ProcessString(string str)
    {
        return System.Security.SecurityElement.Escape(str);
    }

这将给我汤姆的球而不是汤姆的球。 (好吧,我还没弄明白如何获得后者,因为生成的excel不会打开。)

有人知道如何在Excel表格中使用OOXML显示非法的XML字符吗?

编辑:
在我用来创建文本单元格的函数中是:

private static Cell CreateTextCell(string header, UInt32 index, string text)
{
    var c = new Cell { DataType = CellValues.String, CellReference = header + index };
    var cellValue = new CellValue(text);
    c.Append(cellValue);
    return c;
}

我知道这与非法字符有关,因为当我在文本中没有包含特定字段时,它会起作用,然后当我包含它时,Excel会给我一个解析器错误和一个空白文档。

我处理的文本也恰好有HTML标签。

PS。大声笑,我只是注意到使用的markdown解析了我的HTML转义,使我的例子看起来很荒谬。

编辑2:

输入的一些例子:

  • 癌症的复杂性:我们是否正在考虑错误的水平以制定有效的干预措施?

  • 来自BRCA1 / i的突变阴性女性的乳腺癌风险的前瞻性研究。或者< i> BRCA2< / i> Kathleen Cuningham基金会研究家族性乳腺癌(kConFab)的突变阳性家庭。

  • Germline< em> BRCA2< / em>突变与侵袭性前列腺癌和不良后果相关。

html格式基本上是显示在网页上。我应该删除基本的格式化标签。但更重要的是,我希望加载和转义值的excel文件是这样做的可靠方法。

3 个答案:

答案 0 :(得分:2)

考虑一下所包含的一切Excel文件最终以XML格式保存。因此,如果您希望在文件中保留任何无效的XML字符,则需要将其展开。它实际上不是OOXML问题 - 它是一个XML问题。

因此,如果你有像

这样的输入文字
 Germline <em>BRCA2</em> mutations correlate with aggressive prostate cancer and adverse outcome.

您必须将尖括号转换为

 Germline & lt;em& gt;BRCA2& lt;/em& gt; mutations correlate with aggressive prostate cancer and adverse outcome.

(添加空格以说明括号)

有关实现此目的的几种方法,请参阅String escape into XML

另外,要了解Microsoft Office如何执行此操作,请将故障文本添加到Excel文档并保存。然后使用OpenXml SDK工具(随SDK提供)反映文件并查看其完成方式。

答案 1 :(得分:1)

您确定这是导致问题的原因吗?你可以在单元格中添加“普通”字符串并将其打开吗?

AFAIK撇号字符不是非法的XML字符。

如果您查看第22.9.2.19节ST_Xstring(Escaped String)中的OOXML规范(单元格中字符串的数据类型),您将看到以下说明:

* 22.9.2.19 ST_Xstring(Escaped String) 支持转义的无效XML字符的字符串。 对于无法用XML 1.0规范定义的XML表示的所有字符,使用Unicode数字字符表示转义字符格式 xHHHH 转义字符,其中H表示字符值中的十六进制字符。 [示例:XML 1.0文档中不允许使用Unicode字符8,因此必须将其转义为 x0008 。结束例子* *

答案 2 :(得分:1)

另外要注意的事情。 XML没有内置支持我们习惯在HTML中使用的所有字符命名实体。 XML中有少量总是被理解的(即&amp; lt;&amp; amp; amp; amp; amp;)。由于OOXML中没有DTD,因此无法定义更多命名实体。相反,您必须使用字符实体将其他任何内容引入字符串(例如,&amp;#x20;用于空格,&amp;#160;用于&amp; nbsp;等),或者直接在字符串中输入Unicode字符。

您可以使用&amp;#034; for&amp; quote;和&amp;#039;对于撇号,如果你需要将其中一个置于由相同类型的引号符号包围的属性值中。

有些Unicode代码点在XML数据流中被禁止使用。要将这些代码插入到字符串的值中,OOXML只为这些代码和那些代码提供了自己的转义机制。我不认为这个问题涉及这个问题。