我遇到使用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文件是这样做的可靠方法。
答案 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只为这些代码和那些代码提供了自己的转义机制。我不认为这个问题涉及这个问题。