Excel Interop Range.Replace方法不起作用

我正在尝试编写一个C#方法,它将从Excel电子表格中删除所有字符集合的实例。 使用Range对象的Replace方法似乎是最有效的方法,而不是遍历每个单元格。 以下是我正在处理的内容:

范围扩展方法:

public static void ReplaceChars(this Range me, String toReplace, String replacement = "") { //App is a static reference to the active Excel instance. //Alerts must be suppressed for characters that are not present in data. App.DisplayAlerts = false; for (Int32 i = 0; i < toReplace.Length; i++) { me.Replace( //I'm using "Substring(i,1)" rather than "foreach (Char c in toReplace)" //because Excel maps Char values differently than .NET. What: toReplace.Substring(i, 1), Replacement: replacement, LookAt: XlLookAt.xlPart, SearchOrder: XlSearchOrder.xlByRows, MatchCase: true, MatchByte: false, //I'm not 100% what this arg does SearchFormat: false, //Or this one ReplaceFormat: false); //Or this one } App.DisplayAlerts = true; } 

像这样从主程序调用,例如只留下标点符号:

  App.ActiveSheet.Cells.ReplaceChars( "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"); 

有时'U'不会被取代,有时候是'T',有时候是所有的数字。 我不能真正预测它。 如果我注释掉设置DisplayAlerts,并在for循环中放置一个断点,我将得到未被replace的字符的警报。

有没有人有Range.Replace像这样的问题? 我只是不正确地分配参数?

我想这一切都必须做的问题范围的NumberFormat属性。 我在replace之前添加了它,它工作:

 ws.Cells.NumberFormat = "@" //Set format to text foreach (Range col in ws.Cells){ //Iterate through columns rather than doing entire range to reduce memory overhead col.Value = col.Value //Flatten any lingering dates to text values }