【问题标题】:replace cell values within excel using excel.interop使用 excel.interop 替换 excel 中的单元格值
【发布时间】:2009-08-01 16:55:05
【问题描述】:

我想扫描一个 Excel 表,并将任何出现的社会安全号码替换为零...如果可能的话,我想使用 Excel.Interop 来执行此操作,但我现在对任何事情都持开放态度。 ..这是我的一些代码...过去几个月我一直在敲桌子...

// 获取范围并将其转换为字符串变量 Excel.Range _range =(Excel.Range)_excelApp.get_Range("A1:K1",Type.Missing); // 转换我们范围内单元格的值 // 到字符串变量 字符串 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 = 替换 SSN; } // 用新名称保存我们的工作簿并创建备份 _excelWorkbook.SaveAs("Results.xls", Type.Missing, Type.Missing, Type.Missing, Type.Missing, true, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing,类型。缺失); //关闭工作簿 _excelWorkbook.Close(false, Type.Missing, Type.Missing); // 向应用发送退出信号 _excelApp.Quit(); // 报告成功 MessageBox.Show("文件屏蔽成功。", "屏蔽数据", MessageBoxButtons.OK); //释放内存 //System.Runtime.InteropServices.Marshal.ReleaseComObject(_excelApp); // 将标签改回空白 lblActivity.Text = ""; }

【问题讨论】:

    标签: c# regex excel interop replace


    【解决方案1】:

    问题来了

            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;
            }
    

    我认为您误解了 Value2 是什么,它是您上面定义的范围的数组表示。

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

    Range 类的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);
    

    【讨论】:

    • 完美运行。非常感谢 Ori……你让我的头免于更多的头痛……哈哈……我也完全理解你的所作所为……也是一次学习经历……再次感谢!
    • 嘿 Ori,我刚刚遇到了一个错误。我得到一个无法将'System.Double'类型的对象转换为'System.Object [,]'的类型。每当范围内只有一个单元格时。如果该范围内填充了多个单元格,那么它可以正常工作......有什么想法吗?
    • 我使用相同的代码搜索一组 Excel 文档,使用或多或少完全相同的代码,只是查找信用卡号(有关 word 中的相同工作,请参阅此:stackoverflow.com/questions/2235388/…)谢谢你的回答。它为我节省了很多工作! +1
    【解决方案2】:

    这里可以对代码sn-p有个小小的了解,不过我没试过,所以可能有语法错误。

    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;
         }
    }
    

    【讨论】:

    • 我刚刚尝试过,也做了类似 Ori 提到的事情,但我不断收到对象错误。例如,您刚刚发布的代码返回 - NullReferenceException: Object reference not set to an instance of an object :(
    • 如果调用 ToString() 的 UsedRange 连续块中某处的某个单元格中有一个空值,则会抛出
    • 是的,Woody 需要如何使用工作表。UsedRange 并检查他的状况并做出决定。
    • 绝对,那条评论是给伍迪的
    猜你喜欢
    • 2013-09-10
    • 2020-01-09
    • 2013-11-02
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多