ReplaceTextFmt2.cs
C# VB
//// This code is part of Document Solutions for Word demos.// Copyright (c) MESCIUS inc. All rights reserved.//using System;using System.IO;using System.Drawing;using System.Collections.Generic;using System.Text.RegularExpressions;using GrapeCity.Documents.Word;
namespace DsWordWeb.Demos{ // NOTE: this sample is obsolete, use the RangeBase.Replace() // extension method instead (see ReplaceTextFmt). // // This sample loads an existing document, finds all occurrences // of a certain string in it, and replaces that string with another one, // also changing the character format of the replacement string. // This sample is almost identical to ReplaceTextFmt // but uses PersistentRange instead of Range. // Its primary purpose is to illustrate the differences between // Range and PersistentRange. public class ReplaceTextFmt2 { public GcWordDocument CreateDocx() { // The document to replace text in: var path = Path.Combine("Resources", "WordDocs", "JsFrameworkExcerpt.docx"); // The text to find: const string tFind = "javascript"; // The replacement: const string tRepl = "ArabicaScroll";
var doc = new GcWordDocument(); doc.Load(path);
var runs = doc.Body.Runs; List<PersistentRange> runRanges = new List<PersistentRange>(runs.Count); foreach (var run in runs) runRanges.Add(run.GetPersistentRange());
foreach (var rr in runRanges) { var str = rr.Text; var matches = Regex.Matches(str, tFind, RegexOptions.IgnoreCase); if (matches.Count == 0) continue;
var color = rr.ParentRun.Font.Color.RGB; rr.Clear(); var pos = 0; foreach (Match m in matches) { rr.Runs.Add(str.Substring(pos, m.Index - pos)).Font.Color.RGB = color; rr.Runs.Add(tRepl).Font.Color.RGB = Color.Red; pos = m.Index + m.Length; } rr.Runs.Add(str.Substring(pos)).Font.Color.RGB = color;
if (!string.IsNullOrEmpty(rr.Runs.First.GetRange().Text)) throw new Exception("Unexpected"); rr.Runs.First.Delete();
// PersistentRange is kept up to date when the document changes, // so it should be disposed when no longer needed to improve // performance and reduce memory consumption: rr.Dispose(); } // Not strictky necessary but a good practice: runRanges.Clear();
// Add a note at the end of the document: doc.Body.Sections.Last.GetRange().Paragraphs.Add( $"DsWord replaced '{tFind}' with '{tRepl}' on {Util.TimeNow():r)}.");
// Done: return doc; } }}