我在使用C#创建OpenXML文档时,遇到了和Excel相同的问题。
当构建一个包含错误ASCII字符的文档时,我的Excel导出功能就会崩溃。
一些公司数据库中的字符串数据含有奇怪的字符。
虽然我使用了Microsoft的DocumentFormat.OpenXML程序集从他们的OpenXML SDK 2.0中分配字符串值,但它仍未解决这个问题。
解决方法:
t.Text = Regex.Replace(sValue, @"[\x00-\x08]|[\x0B\x0C]|[\x0E-\x19]|[\uD800-\uDFFF]|[\uFFFE\uFFFF]", "?")
该方法通过删除有问题的字符并用问号替换它们来清理sValue字符串。您可以用任何字符串替换或仅使用空字符串。
XML规范允许0x09(TAB)、0x0A(LF-换行符或NL-新行)和0x0D(CR-回车)。上面的正则表达式确保不会删除这些字符。
XML 1.1规范允许您对其中一些字符进行转义。
例如:使用代替0x03,在HTML中显示为,在Office文档和记事本中显示为L。
我使用Asp.net,这在我的GridView中自动处理,因此我不需要替换这些值-但我认为可能是浏览器为所有我所知道的内容负责。
我考虑在OpenXML中转义这些值,但是当我查看输出时,它显示了转义标记。因此,MikeTeeVee仍然显示为MikeTeeVee在Excel中,而不是像MikeTeeVee或MikeLTeeVee之类的东西。这就是为什么我更喜欢Mike?TeeVee的方法。
我猜想这是当前OpenXML中的一个错误,它对允许的XML ASCII字符进行编码,但允许不受支持的ASCII字符通过。
更新:
我忘了我可以使用“Open XML SDK 2.0 Productivity Tool”查找这些字符如何在文档中显示,例如Excel。
在那里,我发现它使用格式:_x0000_
请记住:XML 1.0不支持转义这些值,但XML 1.1支持,因此如果您使用1.1,则可以使用此代码进行转义。
常规XML 1.1转义:
t.Text = Regex.Replace(s, @"[\x00-\x08]|[\x0B\x0C]|[\x0E-\x19]|[\uD800-\uDFFF]|[\uFFFE\uFFFF]",
delegate(Match m)
{
return (byte)(m.Value[0]) == 0
? ""
: ("&#x" + string.Format("{0:00}", (byte)(m.Value[0])) + ";");
});
如果您正在为OpenXML转义字符串,请使用以下方法:
t.Text = Regex.Replace(s, @"[\x00-\x08]|[\x0B\x0C]|[\x0E-\x19]|[\uD800-\uDFFF]|[\uFFFE\uFFFF]",
delegate(Match m)
{
return (byte)(m.Value[0]) == 0
? ""
: ("_x" + string.Format("{0:0000}", (byte)(m.Value[0])) + "_");
});