我有以下例程将DataBable转换为纯文本以便在电子邮件中显示。但是,从包含的布局图像中可以看出,标题行与列数据不一致。有没有办法让它正确对齐?
Function MakeHtmlEmailFromDataTable(dt As DataTable) As System.Text.StringBuilder
Dim retVal As String = ""
Dim html As New System.Text.StringBuilder
For Each col As System.Data.DataColumn In dt.Columns
html.Append(col.Caption & vbTab & vbTab)
Next
For Each dr As System.Data.DataRow In dt.Rows
For i = 0 To dr.ItemArray.Length - 1
html.Append(dr.ItemArray(i).ToString & vbTab & vbTab & vbTab & vbTab)
Next
html.Append(vbTab & vbCrLf)
Next
Return html
End Function
答案 0 :(得分:0)
我注意到的第一件事是标题中的列之间有两个标签,数据中的列之间有四个标签。
但更深入的是,纯文本不会自动遵循制表位来制作列。解决此问题的唯一方法是,您可以了解数据的长度,相对于制表位的持续时间。这意味着您遇到了一个大问题,因为可以在不同系统上甚至在同一系统内的不同应用程序中以不同方式设置制表位。即使您对数据宽度有一个完美的了解,具有奇怪的制表位大小的情况也会让您失望。制表机制有任何机会的唯一方法是使用固定宽度字体,如果您的数据长度完全相同,或者您可以保证在哪个操作系统上使用哪个电子邮件客户端。
您唯一真正的机会是使用一个实际上允许您定义列的系统,例如使用代码中的名称建议的html:
Function MakeHtmlEmailFromDataTable(dt As DataTable) As System.Text.StringBuilder
Dim html As New System.Text.StringBuilder("<table><thead><tr>")
For Each col As System.Data.DataColumn In dt.Columns
html.AppendFormat("{0}{1}{2}", "<th>", col.Caption, "</th>")
Next
html.AppendLine("</tr></thead><tbody>")
For Each dr As System.Data.DataRow In dt.Rows
html.Append("<tr>")
For i = 0 To dr.ItemArray.Length - 1
html.AppendFormat("{0}{1}{2}", "<td>", dr.ItemArray(i).ToString(), "</td>")
Next
html.AppendLine("</tr>")
Next
html.AppendLine("</tbody></table>")
Return html
End Function
答案 1 :(得分:0)
如果数据不是太多,可以循环两次。一次获得最大col大小(进入数组),然后填充html。然后对于标题,你基本上做一个mid(使标题大小完全相同)。然后Header和列都只有一个单独的。