Woo*_*ody 2 c# regex excel interop replace
我想要扫描excel表,并用零替换任何出现的社会安全号码...我想用Excel.Interop尽可能地这样做,但我现在对任何事情都开放......这里是我的一些代码......过去几个月我在桌子上敲我的头......
// Get range and convert it to a string variable
Excel.Range _range =(Excel.Range)_excelApp.get_Range("A1:K1",Type.Missing);
// convert the value of our cells in our range
// to the string variable
string myString = _range.Cells.Value2.ToString();
// match any SSN e.g. 1236780909, 123-33-2445
if (Regex.IsMatch(myString, @"\b\d{3}\b\d{2}\b\d{4}"));
{
_range.Cells.Value2 = replaceSSN;
}
// save our workbook with a new name and create a backup
_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);
// close workbook
_excelWorkbook.Close(false, Type.Missing, Type.Missing);
// send quit signal to app
_excelApp.Quit();
// report success
MessageBox.Show("File masked successfully.", "Mask Data", MessageBoxButtons.OK);
// release memory
//System.Runtime.InteropServices.Marshal.ReleaseComObject(_excelApp);
// change label back to being blank
lblActivity.Text = "";
}
问题出在这里
string myString = _range.Cells.Value2.ToString();
Run Code Online (Sandbox Code Playgroud)
和这里
// match any SSN e.g. 1236780909, 123-33-2445
if (Regex.IsMatch(myString, @"\b\d{3}\b\d{2}\b\d{4}"));
{
_range.Cells.Value2 = replaceSSN;
}
Run Code Online (Sandbox Code Playgroud)
我认为你误解了Value2是什么,它是你在上面定义的范围的数组表示.
Excel.Range _range =(Excel.Range)_excelApp.get_Range("A1:K1",Type.Missing);
Run Code Online (Sandbox Code Playgroud)
Range2的Value2属性,返回值数组.您需要做的是声明一个空数组并获取该范围的Value2,循环数组中的每个项目并运行正则表达式,如果找到匹配项则替换该数组中的项目.然后,您可以将数组设置回Range的Value2,这将更新单元格值.
编辑:请在下面找到一些示例代码
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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18327 次 |
| 最近记录: |