Reputation: 85
I am using a StringBuilder
to create a HTML file from my DataTable
. The file is created but when I open it in the webbrowser I have to scroll all the way down to see the table. In other words there is a big blank page first with nothing at all.
Public Function ConvertToHtmlFile(ByVal myTable As DataTable) As String
Dim myBuilder As New StringBuilder
If myTable Is Nothing Then
Throw New System.ArgumentNullException("myTable")
Else
'Open tags and write the top portion.
myBuilder.Append("<html xmlns='http://www.w3.org/1999/xhtml'>")
myBuilder.Append("<head>")
myBuilder.Append("<title>")
myBuilder.Append("Page-")
myBuilder.Append("CLAS Archive")
myBuilder.Append("</title>")
myBuilder.Append("</head>")
myBuilder.Append("<body>")
myBuilder.Append("<br /><table border='1px' cellpadding='5' cellspacing='0' ")
myBuilder.Append("style='border: solid 1px Silver; font-size: x-small;'>")
myBuilder.Append("<br /><tr align='left' valign='top'>")
For Each myColumn As DataColumn In myTable.Columns
myBuilder.Append("<br /><td align='left' valign='top' style='border: solid 1px blue;'>")
myBuilder.Append(myColumn.ColumnName)
myBuilder.Append("</td><p>")
Next
myBuilder.Append("</tr><p>")
'Add the data rows.
For Each myRow As DataRow In myTable.Rows
myBuilder.Append("<br /><tr align='left' valign='top'>")
For Each myColumn As DataColumn In myTable.Columns
myBuilder.Append("<br /><td align='left' valign='top' style='border: solid 1px blue;'>")
myBuilder.Append(myRow(myColumn.ColumnName).ToString())
myBuilder.Append("</td><p>")
Next
Next
myBuilder.Append("</tr><p>")
End If
'Close tags.
myBuilder.Append("</table><p>")
myBuilder.Append("</body>")
myBuilder.Append("</html>")
'Get the string for return. myHtmlFile = myBuilder.ToString();
Dim myHtmlFile As String = myBuilder.ToString()
Return myHtmlFile
End Function
Upvotes: 0
Views: 1195
Reputation: 11773
FWIW I find using XElement to build Html pages easier than using strings.
Dim myHtml As XElement
'XML literals
' https://learn.microsoft.com/en-us/dotnet/standard/linq/xml-literals
'note lang and xmlns missing. see below
myHtml = <html>
<head>
<meta charset="utf-8"/>
<title>Put title here</title>
</head>
<body>
<table border="1px" cellpadding="5" cellspacing="0" style="border: solid 1px Silver; font-size: x-small;">
<thead>
<tr>
<th colspan="4">The table header</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</body>
</html>
'test. five rows, four columns
For r As Integer = 1 To 5
Dim tr As XElement = <tr align="left" valign="top"></tr>
For c As Integer = 1 To 4
Dim td As XElement
' XML embedded expressions
' https://learn.microsoft.com/en-us/dotnet/standard/linq/xml-literals#use-embedded-expressions-to-create-content
td = <td align="left" valign="top"><%= "Row:" & r.ToString & " Col:" & c.ToString %></td>
tr.Add(td)
Next
myHtml.<body>.<table>.<tbody>.LastOrDefault.Add(tr)
Next
Dim s As String = myHtml.ToString
'add lang and xmlns to string!!
s = s.Replace("<html>", "<html lang='en' xmlns='http://www.w3.org/1999/xhtml'>")
Upvotes: 1
Reputation: 39283
A sample HTML table (from the MDN docs):
<table>
<thead>
<tr>
<th colspan="2">The table header</th>
</tr>
</thead>
<tbody>
<tr>
<td>The table body</td>
<td>with two columns</td>
</tr>
</tbody>
</table>
If you study the "permitted content" within the various table elements (also dive deeper, for instance <tr>
), there cannot be a <br>
or <p>
between <table>
, <tr>
or <td>
elements, only table-related elements are allowed.
A <tr>
is already a row in the table, so you don't need breaks or paragraphs to move it to a separate row.
Upvotes: 1