首页 > 解决方案 > 在asp.net中导出到excel后如何防止文本框中的新行与新行分开?

问题描述

我有一个由 ASP.NET 开发的表单,对于 Notes 条目部分,我使用<asp:TextBox ID="requestornote" TextMode="MultiLine" Rows="5" runat="server"></asp:TextBox>

以下是示例表单条目输出表:

ID       Product        Notes
1        Salt           29NOV  Cleaning Process
                        30NOV  Packing
                        1 DEC  Out from Factory
2        Sugar          30 NOV Packing
                        3 DEC  Sell

上面的数据存储在 SQL Server 中,当我使用 C# 插入导出代码时,该结构与Notes 列中的ENTER (新行)一起消失了。

当前excel的输出:

ID       Product        Notes
1        Salt           29NOV  
Cleaning Process
30NOV  
Packing
1 DEC  
Out from Factory
2        Sugar          30 NOV 
Packing
3 DEC  
Sell

C#代码

    protected void Completed_Click(object sender, EventArgs e)
    {
        Response.ClearContent();
        Response.Buffer = true;
        Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", "Completed.xls"));
        Response.ContentType = "application/ms-excel";
        DataTable dt = GetDatafromDatabase_Completed();
        string str = string.Empty;
        foreach (DataColumn dtcol in dt.Columns)
        {
            Response.Write(str + dtcol.ColumnName);
            str = "\t";
        }
        Response.Write("\n");
        foreach (DataRow dr in dt.Rows)
        {
            str = "";
            for (int j = 0; j < dt.Columns.Count; j++)
            {
                Response.Write(str + Convert.ToString(dr[j]));
                str = "\t";
            }
            Response.Write("\n");
        }
        Response.End();
    }

有人有想法吗?

标签: c#asp.net

解决方案


由于您通过写入直接构建 Excel 文档Response,默认情况下\n换行被视为新行,即它转到下一行。

构建 Excel 文档的最佳和推荐方法是使用任何第三方库,例如 OpenXML 或 ClosedXML,它们都是非常流行的免费库。但是由于某种原因,如果您不喜欢使用任何库并继续直接写入Response对象,那么我建议您使用 HTML 表格结构来构建 Excel。通过这种方式,您可以拥有更多的控制权。例如,

Response.ClearContent();
            Response.Buffer = true;
            Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", "Completed.xls"));
            Response.ContentType = "application/ms-excel";
            Response.Write("<table border='1'>");
            Response.Write("<tr>"); // Header row starts
            Response.Write("<td>Column 1</td> <td>Column2</td>");
            Response.Write("</tr>"); // header Row ends
            Response.Write("<tr>");  // First data row starts
            Response.Write("<td> Row1 Column1 Data 1</td>");
            Response.Write("<td> Row1 Column2 Data 1</td>");
            Response.Write("</tr>"); // First data row ends

            Response.Write("<tr>");  // Second data row starts
            Response.Write("<td> Row2 Column1 Data 1</td>");
            Response.Write("<td> Row2 Column2 Data 1");
            Response.Write("<br>"); // Makes it look like new line in same cell (Alt + Enter in excel)
            Response.Write("Row2 Column2 Data 2");
            Response.Write("<br>"); // Makes it look like new line in same cell (Alt + Enter in excel)
            Response.Write("Row2 Column2 Data 3</td>");
            Response.Write("</tr>"); // Second data row ends

            Response.Write("<tr>"); // Third data row Starts
            Response.Write("<td> Row3 Column1 Data 1</td>");
            Response.Write("<td> Row3 Column2 Data 1</td>");
            Response.Write("</tr>"); // Third data row Starts
            Response.Write("</table>");
            Response.End();

这将产生 excel,如下图所示。

在此处输入图像描述

在上面显示的 excel 中,单元格 A3 到 A5 会自动合并。单元格 B3、B4、B5 仍然是单个单元格。

如果这满足您的要求,那么这里是描述。

  • 有一个根<table></table>元素。
  • 像往常一样,每一行由<tr></tr>
  • 同样,每一列都由<td></td>
  • 用于<br>在同一单元格的下一行添加元素。实际上,它会合并第 (n-1) 列的行。

所以在你的情况下,没有必要使用\nor\t了。你的代码变成了这样。

protected void Completed_Click(object sender, EventArgs e)
    {
        Response.ClearContent();
        Response.Buffer = true;
        Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", "Completed.xls"));
        Response.ContentType = "application/ms-excel";
        DataTable dt = GetDatafromDatabase_Completed();
        string str = string.Empty;
        Response.Write("<table border='1'>");
        Response.Write("<tr>");
        foreach (DataColumn dtcol in dt.Columns)
        {
            Response.Write("<td>");
            Response.Write(str + dtcol.ColumnName);
            Response.Write("</td>");
        }
        Response.Write("</tr>");
        foreach (DataRow dr in dt.Rows)
        {
            Response.Write("<tr>");
            for (int j = 0; j < dt.Columns.Count; j++)
            {
                Response.Write("<td>");
                String lineFeedToBreakConvertedData = Convert.ToString(dr[j]).Replace("\n", "<br>");
                Response.Write(str + lineFeedToBreakConvertedData);
                Response.Write("</td>");
            }
            Response.Write("</tr>");
        }
        Response.Write("</table>");
        Response.End();
    }

希望这能回答你的问题。


推荐阅读