2010-12-09 7 views
1

J'ai donc un objet Microsoft.Office.Interop.Excel.Workbook. Il utilise essentiellement un fichier Excel de modèle pour se construire. Le fichier Excel contient une couleur de colonne de modèle pour la section des résultats, etc., puis le code imprime simplement sur ces colonnes de modèle, il ne personnalise pas l'apparence du fichier lui-même, ne place que les données. Cependant, c'est un problème car après cela, notre modèle représente les lignes les plus POSSIBLES possible, mais la plupart du temps (la plupart du temps), nous n'en utilisons même pas la moitié.Comment "nettoyer" Microsoft.Office.Interop.Excel.Workbook

Quelle est la manière la plus simple de supprimer toutes les lignes qui ne contiennent pas de données de cellule après la création du fichier, en travaillant directement avec l'objet Microsoft.Office.Interop.Excel.Workbook. Nous avons déjà une méthode de "nettoyage" qui fonctionne après la création, mais je veux ajouter cette logique. Voici notre nettoyage actuel:

private void CleanupExcel() 
     { 
      if (!_visible && _workbook != null) 
      { 
       _workbook.Close(false, Missing.Value, Missing.Value); 
      } 
      _workbook = null; 
      _sheet = null; 
      if (_excel != null) 
      { 
       System.Runtime.InteropServices.Marshal.ReleaseComObject(_excel); 
       // WW, 5/26/09: not sure if a problem here, but it probably is since the code was taken from here 
       // but in the indicator, Excel exists in the process even after the app is closed. The code here seems to fix it. 
       GC.Collect(); 
       GC.WaitForPendingFinalizers(); 
      } 
      _excel = null; 
     } 

P.S. D'ailleurs, c'est la première de deux feuilles dans le document. J'ai également accès à l'objet Microsoft.Office.Interop.Excel.Worksheet s'il est plus facile de le faire.

+1

Pas pour votre question réelle, mais concernant le commentaire dans votre exemple de code. Vous ne nettoyez pas les choses correctement, si vous le faisiez, vous n'auriez pas besoin de 'GC.Collect();'. Vous devriez libérer tous les objets que vous créez partout (ce qui inclut de faire attention à toujours garder une référence à tout ce qui est créé). Voir cette question pour plus de détails: http://stackoverflow.com/questions/158706/how-to-properly-clean-up-excel-interop-objects-in-c –

Répondre

0

Si l'on suppose que toutes les lignes vides sont au bas des feuilles, vous devriez pouvoir les sélectionner comme plage, puis les supprimer tous, quelque chose comme cela, je pense:

Excel.Range range = _sheet.get_Range("A501", "A60000"); 
Excel.Range row = range.EntireRow; 
rowDelete(Type.Missing); 

S'ils Je ne suis pas au fond, peut-être que vous pourriez faire une sorte de sorte qu'ils se retrouvent tous en bas et utilisent ensuite quelque chose de similaire à mon code.

+0

Est-ce que cela va supprimer seulement les lignes sans données en eux? Parce que toutes les lignes ont une couleur ou un marquage mais pas de données. – slandau

+0

Cela supprime toutes les lignes, peu importe ce qu'il semble ... – slandau

+0

@slandau: Oui, ce code est seulement le code de suppression, vous devez changer les paramètres à 'get_Range' pour être les lignes que vous voulez supprimer. Si je comprends bien, votre application est celle qui met les données dans le modèle, donc je suppose qu'il serait également savoir combien de lignes il a peuplé. Donc, s'il a peuplé 1225 lignes, alors changez "" A501 "' '1226" '(ou peut-être' "1227" 'si vous avez un en-tête) et j'espère que tout fonctionnera. –

0

Essayez les solutions suivantes. Il passe essentiellement par une plage (que j'ai codé en dur pour être A1: A10), vérifie quelles lignes sont vides, les marque pour la suppression, puis les balaye et les supprime.

 public void RemoveRows() 
     { 
      Excel.Range rng = Application.get_Range("A1", "A10"); 
      List<int> rowsMarkedForDeletion = new List<int>(); 

      for(int i = 0; i < rng.Rows.Count; i++) 
      { 
       if(Application.WorksheetFunction.CountA(rng[i + 1].EntireRow) == 0) 
       { 
        rowsMarkedForDeletion.Add(i + 1); 
       } 
      } 

      for(int i = rowsMarkedForDeletion.Count - 1; i >= 0; i--) 
      {     
       rng[rowsMarkedForDeletion[i]].EntireRow.Delete(); 
      } 
     } 

Pour donner un crédit entier en utilisant COUNTA est une technique que j'appris de OzGrid.

+0

me donne des erreurs de compilation dans EntireRow – slandau

+0

Pourriez-vous me dire quelles erreurs de compilateur vous voyez? Je n'obtiens aucune erreur de compilateur dans mon projet. –