Dear,
We have a word template with nested regions. The nested regions are in a conditional based on a field in the parent region. I’ve attached both the template and the result. In the result you’ll see the nested table is duplicated. The nested table should not be duplicated. We use the following code to generate the pdf:
public void MssMergeMultipleTables(byte[] sslicFile, byte[] ssFile, RLTableRecordList ssTables, out byte[] ssMailMergeFile, out bool ssResult, out string ssResultMsg)
{
ssMailMergeFile = new byte[] { };
ssResult = false;
ssResultMsg = "";
try
{
setAsposeLicense(sslicFile);
MemoryStream m = new MemoryStream(ssFile);
Document doc = new Document(m);
doc.MailMerge.CleanupOptions = MailMergeCleanupOptions.RemoveContainingFields;
doc.MailMerge.CleanupOptions |= MailMergeCleanupOptions.RemoveEmptyParagraphs;
doc.MailMerge.CleanupOptions |= MailMergeCleanupOptions.RemoveUnusedRegions;
doc.MailMerge.CleanupOptions |= MailMergeCleanupOptions.RemoveUnusedFields;
DataSet ds = new DataSet();
foreach (RCTableRecord r in ssTables)
{
#region Table
DataTable dt = new DataTable(r.ssSTTable.ssName);
foreach (RCCellRecord c in r.ssSTTable.ssHeader.ssSTHeader.ssCells)
{
dt.Columns.Add(new DataColumn(c.ssSTCell.ssValue, typeof(string)));
}
// dt.Columns.Add(new DataColumn("id", typeof(string)));
// dt.Columns.Add(new DataColumn("name", typeof(string)));
foreach (RCRowRecord row in r.ssSTTable.ssRows)
{
DataRow dr = dt.NewRow();
foreach (RCCellRecord c in row.ssSTRow.ssCells)
{
dr[r.ssSTTable.ssHeader.ssSTHeader.ssCells[row.ssSTRow.ssCells.CurrentRowNumber].ssSTCell.ssValue] = c.ssSTCell.ssValue;
}
dt.Rows.Add(dr);
}
ds.Tables.Add(dt);
#endregion
#region NestedTable
// Nested table will only be added if all properties are set
if (
!string.IsNullOrEmpty(r.ssSTTable.ssNestedTable.ssSTNestedTable.ssName) &&
!r.ssSTTable.ssNestedTable.ssSTNestedTable.ssHeader.ssSTNestedTableHeader.ssCells.Empty &&
!r.ssSTTable.ssNestedTable.ssSTNestedTable.ssRows.Empty &&
!string.IsNullOrEmpty(r.ssSTTable.ssNestedTable.ssSTNestedTable.ssParentTableRelationColumnName) &&
!string.IsNullOrEmpty(r.ssSTTable.ssNestedTable.ssSTNestedTable.ssSubTableRelationColumnName)
)
{
var nesteddt = new DataTable(r.ssSTTable.ssNestedTable.ssSTNestedTable.ssName);
foreach (RCNestedTableCellRecord nestedc in r.ssSTTable.ssNestedTable.ssSTNestedTable.ssHeader.ssSTNestedTableHeader.ssCells)
{
nesteddt.Columns.Add(new DataColumn(nestedc.ssSTNestedTableCell.ssValue));
}
// nesteddt.Columns.Add(new DataColumn("id", typeof(string)));
// nesteddt.Columns.Add(new DataColumn("name", typeof(string)));
foreach (RCNestedTableRowRecord nestedrow in r.ssSTTable.ssNestedTable.ssSTNestedTable.ssRows)
{
var nesteddr = nesteddt.NewRow();
foreach (RCNestedTableCellRecord nestedc in nestedrow.ssSTNestedTableRow.ssCells)
{
nesteddr[r.ssSTTable.ssNestedTable.ssSTNestedTable.ssHeader.ssSTNestedTableHeader.ssCells[nestedrow.ssSTNestedTableRow.ssCells.CurrentRowNumber].ssSTNestedTableCell.ssValue] = nestedc.ssSTNestedTableCell.ssValue;
}
nesteddt.Rows.Add(nesteddr);
}
ds.Tables.Add(nesteddt);
ds.Relations.Add("TableRelation", dt.Columns[r.ssSTTable.ssNestedTable.ssSTNestedTable.ssParentTableRelationColumnName], nesteddt.Columns[r.ssSTTable.ssNestedTable.ssSTNestedTable.ssSubTableRelationColumnName], true);
}
#endregion
}
doc.MailMerge.UseNonMergeFields = true;
doc.MailMerge.ExecuteWithRegions(ds);
MemoryStream xmlStream = new MemoryStream();
doc.Save(xmlStream, Aspose.Words.SaveFormat.Docx);
xmlStream.Seek(0, SeekOrigin.Begin);
ssMailMergeFile = new byte[xmlStream.Length];
xmlStream.Read(ssMailMergeFile, 0, (int)xmlStream.Length);
ssResult = true;
ssResultMsg = "p1";
}
catch (Exception e)
{
ssResult = false;
ssResultMsg = e.Message;
}
}
Can anyone tell me what is wrong in the template?
Thanks, Sven