Creating merge table

Hi,

I have to create a table structure like below using document builder,

merge document.docx (14.0 KB)

the column number is dynamic and can have more or less start and end columns with different zones.
Can you please help me to create it?

Thank you

@Gptrnt You should use HorizontalMerge and VerticalMerge properties to configure cell merge in Aspose.Words. Please see our documentation to learn more about working with merged cells:
https://docs.aspose.com/words/net/working-with-merged-cells/

I have go through the document. but I am not sure where I have to give the merge option. I am attaching a sample code MergeCell.zip (1.5 KB) . Can you please help me where I have to add the merging code.

Thank you

@Gptrnt Since there is no access to your data, I have created a dummy code that produces the required table:

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

Table table = builder.startTable();
// Build table header
builder.insertCell();
builder.getCellFormat().setWidth(55);
builder.getCellFormat().setVerticalMerge(CellMerge.FIRST);
builder.getCellFormat().getShading().setBackgroundPatternColor(Color.GRAY);
builder.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);
builder.write("SlNo");
builder.insertCell();
builder.write("Title");
builder.insertCell();
builder.getCellFormat().setVerticalMerge(CellMerge.NONE);
builder.write("Title");
builder.insertCell();
builder.write("End Time");
builder.insertCell();
builder.write("Start Time");
builder.insertCell();
builder.write("End Time");
builder.insertCell();
builder.write("Start Time");
builder.insertCell();
builder.write("End Time");
builder.endRow();
// Another row of table header.
builder.insertCell();
builder.getCellFormat().setVerticalMerge(CellMerge.PREVIOUS);
builder.insertCell();
builder.getCellFormat().setVerticalMerge(CellMerge.PREVIOUS);
builder.insertCell();
builder.getCellFormat().setVerticalMerge(CellMerge.NONE);
builder.getCellFormat().setHorizontalMerge(CellMerge.FIRST);
builder.write("IST");
builder.insertCell();
builder.getCellFormat().setHorizontalMerge(CellMerge.PREVIOUS);
builder.insertCell();
builder.getCellFormat().setHorizontalMerge(CellMerge.FIRST);
builder.write("ET");
builder.insertCell();
builder.getCellFormat().setHorizontalMerge(CellMerge.PREVIOUS);
builder.insertCell();
builder.getCellFormat().setHorizontalMerge(CellMerge.FIRST);
builder.write("BST");
builder.insertCell();
builder.getCellFormat().setHorizontalMerge(CellMerge.PREVIOUS);
builder.endRow();

// Table body.
for (int i = 0; i < 3; i++)
{
    for (int j = 0; j < 8; j++)
    {
        builder.insertCell();
        builder.getCellFormat().setHorizontalMerge(CellMerge.NONE);
        builder.getCellFormat().getShading().setBackgroundPatternColor(Color.WHITE);
    }
    builder.endRow();
}
builder.endTable();

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

out.docx (7.5 KB)

Hi,

The above code is working fine with the given scenario. But if any column is added after the merged column, then the data column is not coming and the merged cell is also incorrect. I need a dynamic code so I have updated the code. I am attaching the updated code MergeCell2.zip (2.9 KB). its output is merge_table.docx (13.2 KB). My expected output is expected_out.docx (13.2 KB) . Please help me to solve this issue.

Thank you

@Gptrnt You could use the following code:

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

String[] zones = {"BMT", "ET", "Y"};
    	
Table table = builder.startTable();
// Build first table header row
builder.insertCell();
builder.getCellFormat().setWidth(55);
builder.getCellFormat().setVerticalMerge(CellMerge.FIRST);
builder.getCellFormat().getShading().setBackgroundPatternColor(Color.red);
builder.getParagraphFormat().setAlignment(ParagraphAlignment.LEFT);
builder.write("Sl No.");
builder.insertCell();
builder.write("Title");
for(int i = 0; i < zones.length; i++) {
    builder.insertCell();
    builder.getCellFormat().setVerticalMerge(CellMerge.NONE);
    builder.write("Start Time");
    builder.insertCell();
    builder.write("End Time");
}
builder.insertCell();
builder.getCellFormat().setVerticalMerge(CellMerge.FIRST);
builder.write("Duration");
builder.endRow();
// Build second table header row
builder.insertCell();
builder.getCellFormat().setVerticalMerge(CellMerge.PREVIOUS);
builder.insertCell();
builder.getCellFormat().setVerticalMerge(CellMerge.PREVIOUS);
for(int i = 0; i < zones.length; i++) {
    builder.insertCell();
    builder.getCellFormat().setVerticalMerge(CellMerge.NONE);
    builder.getCellFormat().setHorizontalMerge(CellMerge.FIRST);
    builder.write(zones[i]);
    builder.insertCell();
    builder.getCellFormat().setHorizontalMerge(CellMerge.PREVIOUS);
}    	
builder.insertCell();
builder.getCellFormat().setVerticalMerge(CellMerge.PREVIOUS);
builder.getCellFormat().setHorizontalMerge(CellMerge.NONE);
builder.endRow();

// Table body.
for (int i = 0; i <= 4; i++) {
    builder.insertCell();
    builder.getCellFormat().setHorizontalMerge(CellMerge.NONE);
    builder.getCellFormat().setVerticalMerge(CellMerge.NONE);
    builder.getCellFormat().getShading().setBackgroundPatternColor(Color.WHITE);
    builder.write(String.valueOf(i));
    builder.insertCell();
    builder.write("Test " + String.valueOf(i));
    for (int j = 0; j < zones.length; j++) {
        builder.insertCell();
        builder.write("Start Time");
        builder.insertCell();
        builder.write("End Time");	
    }
    builder.insertCell();
    builder.write("Duration");	   
    builder.endRow();
}
builder.endTable();

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