设置嵌套表 [英] aspose nested tables

查看:102
本文介绍了设置嵌套表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

正在研究 ASPOSE.Words .一切正常,最后一件事仍然存在.问题是如何在表格内部渲染表格?在嵌套表中,文档样本数据与演示文稿紧密相关层.我需要分离数据层和表示层.这么少的测试在这里:

Doing research for ASPOSE.Words. Everything works fine just last thing remains. Question is how to render table inside table? In the Nested table documentation sample data is tightly coupled with presentation layer. I need separation of data and presentation layer. So little test here:

[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中,则每个表将呈现多个时间:

If both tables are stored in DataSet.Tables then it renders mutiple times per each table:

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

推荐答案

对表示层和数据层代码执行所需的重构,如下所示:

Perform required re-factoring to both the presentation layer and data layer codes as follows:

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...
}

这将提供与您期望的完全相同的输出,例如:

This gives the exact same output as you desired, that is like:

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的开发人员.

My name is Iqbal and I am developer evangelist at Aspose.

这篇关于设置嵌套表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆