我在使用C#中的OpenXML文檔創建的Excel中遇到了同樣的問題。
構建具有錯誤的ASCII字符的文檔時,我的Excel導出功能會爆炸。
不知何故,在我公司的數據庫中,字符串數據中有時髦的字符。
儘管我從OpenXML SDK 2中使用了Microsoft DocumentFormat.OpenXML程序集。0,當使用它們的對象分配字符串值時,它仍然沒有考慮到這一點。
解決方法:
t.Text = Regex.Replace(sValue, @"[\x00-\x08]|[\x0B\x0C]|[\x0E-\x19]|[\uD800-\uDFFF]|[\uFFFE\uFFFF]", "?");
這通過去除有問題的字符和一個問號替換它們清理S值的字符串。你可以用任何字符串替換或者只使用一個空字符串。
XML Spec允許0x09(TAB),0x0A(LF - 換行或NL - 換行)和0x0D(CR - 回車)。上面的RegEx注意不要刪除這些。
XML 1.1規範允許您轉義其中的一些字符。
例如:使用對於0x03在HTML文件中顯示爲,在Office文檔和記事本中顯示爲L。
我使用Asp.net,這在我的GridView中被自動處理,所以我不需要替換這些值 - 但我相信它可能是瀏覽器照顧它的所有我知道的。
我想在OpenXML中轉義這些值,但是當我查看輸出時,它顯示了退出標記。所以邁克 TeeVee仍然顯示爲邁克 TeeVee在Excel中而不是像邁克 TeeVee或邁克L TeeVee。這就是爲什麼我更喜歡Mike?TeeVee的方法。
我的預感是,這是目前OpenXML中的一個錯誤,它編碼允許的XML ASCII字符,但允許不支持的ASCII字符透漏。
UPDATE:
我忘了,我可以查找這些字符是如何使用「的Open XML SDK 2.0生產力工具」看到裏面的文檔,如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 //0x00 is not Supported in 1.0 or 1.1
? ""
: ("&#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 //0x00 is not Supported in 1.0 or 1.1
? ""
: ("_x" + string.Format("{0:0000}", (byte)(m.Value[0])) + "_");
});
請問您的ASCII字符集包括非打印字符? – 2009-11-14 06:56:28
你的意思是像'<'到'<'? – Elisha 2009-11-14 06:58:22
你能舉一個你期待的轉換的例子嗎? – 2009-11-14 06:59:06