C# Excel互操作范围。替换方法不起作用
我正在尝试编写一个C#方法,该方法将从Excel电子表格中删除字符集合的所有实例。使用Range对象的Replace方法似乎是最有效的方法,而不是遍历每个单元格。以下是我的工作内容: 范围扩展方法:C# Excel互操作范围。替换方法不起作用,c#,excel,vba,interop,excel-dna,C#,Excel,Vba,Interop,Excel Dna,我正在尝试编写一个C#方法,该方法将从Excel电子表格中删除字符集合的所有实例。使用Range对象的Replace方法似乎是最有效的方法,而不是遍历每个单元格。以下是我的工作内容: 范围扩展方法: public static void ReplaceChars(this Range me, String toReplace, String replacement = "") { //App is a static reference to the active Excel
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;
}
有时不替换“U”,有时替换“T”,有时替换所有数字。我真的无法预测。如果我对设置DisplayAlerts进行注释,并在for循环中设置断点,我将收到关于未替换字符的警报
是否有人对射程有问题。像这样更换?我只是没有正确地分配参数吗?我认为这一切都与所讨论范围的NumberFormat属性有关。我在替换之前添加了这一点,它起了作用:
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
}
我认为你做这件事的方式非常复杂。显然,您在这里试图实现的是删除该工作表中的所有字母数字字符。虽然我不知道这有什么作用,但我会用正则表达式来代替。请澄清你到底想做什么,因为我怀疑有更好的方法来实现它。我的最终目标是找出哪些单元格有外国口音字母或其他非标准标点符号。所以我实际上是在替换普通英文键盘上的所有字符。检查针对主循环中的每个单元格过滤unicode值的正则表达式是我的第一选择,但它是以指数时间执行的,对于大型文件来说似乎不可行。Range.Replace的优点是Excel的内置操作得到了高度优化,Excel将利用并行处理。因此,要查找Sheet1上的所有奇怪字符,我将其复制,请在Sheet1(2)上的所有普通字符上使用Range.Replace。然后我要做的就是检查每个单元格的.Value.ToString().Length是否大于0,这比正则表达式执行得快得多。(除了Range.Replace没有像我预期的那样工作。)然后我在Sheet1中报告结果,并删除Sheet1(2)。对我来说,这听起来仍然非常复杂,但是嘿:如果你说速度快得多,那就是这样做的。现在,您说,
我将收到未替换字符的警报
-您可以指定吗?什么样的警报<代码>公式太长可能?1。是的,它肯定是复杂的。好老的互操作。2.当找不到查询的文本时,该警报是正常的查找和替换消息。Microsoft Excel找不到任何要替换的数据。请检查您的搜索格式和条件是否定义正确。如果您确定此工作簿中存在匹配的数据,则该数据可能位于受保护的工作表上。Excel无法替换受保护工作表上的数据我禁用DisplayAlerts来抑制那些不在工作表中的字符,但它也会显示那些它“遗漏”的字符的警报。是的,当你提到日期时,我怀疑是这样的。另一件事:由于MatchCase查看字母并替换小写和大写字母,因此您最好将字符串缩减为“abcdefghijklmnopqrstuvxyz1234567890”
并设置MatchCase:false
。顺便说一句:MatchByte
用于亚洲字符,所以不需要。你可以接受你自己的答案,因为它确实解决了你的问题。谢谢你的参数建议。
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
}