2010-11-04 12 views
2

J'essaie de rechercher un texte spécifique dans un document Word, puis de le remplacer par un tableau personnalisé. Il me semble presque que cela fonctionne, mais il semble que le tableau soit ajouté à mi-chemin du mot précédent plutôt que juste là où il a trouvé le texte.Rechercher du texte dans un document Word et le remplacer par un tableau

C'est ma fonction

public void AddTableAtCursor(string tabledata, 
          string find, 
          Boolean flh = true, 
          string name = "Table") 
{ 
    object replaceAll = Word.WdReplace.wdReplaceAll; 

    Word.Range srng = Application.ActiveDocument.Content; 
    srng.WholeStory(); 

    srng.Find.ClearFormatting(); 
    srng.Find.Text = find; 

    srng.Find.Replacement.ClearFormatting(); 
    srng.Find.Replacement.Text = ""; 

    int FirstChr = srng.Text.IndexOf(find); 

    if (FirstChr != -1) 
    { 
     Word.Range ts = 
      Application.ActiveDocument.Range(FirstChr, FirstChr); 

     this.Application.Selection.TypeParagraph(); 

     srng.Find.Execute(
      ref missing, ref missing, ref missing, ref missing, 
      ref missing, ref missing, ref missing, ref missing, 
      ref missing, ref missing, ref replaceAll, ref missing, 
      ref missing, ref missing, ref missing); 

     string[] rows = tabledata.Split('|'); 
     string[] c = rows[0].Split('^'); 
     rows[0] = null; 

     object styleName = "Light List - Accent 1"; 
     Word.Table tbl = null; 

     Word.Range currentSelection = srng; 

     int hclen = c.Length; 
     if (TomData.IndPrices != "on") { hclen = hclen - 2; } 

     tbl = Application.ActiveDocument.Content.Tables.Add(
      ts, rows.Length + 1, hclen); 
     tbl.set_Style(ref styleName); 
     tbl.PreferredWidth = 90; 
     tbl.PreferredWidthType = 
      Word.WdPreferredWidthType.wdPreferredWidthPercent; 

     // First Row, Put the name into the first cell 

     for (int i = 1; i <= hclen; i++) 
     { 
      if (i == 1) 
      { 
       tbl.Cell(1, i).Range.InsertBefore(name); 
      } 
      else 
      { 
       tbl.Cell(1, i).Range.InsertBefore(""); 
      } 
     } 

     // 2nd row, put the headers in 
     for (int i = 1; i <= hclen; i++) 
     { 
      int t = i - 1; 
      tbl.Cell(2, i).Range.InsertBefore(c[t]); 
     } 

     int tblrow = 3; 

     // after that just put the data 
     for (int rc = 0; rc < rows.Length; rc++) 
     { 
      if (rows[rc] != null) 
      { 
       string[] coldata = rows[rc].Split('^'); 
       int tblcol = 1; 
       int clen = coldata.Length; 
       if (TomData.IndPrices != "on") { clen = clen - 2; } 
       for (int nc = 0; nc < clen; nc++) 
       { 
        tbl.Cell(tblrow, tblcol).Range.InsertBefore(
         coldata[nc]); 
        tblcol++; 
       } 
       tblrow++; 
      } 
     } 
    } 
} 

Qu'est-ce que je fais mal?

Répondre

5

Vous avez beaucoup de problèmes ici, donc je vous recommande de travailler par étape, étape par étape.

1) vous devez TROUVER le texte que vous remplacez. Puisque vous le remplacez par une table, vous ne pouvez vraiment pas utiliser l'option REPLACEALL de l'objet find, alors débarrassez-vous de tout cela. Obtenez la plage CONTENT du document dans une variable Range, le FIND à partir de cela, puis exécutez votre recherche. La plage à partir de laquelle vous avez obtenu le FIND sera réinitialisé pour pointer vers le texte spécifique trouvé (le cas échéant) et ALORS vous pouvez manipuler cette gamme.

Par exemple

Set myRange = ActiveDocument.Content 
myRange.Find.Execute FindText:="blue", Forward:=True 
If myRange.Find.Found = True Then myRange.Bold = True 

2) Ensuite, vous confondez Décalages dans une chaîne, avec des décalages dans un document, comme dans ce code

int FirstChr = srng.Text.IndexOf(find); 

    if (FirstChr != -1) 
    { 
     Word.Range ts = Application.ActiveDocument.Range(FirstChr,FirstChr); 

qui parfois, mais rarement , travail. Cela dépend de beaucoup de choses dans Word. Mieux vaut trouver ce dont vous avez besoin à l'aide de la recherche, puis manipuler le texte uniquement avec des plages.

Il y a un très bon article ici sur FIND et REPLACE dans word.

http://msdn.microsoft.com/en-us/library/aa211953%28office.11%29.aspx

j'écrire une routine pour rechercher et sélectionner le texte que vous êtes après la première. Assurez-vous que cela fonctionne dans tous les cas, puis, en utilisant la gamme du texte trouvé, travailler avec le remplacer par une table. une fois que vous avez trouvé le texte que vous cherchez

Questions connexes