Hi,
I am trying a proof of concept to convince my client to purchase this tool for document generation. I am stuck up with the below issue.
I have a requirement where i have to generate a table dynamically. No of Rows and Columns in the table may vary in the run time. Based on the cell width and page width i’ve to split the tables also. Below are the two possible scenarios. I’ve the entire content of the table in a datatable. I am not able to decide upon the approach. Let me know the best approach for this?
Scenario 1:
My table has only 3 columns and hence it fits into the page width.
Performance Option - Col 1 |
Col 2 |
Col 3 |
Base unit |
|
|
Nameplate unit kW (kW) |
411.00 |
411.00 |
Nameplate RLA (A) |
708.00 |
708.00 |
Scenario 2:
My table has 6 columns but only 4 columns fit into the page width and hence my table should be split into two tables
- Table 1 - with cols 1,2,3,4
- Table 2 - with cols 1,5,6
Note: Column 1 should be repeated in both the tables
Performance Option - Col 1 |
Col 2 |
Col 3 |
Col 4 |
Base unit |
|
|
|
Nameplate unit kW (kW) |
4o1.00 |
411.00 |
422.0 |
Nameplate RLA (A) |
708.00 |
718.00 |
789.0 |
Performance Option - Col 1 |
Col 5 |
Col 6 |
Base unit |
|
|
Nameplate unit kW (kW) |
431.00 |
441.00 |
Nameplate RLA (A) |
728.00 |
738.00 |
Thanks and Regards,
SakthiVenkatesh.
Hi
Thanks for your interesting inquiry. I think that you can achieve this using Aspose.Words. I create code example for you.
public void TestInsertTable_100821()
{
// Create table with data
DataTable table = new DataTable();
table.Columns.Add("Col1");
table.Columns.Add("Col2");
table.Columns.Add("Col3");
table.Columns.Add("Col4");
table.Columns.Add("Col5");
table.Columns.Add("Col6");
for (int i = 0; i < 10; i++)
{
DataRow row = table.NewRow();
row[0] = "Nameplate unit kW (kW)";
row[1] = i.ToString() + "0";
row[2] = i.ToString() + "1";
row[3] = i.ToString() + "2";
row[4] = i.ToString() + "3";
row[5] = i.ToString() + "4";
table.Rows.Add(row);
}
// create new document
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// insert table
InsertTable_100746(builder, table);
// save document
doc.Save(@"322_100821_sakthivenkatesh\out.doc");
}
void InsertTable_100746(DocumentBuilder builder, DataTable table)
{
// get page width
PageSetup pageSetup = builder.CurrentSection.PageSetup;
double width = pageSetup.PageWidth - pageSetup.LeftMargin - pageSetup.RightMargin;
// get count of clumns for table
int counter = 4;
double firstColunm = 0.5;
if (counter > table.Columns.Count)
{
counter = table.Columns.Count;
}
// start table
builder.StartTable();
// insert header
builder.PushFont();
builder.Font.Bold = true;
for (int j = 0; j < counter; j++)
{
builder.InsertCell();
if (j == 0)
{
builder.CellFormat.Width = width * firstColunm;
}
else
{
builder.CellFormat.Width = width * (1 - firstColunm) / (counter - 1);
}
builder.Write(table.Columns[j].ColumnName);
}
builder.PopFont();
builder.EndRow();
// insert rows
foreach (DataRow row in table.Rows)
{
for (int i = 0; i < counter; i++)
{
builder.InsertCell();
if (i == 0)
{
builder.CellFormat.Width = width * firstColunm;
}
else
{
builder.CellFormat.Width = width * (1 - firstColunm) / (counter - 1);
}
builder.Write(row[i].ToString());
}
builder.EndRow();
}
builder.EndTable();
builder.InsertBreak(BreakType.ParagraphBreak);
// remove inserted columns from DataTable
for (int j = 1; j < counter; j++)
{
table.Columns.Remove(table.Columns[1].ColumnName);
}
// Call this method again if table has columns.
if (table.Columns.Count != 1)
{
InsertTable_100746(builder, table);
}
}
I hope that this code will help you to solve this task.
Best regards.
Hi,
Thanks for the quick response. I appreciate your help.
I’ve one other issue. Currently you have assumed that maximum of 4 columns can be put in a table. [int counter = 4;]. But we cannot hardcode the max no of columns in a table. Width of a cell will be based on the content of the cell.
For example, look at the below two scenarios where one table has just 2 columns [one of the cell value is lengthier] and the other has 6 columns [all the cell values are smaller]. So we should dynamically set the cell width based on its content.
Is there a way to achieve this?
Table with only two columns [less than 4 columns]:
Label2 |
E1 |
General |
|
Unit size (Number) |
250 |
Unit type Pressure Equi (No) |
Pressure code CE Directive (Pressure Equipment) |
Refrigerant (Number) |
R407C |
Table with six columns [greater than 4 columns]:
Label2 |
E1 |
E2 |
E3 |
E4 |
E5 |
General |
|
|
|
|
|
Unit size |
250 |
300 |
301 |
500 |
100 |
Unit type |
STANDARD |
SUPER_QUIET |
SUPER_QUIET |
SUPER_QUIET |
SUPER_QUIET |
Refrigerant |
R407C |
R407C |
R408C |
R408C |
R417C |
Cooling |
63.8 |
77.5 |
67.2 |
77.5 |
87.2 |
Thanks,
SakthiVenkatesh.
Hi
Thanks for your inquiry. I think that you should loop through the all rows in your DataTable and calculate max length of the content in the every column. Then you can calculate amount and width of columns in the word table.
Best regards.
Hi,
Sorry for the late response. Got stuck up with work.
Thanks for the suggestion. I will check out and let you know.
Regards,
SakthiVenkatesh.