数据表到html表

Bra*_*nut 45 c# asp.net datatable

我有疑问,也许这里有人不介意帮助我.我可以说3个数据表,每个数据表都有以下列:

大小,数量,数量,持续时间

数据表和值的名称

LivingRoom
================
1
1
1
1
2
2
2
2

BathRoom
================
3
3
3
3
4
4
4
4

BedRoom
=================
5
5
5
5
6
6
6
6
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试构建一个html发票,我可以循环遍历所有数据表并输出以下html输出,非常基本:

<table>
<tr>
    <td>Area</td>
</tr>
<tr>
    <td>Living Room</td>
</tr>

<tr>
    <td>Size</td>
    <td>Quantity</td>
    <td>Amount</td>
    <td>Duration</td>
</tr>
<tr>
    <td>1</td>
    <td>1</td>
    <td>1</td>
    <td>1</td>
</tr>
<tr>
    <td>2</td>
    <td>2</td>
    <td>2</td>
    <td>2</td>
</tr>

<tr>
    <td>Area</td>
</tr>
<tr>
    <td>Bathroom</td>
</tr>

<tr>
    <td>Size</td>
    <td>Quantity</td>
    <td>Amount</td>
    <td>Duration</td>
</tr>
<tr>
    <td>3</td>
    <td>3</td>
    <td>3</td>
    <td>3</td>
</tr>
<tr>
    <td>4</td>
    <td>4</td>
    <td>4</td>
    <td>4</td>
</tr>

<tr>
    <td>Area</td>
</tr>
<tr>
    <td>Bedroom</td>
</tr>

<tr>
    <td>Size</td>
    <td>Quantity</td>
    <td>Amount</td>
    <td>Duration</td>
</tr>
<tr>
    <td>5</td>
    <td>5</td>
    <td>5</td>
    <td>5</td>
</tr>
<tr>
    <td>6</td>
    <td>6</td>
    <td>6</td>
    <td>6</td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)

所以几乎该区域将具有数据表的名称,然后在每个区域下循环该特定数据表并以该格式输出数据.我无法弄清楚循环逻辑或如何做到这一点,我最近几天一直在打破这个问题.也许我只是以错误的方式思考它,但我真的可以在这方面使用一些帮助.

Ome*_*dan 105

使用此功能:

    public static string ConvertDataTableToHTML(DataTable dt)
    {
        string html = "<table>";
        //add header row
        html += "<tr>";
        for(int i=0;i<dt.Columns.Count;i++)
            html+="<td>"+dt.Columns[i].ColumnName+"</td>";
        html += "</tr>";
        //add rows
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            html += "<tr>";
            for (int j = 0; j< dt.Columns.Count; j++)
                html += "<td>" + dt.Rows[i][j].ToString() + "</td>";
            html += "</tr>";
        }
        html += "</table>";
        return html;
    }
Run Code Online (Sandbox Code Playgroud)

  • 可以通过在第一个循环中使用“foreach”而不是普通的“for”循环来进一步改进代码。将使用“foreach(DataColumn col in dt.Columns)”,然后就可以执行“col.ColumnName”。 (3认同)
  • 我用HttpUtility.HtmlEncode和StringBuilder改进了代码.谢谢你的回答! (2认同)

Sum*_*jee 11

public static string toHTML_Table(DataTable dt)
{
    if (dt.Rows.Count == 0) return ""; // enter code here

    StringBuilder builder = new StringBuilder();
    builder.Append("<html>");
    builder.Append("<head>");
    builder.Append("<title>");
    builder.Append("Page-");
    builder.Append(Guid.NewGuid());
    builder.Append("</title>");
    builder.Append("</head>");
    builder.Append("<body>");
    builder.Append("<table border='1px' cellpadding='5' cellspacing='0' ");
    builder.Append("style='border: solid 1px Silver; font-size: x-small;'>");
    builder.Append("<tr align='left' valign='top'>");
    foreach (DataColumn c in dt.Columns)
    {
        builder.Append("<td align='left' valign='top'><b>");
        builder.Append(c.ColumnName);
        builder.Append("</b></td>");
    }
    builder.Append("</tr>");
    foreach (DataRow r in dt.Rows)
    {
        builder.Append("<tr align='left' valign='top'>");
        foreach (DataColumn c in dt.Columns)
        {
            builder.Append("<td align='left' valign='top'>");
            builder.Append(r[c.ColumnName]);
            builder.Append("</td>");
        }
        builder.Append("</tr>");
    }
    builder.Append("</table>");
    builder.Append("</body>");
    builder.Append("</html>");

    return builder.ToString();
}
Run Code Online (Sandbox Code Playgroud)

  • 有利于复制和粘贴,我添加了一些东西:1)html编码所有表值,例如:builder.Append(System.Web.HttpUtility.HtmlEncode(c.ColumnName))而不是builder.Append(c.ColumnName) )2)将title指定为函数参数 (2认同)
  • 关于p.1:c.ColumnName可能有一些需要在HTML中转义的非法字符.例如,如果字符串"<"将按原样放入HTML,则此类HTML将被破坏.它应该像"&lt;"一样进行转义.这可以使用System.Web.HttpUtility完成.关于p.2 - 这只是代码decaration,我认为最好将所需的标题传递给此方法,而不是使用新的GUID值生成任意标题.无论如何+1你的答案,因为有一个完整的HTML和StringBuilder比字符串连接更好的如此大量的字符串修改. (2认同)

Lok*_*rir 9

我已经看到一些值得注意的解决方案,正如Omer Eldan所说.但是接下来.ASP C#

using System.Data;
using System.Web.UI.HtmlControls;

public static Table DataTableToHTMLTable(DataTable dt, bool includeHeaders)
{
    Table tbl = new Table();
    TableRow tr = null;
    TableCell cell = null;

    int rows = dt.Rows.Count;
    int cols = dt.Columns.Count;

    if (includeHeaders)
    {
        TableHeaderRow htr = new TableHeaderRow();
        TableHeaderCell hcell = null;
        for (int i = 0; i < cols; i++)
        {
            hcell = new TableHeaderCell();
            hcell.Text = dt.Columns[i].ColumnName.ToString();
            htr.Cells.Add(hcell);
        }
        tbl.Rows.Add(htr);
    }

    for (int j = 0; j < rows; j++)
    {
        tr = new TableRow();
        for (int k = 0; k < cols; k++)
        {
            cell = new TableCell();
            cell.Text = dt.Rows[j][k].ToString();
            tr.Cells.Add(cell);
        }
        tbl.Rows.Add(tr);
    }
    return tbl;
}
Run Code Online (Sandbox Code Playgroud)

为何这个解决方案 因为您可以轻松地将其添加到面板,即:

panel.Controls.Add(DataTableToHTMLTable(dtExample,true));
Run Code Online (Sandbox Code Playgroud)

第二个问题,为什么你有一个列数据表而不仅仅是数组?你确定这些DataTable是统一的,因为如果数据是锯齿状的那么它是没用的.如果你真的必须加入这些DataTables,那么有很多Linq操作的例子,或者只是使用(注意同名列,因为如果不处理,这将在linq操作和此解决方案中发生冲突):

public DataTable joinUniformTable(DataTable dt1, DataTable dt2)
{
    int dt2ColsCount = dt2.Columns.Count;
    int dt1lRowsCount = dt1.Rows.Count;

    DataColumn column;
    for (int i = 0; i < dt2ColsCount; i++)
    {
        column = new DataColumn();
        string colName = dt2.Columns[i].ColumnName;
        System.Type colType = dt2.Columns[i].DataType;
        column.ColumnName = colName;
        column.DataType = colType;
        dt1.Columns.Add(column);

        for (int j = 0; j < dt1lRowsCount; j++)
        {
            dt1.Rows[j][colName] = dt2.Rows[j][colName];
        }
    }
    return dt1;
}
Run Code Online (Sandbox Code Playgroud)

你的解决方案看起来像:

panel.Controls.Add(DataTableToHTMLTable(joinUniformTable(joinUniformTable(LivDT,BathDT),BedDT),true));
Run Code Online (Sandbox Code Playgroud)

解读其余的,玩得开心.

  • 我想将其保存为字符串以插入HTML电子邮件. (2认同)