How can I find a string “#TAB#” and replace that with a Table with 3 Columns and Rows in Aspose.Word?
Thx!
How can I find a string “#TAB#” and replace that with a Table with 3 Columns and Rows in Aspose.Word?
Thx!
Thanks for your inquiry. We suggest you please read following article.
Find and Replace
Following code example shows how to replace text with table. Hope this helps you.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.Writeln("#TAB#");
FindReplaceOptions findOptions = new FindReplaceOptions();
findOptions.ReplacingCallback = new FindAndReplaceTag();
doc.Range.Replace("#TAB#", "", findOptions);
doc.Save(MyDir + "output.docx");
public class FindAndReplaceTag : IReplacingCallback
{
ReplaceAction IReplacingCallback.Replacing(ReplacingArgs e)
{
// This is a Run node that contains either the beginning or the complete match.
Node currentNode = e.MatchNode;
Console.WriteLine(currentNode.GetText());
// 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);
ArrayList runs = new ArrayList();
// 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);
}
DocumentBuilder builder = new DocumentBuilder((Document)e.MatchNode.Document);
//Move the cursor to the matched text and insert table
builder.MoveTo((Run)runs[0]);
Table table = builder.StartTable();
// Insert a cell
builder.InsertCell();
builder.Write("This is row 1 cell 1");
// Insert a cell
builder.InsertCell();
builder.Write("This is row 1 cell 2");
builder.EndRow();
// Insert a cell
builder.InsertCell();
builder.Write("This is row 2 cell 1");
// Insert a cell
builder.InsertCell();
builder.Write("This is row 2 cell 2");
builder.EndRow();
builder.EndTable();
// remove run nodes
foreach (Run run in runs)
run.Remove();
// 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;
}
}