2013-02-08 2 views
2

Я работаю на веб-сайте ASP.NET (веб-формы, .NET 4.0) У меня есть документ Word, который создается с помощью Aspose.Words.Now мне нужно выделить определенные строки в word document.I нужна функция для выполнения этого действия. Что-то вроде этого,Выделить строку в документе Word

private void Highlight(Document doc,String anyString,Color red) 
{ 
    //Highlight all "anyString" in doc by red color 
} 

Может кто-то мне помочь в достижении этой цели?

ответ

3

вы можете использовать Aspose, чтобы сделать это для вас, так что вы можете избежать автоматизации слов на веб-сервере (ВГ у него скорее всего не будет установлен офис). Большая часть этого кода основана на примерах из Aspose documentation.

Настройка следующий класс:

private class ReplaceEvaluatorFindAndHighlight : IReplacingCallback 
    { 
     /// <summary> 
     /// This method is called by the Aspose.Words find and replace engine for each match. 
     /// This method highlights the match string, even if it spans multiple runs. 
     /// </summary> 
     ReplaceAction IReplacingCallback.Replacing(ReplacingArgs e) 
     { 
      // This is a Run node that contains either the beginning or the complete match. 
      Node currentNode = e.MatchNode; 

      // The first (and may be the only) run can contain text before the match, 
      // in this case it is necessary to split the run. 
      if (e.MatchOffset > 0) 
       currentNode = SplitRun((Run)currentNode, e.MatchOffset); 

      // This array is used to store all nodes of the match for further highlighting. 
      List<Node> runs = new List<Node>(); 

      // Find all runs that contain parts of the match string. 
      int remainingLength = e.Match.Value.Length; 
      while (
       (remainingLength > 0) && 
       (currentNode != null) && 
       (currentNode.GetText().Length <= remainingLength)) 
      { 
       runs.Add(currentNode); 
       remainingLength = remainingLength - currentNode.GetText().Length; 

       // Select the next Run node. 
       // Have to loop because there could be other nodes such as BookmarkStart etc. 
       do 
       { 
        currentNode = currentNode.NextSibling; 
       } 
       while ((currentNode != null) && (currentNode.NodeType != NodeType.Run)); 
      } 

      // Split the last run that contains the match if there is any text left. 
      if ((currentNode != null) && (remainingLength > 0)) 
      { 
       SplitRun((Run)currentNode, remainingLength); 
       runs.Add(currentNode); 
      } 

      // Now highlight all runs in the sequence. 
      foreach (Run run in runs) 
       run.Font.HighlightColor = Color.Red; 

      // Signal to the replace engine to do nothing because we have already done all what we wanted. 
      return ReplaceAction.Skip; 
     } 

     /// <summary> 
     /// Splits text of the specified run into two runs. 
     /// Inserts the new run just after the specified run. 
     /// </summary> 
     private static Run SplitRun(Run run, int position) 
     { 
      Run afterRun = (Run)run.Clone(true); 
      afterRun.Text = run.Text.Substring(position); 
      run.Text = run.Text.Substring(0, position); 
      run.ParentNode.InsertAfter(afterRun, run); 
      return afterRun; 
     } 
    } 

Затем, чтобы использовать его:

Aspose.Words.Document doc = new Aspose.Words.Document(@"Z:\Temp\test.docx"); 

Regex reg = new Regex("anyString", RegexOptions.IgnoreCase); 
doc.Range.Replace(reg, new ReplaceEvaluatorFindAndHighlight(), true); 


doc.Save(@"Z:\Temp\newdoc.docx"); 
+0

Будет ли эта поддержка проходить цвета в качестве параметров? – Bisileesh

+0

Это класс, поэтому вы можете передать все, что хотите. Либо в конструкторе, либо через свойства. –

+0

Я это выясню. Спасибо большое! – Bisileesh

0

Вы можете использовать следующий код, чтобы открыть документ Word, и выделить поиск текста (ы):

private void btnFind_Click(object sender, EventArgs e) 
{ 
object fileName = "xxxxx"; //The filepath goes here 
string textToFind = "xxxxx"; //The text to find goes here 
Word.Application word = new Word.Application(); 
Word.Document doc = new Word.Document(); 
object missing = System.Type.Missing; 
try 
{ 
    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(); 
    foreach (Word.Range docRange in doc.Words) 
    { 
     if(docRange.Text.Trim().Equals(textToFind, 
      StringComparison.CurrentCultureIgnoreCase)) 
     { 
      docRange.HighlightColorIndex = 
       Microsoft.Office.Interop.Word.WdColorIndex.wdDarkYellow; 
      docRange.Font.ColorIndex = 
       Microsoft.Office.Interop.Word.WdColorIndex.wdWhite; 
     } 
    } 
} 
catch (Exception ex) 
{ 
    MessageBox.Show("Error : " + ex.Message); 
} 
} 

Вы должны добавить ссылку на Microsoft.Office.Interop.Word, используя следующее заявление :

using Word = Microsoft.Office.Interop.Word; 

Если вы хотите сделать как функцию, а затем изменить его

+2

Слово не должно работать в серверном приложении. Автоматизация Word не предназначалась для работы в среде без использования gui-less. –