заменить значения ячеек в Excel с помощью excel.interop

Я хочу отсканировать лист 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 = "";
        }      

person Woody    schedule 01.08.2009    source источник


Ответы (2)


Проблема здесь

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

Value2 Свойство класса Range, возвращает массив значений. что вам нужно сделать, это, возможно, объявить пустой массив и получить Value2 диапазона, зациклить каждый элемент в массиве и запустить регулярное выражение, если оно обнаружит совпадение, замените элемент в массиве. Затем вы можете вернуть массив в значение 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);
person almog.ori    schedule 01.08.2009
comment
Прекрасно работает. Огромное спасибо, Ори ... ты спас мою голову от новых головных болей ... лол ... Я также полностью понимаю, что ты сделал ... а также опыт обучения ... еще раз спасибо! - person Woody; 02.08.2009
comment
Привет, Ори, я только что столкнулся с ошибкой. Я получаю сообщение «Невозможно преобразовать объект типа System.Double» в тип «System.Object [,]». всякий раз, когда в диапазоне находится только одна ячейка. Если в диапазоне есть более одной ячейки, тогда он отлично работает ... какие-нибудь идеи? - person Woody; 18.08.2009
comment
Я использовал тот же код для поиска в наборе документов Excel, используя более или менее тот же самый код, просто ища номера кредитных карт (см. Этот код для той же работы в word: stackoverflow.com/questions/2235388 /) Спасибо за этот ответ. Это сэкономило мне много работы! +1 - person sonstabo; 10.02.2010

Здесь вы можете получить небольшое представление о фрагменте кода, но я его не пробовал, поэтому он может содержать синтаксические ошибки.

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;
     }
}
person shahjapan    schedule 01.08.2009
comment
Я просто попробовал это, а также сделал что-то вроде того, что упомянул Ори, и продолжаю получать ошибки объектов. Например, код, который вы только что опубликовали, вернулся с - NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта :( - person Woody; 02.08.2009
comment
Если в одной из ячеек где-то в смежном блоке есть нулевое значение, то вызываемый UsedRange ToString () выдаст - person almog.ori; 02.08.2009
comment
да, в любом случае, как Вуди нужно использовать workheet.UsedRange, проверить его состояние и принять решение. - person shahjapan; 02.08.2009
comment
безусловно, этот комментарий был для Вуди - person almog.ori; 02.08.2009