2009-08-01 6 views
2

Je veux numériser une feuille Excel, et remplacer toutes les occurrences de numéros de sécurité sociale avec des zéros ... Je voudrais faire cela en utilisant Excel.Interop si possible, mais je « m ouvert à tout à ce moment ... voici une partie de mon code ... Je me cogner la tête sur le bureau pour les quelques mois ...remplacer les valeurs de cellules dans Excel en utilisant 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 = ""; 
     }  

Répondre

6

le problème ici est

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

Et ici

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

Je pense que vous ne comprenez pas ce qu'est Value2, c'est la reprentation de la gamme que vous avez définie ci-dessus.

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

Value2 Propriété de la classe Range, renvoie un tableau de valeurs. ce que vous devez faire est peut-être de déclarer un tableau vide et d'obtenir la Valeur2 de la gamme, de boucler chaque élément dans le tableau et d'exécuter la regex, s'il trouve une correspondance, remplacez l'élément dans le tableau. Ensuite, vous pouvez remettre le tableau à la valeur 2 de la plage, ce qui mettra à jour les valeurs des cellules.

EDIT: S'il vous plaît trouver un exemple de code ci-dessous

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

Fonctionne parfaitement. Merci beaucoup Ori ... tu m'as sauvé la tête de plus de maux de tête ... lol ... Je comprends aussi complètement ce que tu as fait ... une expérience d'apprentissage aussi ... merci encore! – Woody

+0

pas de problème à tout moment :) –

+0

Hey Ori, je viens de rencontrer un bug. Je reçois un Impossible de lancer l'objet de type 'System.Double' pour taper 'System.Object [,]'. chaque fois qu'une seule cellule est dans la gamme. S'il y a plus d'une cellule qui est peuplée dans la gamme, alors cela fonctionne bien ... des idées? – Woody

4

Ici, vous pouvez avoir une petite compréhension de l'extrait de code, mais je n'ai pas essayé il peut contenir des erreurs de syntaxe.

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

J'ai juste essayé cela et fait quelque chose comme Ori l'a mentionné, et je continue à recevoir des erreurs d'objet. Comme par exemple, le code que vous venez de publier revient avec - NullReferenceException: Référence d'objet non définie sur une instance d'un objet :( – Woody

+0

S'il y a une valeur nulle dans l'une des cellules quelque part dans le bloc contigu, c'est l'appel UsedRange ToString() lancera –

+0

oui n'importe comment Woody doit utiliser worksheet.UsedRange et vérifier son état et prendre la décision – shahjapan

Questions connexes