Vb.net 在纯文本电子邮件中美化表格布局

Vb.net 在纯文本电子邮件中美化表格布局,vb.net,winforms,Vb.net,Winforms,我有以下程序将数据表转换为纯文本,以便在电子邮件中显示。但是,从包含的布局图像中可以看到,标题行与列数据不对齐。有没有办法让它正确对齐 Function MakeHtmlEmailFromDataTable(dt As DataTable) As System.Text.StringBuilder Dim retVal As String = "" Dim html As New System.Text.StringBuilder For Each col As Sys

我有以下程序将数据表转换为纯文本,以便在电子邮件中显示。但是,从包含的布局图像中可以看到,标题行与列数据不对齐。有没有办法让它正确对齐

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


我注意到的第一件事是,在标题的列之间有两个选项卡,在数据的列之间有四个选项卡

但更深入地说,纯文本将不会自动尊重制表位来生成列。解决此问题的唯一方法是,如果您知道数据的长度,即相对于制表位的长度。这意味着您有一个大问题,因为在不同的系统上,甚至在同一系统中的不同应用程序中,制表位可以设置不同。即使您对数据宽度有一个完美的理解,但使用奇怪的制表位大小的情况也会让您感到厌烦。制表符停止机制唯一可能的方法是使用固定宽度的字体,如果您的数据长度完全相同,或者您可以保证在什么操作系统上使用什么样的电子邮件客户端

您唯一真正的机会是使用一个允许您定义列的系统,例如使用代码中名称建议的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
函数将HtmleMailFromDataTable(dt作为DataTable)作为System.Text.StringBuilder
将html设置为新System.Text.StringBuilder(“”)
对于每个列,作为dt.列中的System.Data.DataColumn
html.AppendFormat(“{0}{1}{2}”,”,列标题“)
下一个
html.AppendLine(“”)
对于dt.行中的每个dr As System.Data.DataRow
html.Append(“”)
对于i=0到dr.ItemArray.Length-1
AppendFormat(“{0}{1}{2}”,“”,dr.ItemArray(i.ToString(),“”)
下一个
html.AppendLine(“”)
下一个
html.AppendLine(“”)
返回html
端函数

如果数据不太多,可以循环两次。一次获取最大列大小(放入数组),下一次填充html。然后,对于页眉,基本上要进行mid(使页眉大小完全相同)。然后,标题和列之间都只有一种字体。

可以尝试使用另一种字体-courier new。我忘了,但固定型或非固定型-something@AnthonyHomelol今天你回复了多少个线程,伙计,你的手指一定快流血了lol它要去网吧发邮件,以避免身份验证问题,所以不要认为我可以控制fontYeah-等待DNN完成下载需要测试从v5到V7的升级。令人兴奋的…@AnthonyHorne很久没有使用dnn了。我想问的是,你能不能从dt信息中获取列大小,这样可以使其格式更好,因为如果我只是去标签,它就不会正确流动。你有没有看过使用SSRS(免费版本)的情况。你可以做一些非常好的事情,包括以PDF、excel、plain、,等。Coehoom是的,因为我不知道如何设置宽度,如果我没有这些标签,它们都聚集在一起,这是我要问的问题,如何更好地布局根据列大小和行宽度值,它只能是纯文本,因为它被张贴到电子邮件网站服务添加了一些新的信息,我的答案,你应该阅读。另外:任何值得使用的电子邮件服务都支持html消息。Coehoom我试过了,但开发人员的电子邮件上没有html标志,因为我们提供给运行在tills上的xp客户端