c# - 在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();
}
有人有想法吗?
解决方案
由于您通过写入直接构建 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) 列的行。
所以在你的情况下,没有必要使用\n
or\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();
}
希望这能回答你的问题。
推荐阅读
- sublimetext3 - 如何正确地将另一种语言嵌入到我当前的语言定义中?
- erlang - 使用 erlang:trace_delivered/1 跟踪事件消息排序
- angularjs - 在 AngularJS SPA 中使用刷新令牌
- python - 加速列表和for循环python
- azureservicebus - 逻辑应用:Servicebus Polling 触发器多次处理消息
- java - 没有密码而是证书的用户身份验证?
- java - 按 /1;2;3;4;5 顺序读取参数列表
- angular - forkJoin 的问题,代码不会在订阅后运行
- symfony - JMS Serializer:如何在不到处添加注释的情况下传播属性的组排除?
- php - 应用过滤器时,帖子类型订单不起作用