I’m having an issue with Aspose. I have this string: “Prueba con salto de\nlinea” in a DataSet. When doing mailMerge.AddRegionData I get a square-like thing instead of a new line. See attachment for more details
Thanks for your inquiry. I cannot reproduce the problem on my side. I use the latest version of Aspose.Words (7.0.0) for testing. You can download it from here: https://releases.aspose.com/words/net
Best regards.
Hi
Thanks for your inquiry. Yes, of course, you can achieve this, but in this case the solution will be a little bit heavier. You should use ReplaceEvaluator to insert paragraph break, but first you need to split the matched Run. Please try using the code below:
Document doc = new Document(@"Test001\in.doc");
doc.Range.Replace(new Regex(Regex.Escape("[br]")), new ReplaceEvaluator(ReplaceEvaluatorInsertParagraphBreak), false);
doc.Save(@"Test001\out.doc");
///
/// This method is called by the Aspose.Words find and replace engine for each match.
/// This method inserts paragraph break at the location of the matched string.
///
private static ReplaceAction ReplaceEvaluatorInsertParagraphBreak(object sender, ReplaceEvaluatorArgs 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 removing.
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);
}
// Create Document Builder and insert paragraph break.
DocumentBuilder builder = new DocumentBuilder(e.MatchNode.Document as Document);
builder.MoveTo((Run) runs[runs.Count - 1]);
builder.Writeln();
// Now remove all runs in the sequence.
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;
}
///
/// Splits text of the specified run into two runs.
/// Inserts the new run just after the specified run.
///
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;
}