Rom*_*lus 25 c# csv asp.net export
在C#ASP.net中,有人可以告诉我如何将数组/列表中的条目写入服务器上的CSV文件,然后打开文件吗?我认为第二部分将是 - Response.Redirect(" http://myserver.com/file.csv "),但不确定如何在服务器上写入文件.
此外,如果许多用户访问此页面,是否每次生成新的CSV文件或覆盖同一文件更好?如果两个用户都尝试访问相同的CSV文件等,是否会出现读/写/锁定问题?
更新:
这可能是一个愚蠢的问题,我在Google上搜索过,但我无法找到明确的答案 - 你如何将CSV文件写入网络服务器并将其导出到C#ASP.net?我知道如何生成它,但我想将其保存到www.mysite.com/my.csv然后导出它.
小智 56
罗姆,你做错了.您不希望将文件写入磁盘,以便IIS可以为它们提供服务.这增加了安全隐患并增加了复杂性.您真正需要做的就是将CSV直接保存到响应流中.
这是场景:用户希望下载csv.用户提交一个表单,其中包含有关他们想要的csv的详细信息.您准备csv,然后向用户提供一个aspx页面的URL,该页面可用于构造csv文件并将其写入响应流.用户单击该链接.aspx页面是空白的; 在页面代码隐藏中,您只需将csv写入响应流并结束它.
您可以添加以下内容(我相信这是正确的)加载事件:
string attachment = "attachment; filename=MyCsvLol.csv";
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.AddHeader("content-disposition", attachment);
HttpContext.Current.Response.ContentType = "text/csv";
HttpContext.Current.Response.AddHeader("Pragma", "public");
var sb = new StringBuilder();
foreach(var line in DataToExportToCSV)
sb.AppendLine(TransformDataLineIntoCsv(line));
HttpContext.Current.Response.Write(sb.ToString());
Run Code Online (Sandbox Code Playgroud)
写入响应流代码从这里开始.
Ale*_*lex 25
这是一个非常简单的C#免费开源CsvExport类.底部有一个ASP.NET MVC示例.
https://github.com/jitbit/CsvExport
它关注换行符,逗号,转义引号,MS Excel兼容性......只需.cs在项目中添加一个短文件就可以了.
(免责声明:我是贡献者之一)
关于威尔的答案评论,您可能要替换HttpContext.Current.Response.End();用HttpContext.Current.ApplicationInstance.CompleteRequest(); 的原因是,Response.End()抛出一个System.Threading.ThreadAbortException.它中止一个线程.如果你有一个异常记录器,那么它将充满ThreadAbortExceptions,在这种情况下是预期的行为.
直观地说,将CSV文件发送到浏览器不应引发异常.
在这里查看更多是否Response.End()被认为是有害的?
这是我写的一个CSV动作结果,它采用DataTable并将其转换为CSV.您可以从视图中返回此内容,它将提示用户下载该文件.您应该能够轻松地将其转换为List兼容表单,甚至只需将列表放入DataTable即可.
using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Data;
namespace Detectent.Analyze.ActionResults
{
public class CSVResult : ActionResult
{
/// <summary>
/// Converts the columns and rows from a data table into an Microsoft Excel compatible CSV file.
/// </summary>
/// <param name="dataTable"></param>
/// <param name="fileName">The full file name including the extension.</param>
public CSVResult(DataTable dataTable, string fileName)
{
Table = dataTable;
FileName = fileName;
}
public string FileName { get; protected set; }
public DataTable Table { get; protected set; }
public override void ExecuteResult(ControllerContext context)
{
StringBuilder csv = new StringBuilder(10 * Table.Rows.Count * Table.Columns.Count);
for (int c = 0; c < Table.Columns.Count; c++)
{
if (c > 0)
csv.Append(",");
DataColumn dc = Table.Columns[c];
string columnTitleCleaned = CleanCSVString(dc.ColumnName);
csv.Append(columnTitleCleaned);
}
csv.Append(Environment.NewLine);
foreach (DataRow dr in Table.Rows)
{
StringBuilder csvRow = new StringBuilder();
for(int c = 0; c < Table.Columns.Count; c++)
{
if(c != 0)
csvRow.Append(",");
object columnValue = dr[c];
if (columnValue == null)
csvRow.Append("");
else
{
string columnStringValue = columnValue.ToString();
string cleanedColumnValue = CleanCSVString(columnStringValue);
if (columnValue.GetType() == typeof(string) && !columnStringValue.Contains(","))
{
cleanedColumnValue = "=" + cleanedColumnValue; // Prevents a number stored in a string from being shown as 8888E+24 in Excel. Example use is the AccountNum field in CI that looks like a number but is really a string.
}
csvRow.Append(cleanedColumnValue);
}
}
csv.AppendLine(csvRow.ToString());
}
HttpResponseBase response = context.HttpContext.Response;
response.ContentType = "text/csv";
response.AppendHeader("Content-Disposition", "attachment;filename=" + this.FileName);
response.Write(csv.ToString());
}
protected string CleanCSVString(string input)
{
string output = "\"" + input.Replace("\"", "\"\"").Replace("\r\n", " ").Replace("\r", " ").Replace("\n", "") + "\"";
return output;
}
}
}
Run Code Online (Sandbox Code Playgroud)