2013-02-19 3 views
0

Le dilemme est plutôt simple. Je dois créer une petite application qui effacera toutes les couleurs d'arrière-plan des polices (laisser les couleurs d'arrière-plan des cellules inchangées), et supprimer tout le texte barré dans un document Word, puis enregistrer le document dans un autre dossier. Sinon, la mise en forme du document doit rester intacte. Ci-dessous un grand exemple tiré d'exemples aléatoires disponibles dans google montrant comment appliquer des types spécifiques de mise en forme à des chaînes aléatoires trouvées avec Find.Execute(). Je n'ai aucune idée cependant, sur comment faire seulement comme décrit ci-dessus.C# Word Document - Comment nettoyer le formatage?

public static string searchDoc(string fileNameRef) 
    { 

     Microsoft.Office.Interop.Word._Application word = new Microsoft.Office.Interop.Word.Application(); ; 
     Microsoft.Office.Interop.Word._Document doc = new Microsoft.Office.Interop.Word.Document(); 
     object missing = System.Type.Missing; 

     try 
     { 
      System.IO.FileInfo ExecutableFileInfo = 
        new System.IO.FileInfo(System.Reflection.Assembly.GetEntryAssembly().Location); 

      object fileName = 
       System.IO.Path.Combine(ExecutableFileInfo.DirectoryName, fileNameRef); 

      doc = word.Documents.Open(ref fileName, ref missing, ref missing, ref missing 
       , ref missing, ref missing, ref missing, ref missing, ref missing, ref missing 
       , ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); 
      doc.Activate(); 

      //object findStr = "hello"; //sonething to find 
      // THIS is the part where I fail, I can't find of a way to Find.Execute on formatting 
      // as opposed to mere strings. 
      //while (word.Selection.Find.Execute(ref findStr)) //found... 
      //{ 
      // //change font and format of matched words 
      // word.Selection.Font.Name = "Tahoma"; //change font to Tahoma 
      // word.Selection.Font.ColorIndex = Microsoft.Office.Interop.Word.WdColorIndex.wdRed; //change color to red 
      //} 

      object saveFileName = ExecutableFileInfo.DirectoryName + "\\New\\" + fileNameRef; 

      doc.SaveAs(ref saveFileName, ref missing, ref missing, ref missing, ref missing 
       , ref missing, ref missing, ref missing, ref missing, ref missing, ref missing 
       , ref missing, ref missing, ref missing, ref missing, ref missing); 

     } 
     catch (Exception) 
     { 
     } 
     finally 
     { 
      doc.Close(ref missing, ref missing, ref missing); 
      word.Application.Quit(ref missing, ref missing, ref missing); 
     } 

     return fileNameRef; 
    } 

Merci pour toute aide! Et je veux dire tout, simplement commencer à trouver le formatage aiderait beaucoup, j'imagine. :)

Répondre

1

Ceci n'est pas une question spécifique au C#; C'est une question de modèle d'objet Word (je vous renvoie à here et here).

En ce qui concerne votre question spécifique, je vous suggère d'activer Macro Recorder dans Word, d'effectuer les actions et de voir le code VBA généré. Ensuite, vous pouvez l'appliquer en C#.

Essayez ceci:

using System; 
using Microsoft.Office.Interop.Word; 
using System.IO; 
using System.Reflection; 

namespace WordFormattingFindReplace { 
    class Program { 
     static void Main(string[] args) { 
     } 

     public static string searchDoc(string fileName) { 
      _Application word = new Application(); ; 
      _Document doc; 

      string folderName = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); 
      string filePath = Path.Combine(folderName,fileName); 

      doc = word.Documents.Open(filePath); 

      var find=doc.Range().Find; 
      find.Text="Hello"; 
      find.Format=true; 
      find.Replacement.Font.Name="Tahoma"; 
      find.Replacement.Font.ColorIndex=WdColorIndex.wdRed; 
      find.Execute(Replace:WdReplace.wdReplaceAll); 

      doc.SaveAs2(Path.Combine(folderName,"New",fileName)); 

      doc.Close(); 

      //We need to cast this to _Application to resolve which Quit method is being called 
      ((_Application)word.Application).Quit(); 

      return fileName; 
     } 
    } 
} 

Quelques notes:

  • Utilisez using déclarations pour plus de clarté. Au lieu de Microsoft.Office.Interop.Word._Application word, ajouter using Microsoft.Office.Interop.Word en haut de votre fichier, et vous pouvez alors il suffit d'écrire _Application word
  • Si tout ce que vous avez besoin est le nom du dossier, utilisez la méthode Path.GetDirectoryName statique et enregistrer comme une variable string, au lieu de créer un objet FileInfo
  • À partir de .NET 4, vous pouvez ignorer les arguments facultatifs lorsque vous appelez Documents.Open, et Document.Close. Cela signifie également que vous n'avez pas besoin de object missing.
  • Il n'y a rien ici que l'utilisateur a vraiment besoin de voir, afin d'appeler Document.Activate est inutile
  • Il est probablement préférable de réutiliser l'instance Word.Application, au lieu de le recréer pour chaque appel.
Questions connexes