用excel.interopreplaceexcel中的单元格值

我想扫描一个Excel工作表,并用零代替社会安全号码的任何事件…我想这样做使用Excel.Interop,如果可能的话,但我打开任何东西在这一点上…这里是我的一些代码…在过去的几个月里,我在桌子上敲着头…

  //获取范围并将其转换为stringvariables 
             Excel.Range _range =(Excel.Range)_excelApp.get_Range(“A1:K1”,Type.Missing);

             / /转换我们的细胞在我们的范围内的价值
             //到stringvariables
             string myString = _range.Cells.Value2.ToString();          

             //匹配任何SSN,例如1236780909,123-33-2445
             if(Regex.IsMatch(myString,@“\ b \ d {3} \ b \ d {2} \ b \ d {4}”));
             {                
                 _range.Cells.Value2 = replaceSSN;
             }

             //以新名称保存我们的工作簿并创build备份
             _ExcelWorkbook.SaveAs(“Results.xls”,Type.Missing,Type.Missing,Type.Missing,Type.Missing,true,Excel.XlSaveAsAccessMode.xlNoChange,Type.Missing,Type.Missing,Type.Missing,Type.Missing, Type.Missing);

             //closures工作簿
             _excelWorkbook.Close(false,Type.Missing,Type.Missing);

             //发送退出信号到应用程序
             _excelApp.Quit();

             //报告成功            
             MessageBox.Show(“File masked successfully。”,“Mask Data”,MessageBoxButtons.OK);

             //释放内存
             //System.Runtime.InteropServices.Marshal.ReleaseComObject(_excelApp);

             //将标签更改为空白
             lblActivity.Text =“”;
         }      

问题在这里

string myString = _range.Cells.Value2.ToString(); 

和这里

  // match any SSN eg 1236780909, 123-33-2445 if (Regex.IsMatch(myString, @"\b\d{3}\b\d{2}\b\d{4}")); { _range.Cells.Value2 = replaceSSN; } 

我认为你误解了Value2是什么,它是你在上面定义的范围的arraysreprentation。

 Excel.Range _range =(Excel.Range)_excelApp.get_Range("A1:K1",Type.Missing); 

Range类的Range2属性返回值数组。 你需要做的可能是声明一个空的数组,并获取范围的值2,循环每个项目在数组中运行正则expression式,如果它发现一个匹配replace数组中的项目。 然后,您可以将数组设置回Range的Value2,这将更新单元格值。

编辑:请find下面的一些示例代码

  var excelApp = new Application(); excelApp.Workbooks.Open("c:\\Test.xls",Type.Missing,Type.Missing, Type.Missing,Type.Missing, Type.Missing,Type.Missing, Type.Missing,Type.Missing, Type.Missing,Type.Missing, Type.Missing,Type.Missing, Type.Missing,Type.Missing); var ws = excelApp.Worksheets; var worksheet =(Worksheet) ws.get_Item("Sheet1"); Range range = worksheet.UsedRange; // In the following cases Value2 returns different types // 1. the range variable points to a single cell // Value2 returns a object // 2. the range variable points to many cells // Value2 returns object[,] object[,] values = (object[,])range.Value2; for (int row = 1; row <= values.GetUpperBound(0); row++) for (int col = 1; col <= values.GetUpperBound(1); col++) { string value = Convert.ToString(values[row, col]); //Also used a different regex, found yours not to match on your given criteria if (Regex.IsMatch(value, @"^\d{3}-\d{2}-\d{4}$")) { range.Cells.set_Item(row,col,"0"); } } excelApp.Save("C:\\Out.xls"); excelApp.Quit(); Marshal.ReleaseComObject(worksheet); Marshal.ReleaseComObject(ws); Marshal.ReleaseComObject(excelApp); 

在这里你可以对代码片断有一个小的理解,但是我没有尝试过,所以它可能包含语法错误。

 Excel.WorkSheet currentSheet = ApplicationInstance.ActiveSheet as Excel.Worksheet; foreach(Exce.Range r1 in currentSheet.UsedRange) { if(Regex.IsMatch(r1.Value2.ToString(), @"\b\d{3}\b\d{2}\b\d{4}")) // check r1.Value2 should not be null { r1.Value2 = Your_New_Value; } }