2013-03-05 119 views
1

做研究ASPOSE.Words。一切正常,只剩最后一件事了。问题是如何在表格内渲染表格?在Nested table文档中,示例数据与表示层紧密结合。我需要分离数据和表示层。所以,在这里小测试:aspose嵌套表

[Test] 
public void CreateDocumentRecurentalTableInTableTest() 
{ 
    // Structural items are in [], values/data in {} 
    //GIVEN (presentation layer) 
    const string FileName = "_6CreateDocumentRecurentalTableInTableTest.txt"; 
    var doc = new Document(); 
    var builder = new DocumentBuilder(doc); 
    builder.Writeln("TEST -- START"); 

    builder.InsertField(@"MERGEFIELD TableStart:[MyTable] MERGEFORMAT"); 

    builder.InsertField(@"MERGEFIELD [MyTableCol1] \* MERGEFORMAT"); 
    builder.InsertField(@"MERGEFIELD [MyTableCol2] \* MERGEFORMAT"); 

    builder.InsertField(@"MERGEFIELD TableStart:[SubTable] MERGEFORMAT"); 

    builder.InsertField(@"MERGEFIELD [SubTable.Col1] \* MERGEFORMAT"); 
    builder.InsertField(@"MERGEFIELD [SubTable.Col2] \* MERGEFORMAT"); 

    builder.InsertField(@"MERGEFIELD TableEnd:[SubTable] MERGEFORMAT"); 
    builder.InsertField(@"MERGEFIELD TableEnd:[MyTable] MERGEFORMAT"); 

    builder.Writeln("\nTEST -- END"); 

    //WHEN (Data layer) 
    using (var dt2 = new DataTable("[SubTable]")) 
    { 
     dt2.Columns.Add("[SubTable.Col1]"); 
     dt2.Columns.Add("[SubTable.Col2]"); 

     dt2.Rows.Add(" {SubTable.Row1.Cont1} ", " {SubTable.Row1.Cont2} "); 
     dt2.Rows.Add(" {SubTable.Row2.Cont1} ", " {SubTable.Row2.Cont2} "); 
     dt2.Rows.Add(" {SubTable.Row3.Cont1} ", " {SubTable.Row3.Cont2} "); 

     using (var dt = new DataTable("[MyTable]")) 
     { 
      dt.Columns.Add("[MyTableCol1]"); 
      dt.Columns.Add("[MyTableCol2]"); 

      dt.Rows.Add(" {MyTable.firstRow} ", dt2); 

      doc.MailMerge.ExecuteWithRegions(dt); 
      doc.Save(FileName, SaveFormat.Text); 
     } 
    } 

    //THEN 
    //Assert... 
} 

获得结果:

TEST -- START 
{MyTable.firstRow} [SubTable]«TableStart:[SubTable]»«[SubTable.Col1]»«[SubTable.Col2]»«TableEnd:[SubTable]» 
TEST -- END 

我想实现:

TEST -- START 
{MyTable.firstRow} {SubTable.Row1.Cont1} {SubTable.Row1.Cont2} 
        {SubTable.Row2.Cont1} {SubTable.Row2.Cont2} 
        {SubTable.Row3.Cont1} {SubTable.Row3.Cont2} 
{MyTable.nextRow} 
TEST -- END 

如果两个表存储在DataSet.Tables那么它呈现多发时期每个表格:

TEST -- START 
{MyTable.firstRow} {SubTable.Row1.Cont1} {SubTable.Row1.Cont2} 
{MyTable.firstRow} {SubTable.Row2.Cont1} {SubTable.Row2.Cont2} 
{MyTable.firstRow} {SubTable.Row3.Cont1} {SubTable.Row3.Cont2} 
{MyTable.nextRow} {SubTable.Row1.Cont1} {SubTable.Row1.Cont2} 
{MyTable.nextRow} {SubTable.Row2.Cont1} {SubTable.Row2.Cont2} 
{MyTable.nextRow} {SubTable.Row3.Cont1} {SubTable.Row3.Cont2} 
TEST -- END 

回答

1

执行所需的重新分解到两个表现层和数据层的代码如下:

public void CreateDocumentRecurentalTableInTableTest() 
{ 

// Structural items are in [], values/data in {} 
//GIVEN (presentation layer) 
//const string FileName = "_6CreateDocumentRecurentalTableInTableTest.txt"; 

var doc = new Document(); 
var builder = new DocumentBuilder(doc); 

builder.Writeln("TEST -- START"); 
builder.InsertField(@"MERGEFIELD TableStart:[MyTable] MERGEFORMAT"); 
builder.InsertField(@"MERGEFIELD [MyTableCol1] \* MERGEFORMAT"); 
builder.InsertField(@"MERGEFIELD [MyTableCol2] \* MERGEFORMAT"); 
builder.Writeln(); 

builder.InsertField(@"MERGEFIELD TableStart:[SubTable] MERGEFORMAT"); 
builder.InsertField(@"MERGEFIELD [SubTable.Col1] \* MERGEFORMAT"); 
builder.InsertField(@"MERGEFIELD [SubTable.Col2] \* MERGEFORMAT"); 
builder.InsertField(@"MERGEFIELD TableEnd:[SubTable] MERGEFORMAT"); 
builder.Writeln(); 

builder.InsertField(@"MERGEFIELD TableEnd:[MyTable] MERGEFORMAT"); 

builder.Writeln("\nTEST -- END"); 

//WHEN (Data layer) 
DataSet ds = new DataSet(); 

var dt = new DataTable("[MyTable]"); 
dt.Columns.Add("[MyTableCol1]"); 
dt.Columns.Add("[MyTableCol2]"); 
dt.Columns.Add("[Id]"); 

dt.Rows.Add(" {MyTable.firstRow} ", "", 0); 
dt.Rows.Add(" {MyTable.nextRow} ", "", 1); 

var dt2 = new DataTable("[SubTable]"); 
dt2.Columns.Add("[SubTable.Col1]"); 
dt2.Columns.Add("[SubTable.Col2]"); 
dt2.Columns.Add("[Id]"); 

dt2.Rows.Add(" {SubTable.Row1.Cont1} ", " {SubTable.Row1.Cont2} ", 0); 
dt2.Rows.Add(" {SubTable.Row2.Cont1} ", " {SubTable.Row2.Cont2} ", 0); 
dt2.Rows.Add(" {SubTable.Row3.Cont1} ", " {SubTable.Row3.Cont2} ", 0); 

ds.Tables.Add(dt); 
ds.Tables.Add(dt2); 

ds.Relations.Add("MyRelation", dt.Columns[2], dt2.Columns[2], true); 

doc.MailMerge.CleanupOptions = MailMergeCleanupOptions.RemoveUnusedRegions | MailMergeCleanupOptions.RemoveEmptyParagraphs; 

doc.MailMerge.ExecuteWithRegions(ds); 

doc.Save(@"C:\Temp\\out.docx"); 

//THEN 

//Assert... 
} 

按你们的要求这给了完全相同的输出,即是这样的:

TEST -- START 
{MyTable.firstRow} 
    {SubTable.Row1.Cont1} {SubTable.Row1.Cont2} 
    {SubTable.Row2.Cont1} {SubTable.Row2.Cont2} 
    {SubTable.Row3.Cont1} {SubTable.Row3.Cont2} 
{MyTable.nextRow} 
TEST -- END 

我名字是Iqbal,我是Aspose的开发者传道人。