문제

I am working in an ASP.NET Website(Web Forms,.NET 4.0) I have a word document which is created by using Aspose.Words.Now i need to highlight certain strings in the word document.I need a function to perform this action. Something like this,

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

Can someone help me in achieving this?

도움이 되었습니까?

해결책

You can use Aspose to do this for you, so you can avoid word automation on the web server (which is likely to not have office installed). Much of this code is based on examples from the Aspose documentation.

Setup the following class:

 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;
        }
    }

Then to use it:

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");

다른 팁

You can use the following code to open a Word document and highlight the searched for text(s):

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);
}
}

You have to add a reference to Microsoft.Office.Interop.Word using the following statement:

using Word = Microsoft.Office.Interop.Word;

If you want to do as a function, then modify it

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top