C# OOXML SDK非法字符替换

C# OOXML SDK非法字符替换,c#,openxml,export-to-excel,openxml-sdk,C#,Openxml,Export To Excel,Openxml Sdk,我在使用MS的OpenXMLSDK2.0创建XLSX文档时遇到问题 我的问题是,我需要在excel工作表中显示一些非法字符,但如果我只是将它们添加到工作表中,文档将不会加载 我正在使用这个函数 private static string ProcessString(string str) { return System.Security.SecurityElement.Escape(str); } 这将给我汤姆'是汤姆的球而不是汤姆的球。(由于

我在使用MS的OpenXMLSDK2.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标记

哈哈,我刚刚注意到,在解析HTML转义时使用的降价使我的示例看起来很可笑

编辑2:

输入的一些示例:

  • 癌症's复杂性:我们是否在错误的层面上制定有效的干预措施

  • 凯思琳Cunnhanm基金会研究家族性乳腺癌(KDUBAB)的突变阴性女性乳腺癌发病风险的前瞻性研究:

  • 种系BRCA2突变与侵袭性前列腺癌和不良预后相关


html格式基本上是在网页上显示的。我应该去掉基本的格式标签。但更重要的是,我希望excel文件加载并转义值是一种可靠的方法。

您确定这就是导致问题的原因吗?你能给单元格添加“普通”字符串并打开它吗

请注意,撇号字符不是非法的XML字符

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

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

您确定这是导致问题的原因吗?你能给单元格添加“普通”字符串并打开它吗

请注意,撇号字符不是非法的XML字符

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

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

考虑一下,Excel文件中包含的所有内容最终都将作为XML持久化。因此,如果您希望在文件中保留任何无效的XML字符,则需要将其删除。这实际上不是一个OOXML问题,而是一个XML问题

所以如果你有输入文本,比如

Germline <em>BRCA2</em> mutations correlate with aggressive prostate cancer and adverse outcome. 种系BRCA2突变与侵袭性前列腺癌和不良预后相关。 您必须将尖括号转换为

Germline & lt;em& gt;BRCA2& lt;/em& gt; mutations correlate with aggressive prostate cancer and adverse outcome. 种系<;em>;BRCA2</em>;突变与侵袭性前列腺癌和不良预后相关。 (增加空格以说明括号)

请参阅,以了解执行此操作的一些方法


另外,要了解Microsoft Office是如何做到这一点的,请将问题文本添加到Excel文档并保存它。然后使用OpenXMLSDK工具(SDK附带)来反映文件并查看它是如何完成的。

想想,Excel文件中包含的所有内容最终都会作为XML持久化。因此,如果您希望在文件中保留任何无效的XML字符,则需要将其删除。这实际上不是一个OOXML问题,而是一个XML问题

所以如果你有输入文本,比如

Germline <em>BRCA2</em> mutations correlate with aggressive prostate cancer and adverse outcome. 种系BRCA2突变与侵袭性前列腺癌和不良预后相关。 您必须将尖括号转换为

Germline & lt;em& gt;BRCA2& lt;/em& gt; mutations correlate with aggressive prostate cancer and adverse outcome. 种系<;em>;BRCA2</em>;突变与侵袭性前列腺癌和不良预后相关。 (增加空格以说明括号)

请参阅,以了解执行此操作的一些方法


另外,要了解Microsoft Office是如何做到这一点的,请将问题文本添加到Excel文档并保存它。然后使用OpenXMLSDK工具(SDK附带)来反映文件并查看它是如何完成的。

另一件需要注意的事情。XML并没有内置对我们习惯于在HTML中使用的所有字符命名实体的支持。在XML中有少量始终可以理解的内容(即&;)。因为OOXML中没有DTD,所以不能定义更多的命名实体。相反,您必须使用字符实体在字符串中引入任何其他内容(例如, ;表示空格, ;表示空格等),或者直接在字符串中输入Unicode字符

您可以使用";for"e;和';对于撇号,如果您需要将其中一个撇号放入由相同类型的引号符号包围的属性值中

有些Unicode代码点在XML数据流中是完全禁止的。插入这些co