Sometimes, we can find that a cell of one table isn’t filled with text or number but a small table. Generally speaking, the nested table shows items which are children of data in the cell. For example, cell 1 is data about one product which has three models. We can insert a nested table with models information in cell 1. In this post, I will show how to insert nested table in PDF by using VB.NET.
In my example, I will show a table about vendor information. The first vendor includes several products. So, there will be a nested table insert in first vendor name cell. Besides inserting it, I will set format for the main table and calculate how many vendors a country has.
The following steps show details.
Main Coding:
Imports System.Text
Imports System.Data.OleDb
Imports System.Drawing
Imports Spire.Pdf
Imports Spire.Pdf.Graphics
Imports Spire.Pdf.Grid
Module Grid
Sub Main()
‘Create
Dim doc As New PdfDocument()
‘Margin
Dim unitCvtr As New PdfUnitConvertor()
Dim margin As New PdfMargins()
margin.Top = unitCvtr.ConvertUnits(2.54F, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point)
margin.Bottom = margin.Top
margin.Left = unitCvtr.ConvertUnits(3.17F, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point)
margin.Right = margin.Left
‘Add Page
Dim page As PdfPageBase = doc.Pages.Add(PdfPageSize.A4, margin, PdfPageRotateAngle.RotateAngle0, PdfPageOrientation.Landscape)
Dim y As Single = 20
Dim x1 As Single = page.Canvas.ClientSize.Width
‘Title
Dim brush1 As PdfBrush = PdfBrushes.DarkBlue
Dim font1 As New PdfTrueTypeFont(New Font(“Calibri”, 16.0F, FontStyle.Regular), True)
Dim format1 As New PdfStringFormat(PdfTextAlignment.Center)
page.Canvas.DrawString(“Vendor List”, font1, brush1, page.Canvas.ClientSize.Width / 2, y, format1)
y = y + font1.MeasureString(“Vendor List”, format1).Height
y = y + 5
‘Data
Dim data() As String = {“VendorName;Address1;City;Country”, “Cacor Corporation;161 Southfield Rd;Southfield;U.S.A.;”, “Underwater;50 N 3rd Street;Indianapolis;U.S.A.;”, “J.W. Luscher Mfg.;65 Addams Street;Berkely;U.S.A.;”, “Scuba Professionals;3105 East Brace;Rancho Dominguez;U.S.A.;”, “Divers’ Supply Shop;5208 University Dr;Macon;U.S.A.;”, “Techniques;52 Dolphin Drive;Redwood City;U.S.A.;”, “Perry Scuba;3443 James Ave;Hapeville;U.S.A.;”, “Beauchat, Inc.;45900 SW 2nd Ave;Ft Lauderdale;U.S.A.;”, “Amor Aqua;42 West 29th Street;New York;U.S.A.;”}
Dim grid As New Spire.Pdf.Grid.PdfGrid()
grid.Style.CellPadding = New PdfPaddings(1, 1, 1, 1)
‘Table Header
Dim header() As String = data(0).Split(“;”c)
grid.Columns.Add(header.Length)
Dim width As Single = page.Canvas.ClientSize.Width – (grid.Columns.Count + 1)
grid.Columns(0).Width = width * 0.25F
grid.Columns(1).Width = width * 0.25F
grid.Columns(2).Width = width * 0.25F
grid.Columns(3).Width = width * 0.15F
Dim headerRow As PdfGridRow = grid.Headers.Add(1)(0)
headerRow.Style.Font = New PdfTrueTypeFont(New Font(“Calibri”, 14.0F, FontStyle.Bold), True)
headerRow.Style.TextBrush = PdfBrushes.White
headerRow.Style.BackgroundBrush = PdfBrushes.LimeGreen
For i As Integer = 0 To header.Length – 1
headerRow.Cells(i).Value = header(i)
headerRow.Cells(i).StringFormat = New PdfStringFormat(PdfTextAlignment.Center, PdfVerticalAlignment.Middle)
Next i
‘Data Format
Dim groupByCountry As New Dictionary(Of String, Integer)()
For r As Integer = 1 To data.Length – 1
Dim row As PdfGridRow = grid.Rows.Add()
row.Style.Font = New PdfTrueTypeFont(New Font(“Calibri”, 12.0F), True)
row.Style.TextBrush = PdfBrushes.DarkCyan
row.Style.BackgroundBrush = PdfBrushes.AliceBlue
Dim rowData() As String = data(r).Split(“;”c)
For c As Integer = 0 To rowData.Length – 2
row.Cells(c).Value = rowData(c)
row.Cells(c).StringFormat = New PdfStringFormat(PdfTextAlignment.Center, PdfVerticalAlignment.Middle)
If c = 3 Then
If groupByCountry.ContainsKey(rowData(c)) Then
groupByCountry(rowData(c)) = groupByCountry(rowData(c)) + 1
Else
groupByCountry(rowData(c)) = 1
End If
End If
Next c
Next r
Dim totalAmount As New StringBuilder()
For Each country As KeyValuePair(Of String, Integer) In groupByCountry
totalAmount.AppendFormat(“{0}:” & vbTab & “{1}”, country.Key, country.Value)
totalAmount.AppendLine()
Next country
Dim totalAmountRow As PdfGridRow = grid.Rows.Add()
totalAmountRow.Style.BackgroundBrush = PdfBrushes.WhiteSmoke
totalAmountRow.Cells(0).Value = “Total Amount”
totalAmountRow.Cells(0).Style.Font = New PdfTrueTypeFont(New Font(“Calibri”, 12.0F, FontStyle.Bold), True)
totalAmountRow.Cells(0).Style.TextBrush = PdfBrushes.Red
totalAmountRow.Cells(0).StringFormat = New PdfStringFormat(PdfTextAlignment.Center, PdfVerticalAlignment.Middle)
totalAmountRow.Cells(1).ColumnSpan = 3
totalAmountRow.Cells(1).Value = totalAmount.ToString()
totalAmountRow.Cells(1).Style.Font = New PdfTrueTypeFont(New Font(“Calibri”, 12.0F, FontStyle.Bold), True)
totalAmountRow.Cells(1).Style.TextBrush = PdfBrushes.Red
totalAmountRow.Cells(1).StringFormat = New PdfStringFormat(PdfTextAlignment.Center, PdfVerticalAlignment.Middle)
‘Append Product List
Dim productList As New Spire.Pdf.Grid.PdfGrid()
productList.Style.Font = New PdfTrueTypeFont(New Font(“Calibri”, 12.0F), True)
Using conn As New OleDbConnection()
conn.ConnectionString = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\work\My Documents\demo.mdb”
Dim command As New OleDbCommand()
command.CommandText = ” select p.Description “ & ” from vendors v “ & “ inner join parts p “ & “ on v.VendorNo = p.VendorNo “ & ” where v.VendorName = ‘Cacor Corporation’”
command.Connection = conn
Using dataAdapter As New OleDbDataAdapter(command)
Dim dataTable As New DataTable()
dataAdapter.Fill(dataTable)
productList.DataSource = dataTable
End Using
End Using
productList.Headers(0).Cells(0).Value = “Cacor Corporation”
productList.Headers(0).Cells(0).Style.Font = New PdfTrueTypeFont(New Font(“Calibri”, 12.0F, FontStyle.Regular), True)
productList.Headers(0).Cells(0).Style.Borders.All = New PdfPen(New PdfTilingBrush(New SizeF(1, 1)), 0)
productList.Style.TextBrush = PdfBrushes.DarkCyan
grid.Rows(0).Cells(0).Value = productList
grid.Rows(0).Cells(0).StringFormat.Alignment = PdfTextAlignment.Left
‘Layout
Dim result As PdfLayoutResult = grid.Draw(page, New PointF(0, y))
y = y + result.Bounds.Height + 5
‘Save
doc.SaveToFile(“Grid.pdf”)
doc.Close()
‘Launch
Process.Start(“Grid.pdf”)
End Sub
End Module
Result Shown by Following:

______________________________________________________________________________________________
Click Here to Learn more about Spire.PDF
Click Here to Download Spire.PDF