2013-08-24 3 views
0

Хорошо, моя главная цель - пройти каждое слово и проверить, подчеркнуто ли слово. Если это так, я хочу изменить размер шрифта на int x.Как перебирать каждое слово, ms-word?

Я попытался просто идти через каждый символ, как так Edit: Обновленный код

private void button1_Click(object sender, EventArgs e) 
    { 
     word.Application page = new word.Application(); 
     page.Visible = true; 
     word.Document doc = null; 
     foreach (string fi in listBox1.Items) 
     { 
      doc = page.Documents.Open(Application.StartupPath + "\\old\\" + fi); 
      if (doc != null) 
      { 
       int start = 0; 
       foreach (string text in doc.Range().Text.Split(" \r\n\t.".ToCharArray())) 
       { 
        int x = doc.Range().Text.IndexOf(text, start); 
        if (doc.Range(x, text.Length - 1).Underline == word.WdUnderline.wdUnderlineSingle) 
         doc.Range(x, text.Length - 1).Font = new word.Font() { Name = "Times New Roman", Bold = 4, Size = 12 }; 
        else 
         doc.Range(x, text.Length - 1).Font = new word.Font() { Name = "Times New Roman", Size = 8 }; 
        start = x+text.Length; 
       } 
      } 
     } 
     //doc.Save(); 
     // doc.Close(); 
     // page.Quit(); 
    } 

Но, я получаю эту ошибку

Вызов был отвергнут вызываемым. (Исключение из HRESULT: 0x80010001 (RPC_E_CALL_REJECTED))

Я понятия не имею, почему это дает, что

+1

Невозможно воспроизвести ваши условия; но, возможно, эта ссылка может быть полезна: http://stackoverflow.com/questions/9747844/getting-call-was-rejected-by-callee-exception-in-vsto-word-application – varocarbas

+0

Благодарю вас за помощь, но Теперь я очень близко подошел к моему ответу. Он просматривает слова, но в настоящее время я тестирую их на 28-страничном документе, поэтому для получения результатов потребуется время. – ismellike

+0

Счастливый читать, что. Если вы лучше понимаете точную проблему/решение, соответствующим образом обновите свой вопрос (даже можете написать собственный ответ). Если это было просто связано с тем, что он не повторяется через диапазоны (не строго связанные с автоматизацией Word), которые могут быть не слишком полезными для других, вы можете просто удалить этот вопрос. – varocarbas

ответ

0

Вот мое решение

   doc = page.Documents.Open(Application.StartupPath + "\\old\\" + fi); 
      if (doc != null) 
      { 
       for (int x = 1; x <= doc.Words.Count - 1; x++) 
       { 
         if (doc.Words[x].Underline != word.WdUnderline.wdUnderlineNone && doc.Words[x].Underline != word.WdUnderline.wdUnderlineDouble) 
          doc.Words[x].Font = new word.Font() { Name = "Times New Roman", Bold = 4, Size = 12 }; 
         else 
          doc.Words[x].Font = new word.Font() { Name = "Times New Roman", Size = 8 }; 
       } 

Это прекрасно работает, но единственная проблема в том, что всплывающие окна предотвращают продолжение кода

+0

Что говорит всплывающее окно и какая строка его выводит? – dotNET

+0

Кстати, вы действительно должны подумать о создании объектов шрифта OUTSIDE loop. – dotNET

+0

Просто я сказал, что мне нужно активировать слово ms, но я нашел для этого исправление. Я окружил его циклом for и try {} catch {}, чтобы дать человеку некоторое время для выхода из всплывающего окна. – ismellike

0

Ваш код может быть значительно улучшен:

doc = page.Documents.Open(System.IO.Path.Combine(Application.StartupPath, "old", fi)); 
if (doc != null) 
{ 
    word.Font RegularFont = new word.Font() { Name = "Times New Roman", Size = 12 }; 
    word.Font BigFont = new word.Font() { Name = "Times New Roman", Size = 8 }; 

    for (int x = 1; x <= doc.Words.Count; x++) 
    { 
      if (doc.Words[x].Underline != word.WdUnderline.wdUnderlineNone && doc.Words[x].Underline != word.WdUnderline.wdUnderlineDouble) 
       doc.Words[x].Font = RegularFont; 
      else 
       doc.Words[x].Font = BigFont; 
     } 
} 
+0

Да, мой ответ немного устарел; Вместо этого я переключился на слово .Font []. – ismellike