Praveen Vinny
Praveen Vinny

Reputation: 2408

How to merge cells of a table created in MS Word using C#.NET?

I need to print a table to the Word document using C# code. I am facing issues with the alignment of text in the cells.

My code is as follows:

private void CreateTableInDoc()
    {
        object oMissing = System.Reflection.Missing.Value;
        object oEndOfDoc = "\\endofdoc";
        Microsoft.Office.Interop.Word._Application objWord;
        Microsoft.Office.Interop.Word._Document objDoc;
        objWord = new Microsoft.Office.Interop.Word.Application();
        objWord.Visible = true;
        objDoc = objWord.Documents.Add(ref oMissing, ref oMissing, ref oMissing, ref oMissing);

        int i = 0;
        int j = 0;
        Microsoft.Office.Interop.Word.Table objTable;
        Microsoft.Office.Interop.Word.Range wrdRng = objDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;

        string strText;
        objTable = objDoc.Tables.Add(wrdRng, 1, 1, ref oMissing, ref oMissing);
        objTable.Range.ParagraphFormat.SpaceAfter = 7;
        strText = "ABC Company";
        objTable.Rows[1].Range.Text = strText;
        strText = "";
        objTable.Rows[1].Range.Font.Bold = 1;
        objTable.Rows[1].Range.Font.Size = 24;
        objTable.Rows[1].Range.Font.Position = 1;
        objTable.Rows[1].Range.Font.Name = "Times New Roman";

        Microsoft.Office.Interop.Word.Table objNewTable;
        objNewTable = objDoc.Tables.Add(wrdRng, 3, 2, ref oMissing, ref oMissing);
        objNewTable.Rows[1].Range.Font.Name = "Times New Roman";
        objNewTable.Rows[1].Range.Font.Bold = 1;
        objNewTable.Rows[1].Range.Font.Italic = 1;
        objNewTable.Rows[1].Range.Font.Size = 14;
        objNewTable.Cell(1, 1).Range.Text = "Item Name";
        objNewTable.Cell(1, 2).Range.Text = "Price";

        for (i = 2; i <= 3; i++)
        {
            objNewTable.Rows[i].Range.Font.Name = "Times New Roman";
            objNewTable.Rows[i].Range.Font.Bold = 0;
            objNewTable.Rows[i].Range.Font.Italic = 0;
            objNewTable.Rows[i].Range.Font.Size = 12;
            for (j = 1; j <= 2; j++)
            {
                if (j == 1)
                    objNewTable.Cell(i, j).Range.Text = "Item " + (i-1);
                else
                    objNewTable.Cell(i, j).Range.Text = "Price of " + (i-1);
            }
        }

        try
        {
            objTable.Borders.Shadow = true;
            objNewTable.Borders.Shadow = true;
        }
        catch
        {
        }
        this.Close();
    }

The output that I get is as follows: enter image description here

My expected output is as follows: enter image description here

Upvotes: 5

Views: 17299

Answers (1)

Nick Carter
Nick Carter

Reputation: 116

You don't need to create another table for header. It can done by merging two cell for very first row and set the paragraph alignment for the cell individually. here is the code.

public void CreateTableInDoc()
{
    object oMissing = System.Reflection.Missing.Value;
    object oEndOfDoc = "\\endofdoc"; 
    Microsoft.Office.Interop.Word._Application objWord;
    Microsoft.Office.Interop.Word._Document objDoc;
    objWord = new Microsoft.Office.Interop.Word.Application();
    objWord.Visible = true;
    objDoc = objWord.Documents.Add(ref oMissing, ref oMissing, ref oMissing, ref oMissing);
    int i = 0;
    int j = 0;
    Microsoft.Office.Interop.Word.Table objTable;
    Microsoft.Office.Interop.Word.Range wrdRng = objDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;

    string strText;
    objTable = objDoc.Tables.Add(wrdRng, 4, 2, ref oMissing, ref oMissing);
    objTable.Range.ParagraphFormat.SpaceAfter = 7;
    strText = "ABC Company";
    objTable.Rows[1].Range.Text = strText;
    objTable.Rows[1].Range.Font.Bold = 1;
    objTable.Rows[1].Range.Font.Size = 24;
    objTable.Rows[1].Range.Font.Position = 1;
    objTable.Rows[1].Range.Font.Name = "Times New Roman";
    objTable.Rows[1].Cells[1].Merge(objTable.Rows[1].Cells[2]);
    objTable.Cell(1,1).Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;

    objTable.Rows[2].Range.Font.Italic = 1;
    objTable.Rows[2].Range.Font.Size = 14;
    objTable.Cell(2, 1).Range.Text = "Item Name";
    objTable.Cell(2, 2).Range.Text = "Price";
    objTable.Cell(2, 1).Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
    objTable.Cell(2, 2).Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;

    for (i = 3; i <= 4; i++)
    {
        objTable.Rows[i].Range.Font.Bold = 0;
        objTable.Rows[i].Range.Font.Italic = 0;
        objTable.Rows[i].Range.Font.Size = 12;
        for (j = 1; j <= 2; j++)
        {
            if (j == 1)
                objTable.Cell(i, j).Range.Text = "Item " + (i - 1);
            else
                objTable.Cell(i, j).Range.Text = "Price of " + (i - 1);
        }
    }

        try
        {
            objTable.Borders.Shadow = true;
            objTable.Borders.Shadow = true;
        }
        catch
        {
        }

}

Upvotes: 7

Related Questions