2

ASPOSE.Wordsの調査を行っています。すべてが正常に機能しますが、最後のものが残っています。質問は、テーブルをテーブル内にレンダリングする方法ですか?ネストされたテーブルのドキュメントでは、サンプルデータがプレゼンテーション層と緊密に結合されています。データとプレゼンテーション層を分離する必要があります。ここでのテストはほとんどありません。

[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
4

2 に答える 2

2

次のように、プレゼンテーション層とデータ層のコードの両方に必要なリファクタリングを実行します。

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 の開発者エバンジェリストです。

于 2013-04-01T11:02:17.720 に答える
0

つまり、データ テーブルをリンクする必要があります (RDBMS のように)。

要約:詳細はこちらをご覧ください

于 2013-03-07T15:59:15.693 に答える