2010-03-29 79 views
2

我有一个MS SQL视图,我想在ASPNET Web窗体应用程序中以CSV下载形式提供。我在实体框架中使用了项目中的其他视图和表格。什么是启用此下载的最佳方式?如何在ASP.NET Web窗体中将视图作为CSV提供

我可以添加一个LinkBut​​ton,它的Click处理器遍历视图,将其CSV表单写入磁盘,然后提供该文件。但是,如果可以避免的话,我宁愿不写入磁盘,也不要使用其他解决方案可以避免的迭代代码。

回答

2

你可以遍历数据集,但不是创建CSV您的服务器上的文件只需通过HTTP响应返回。下面的函数应该做的伎俩。

Public Shared Sub ExportTextFile(ByVal response As System.Web.HttpResponse, ByVal text As String, ByVal fileName As String) 

    response.Clear() 
    response.AddHeader("content-disposition", String.Format("attachment;filename={0}", fileName)) 
    response.Charset = "" 
    response.Cache.SetCacheability(HttpCacheability.NoCache) 
    response.ContentType = "application/vnd.text" 

    Dim stringWrite As New System.IO.StringWriter 
    Dim htmlWrite = New HtmlTextWriter(stringWrite) 
    response.Write(text.ToString) 
    response.End() 

End Sub 
+0

因此,类似于ExportTextFile()的方法将用作链接的点击处理程序,但没有目标.aspx页面? – ChessWhiz 2010-03-29 18:50:58

+0

@Chess你可以做到这一点,或将该代码放在ExportTextFile.aspx页面的Page_Load中。然后链接到那个。 – mxmissile 2010-03-29 18:53:23

+1

如果你走这条路线(你可能应该)考虑实施你自己的HTTP处理程序,这样你就不会承担整个页面加载的成本。请参阅http://www.hanselman.com/blog/PermaLink,guid,5c59d662-b250-4eb2-96e4-f274295bd52e.aspx和http://haacked.com/archive/2005/03/17/AnAbstractBoilerplateHttpHandler.aspx以供参考。 – R0MANARMY 2010-03-29 18:54:05

1

请参阅this article,具体为方法WriteToCsv();这会将csv数据发送到浏览器PersonList.csv

更新:可能Asp.Net场景:

protected void Page_Load(object sender, EventArgs e) 
{ 
    var data = GetMyData(...); 
    CSVExporter.WriteToCSV(data); 
} 
+1

这是一个良好的开端,但字符串值应该总是用引号包围,如数据的嵌入式逗号否则会搞砸了CSV。 – 2010-03-29 18:50:07

+0

有了这个解决方案,CSVExporter的方法是否会与在其Page_Load()中调用WriteToCsv()的.aspx页面合并? – ChessWhiz 2010-03-29 18:54:05

+0

还有一个显然是支持写入CSV的Linq to CSV项目http://www.codeproject.com/KB/linq/LINQtoCSV.aspx#writing_to_a_file – R0MANARMY 2010-03-29 18:57:26

0

这里是我的代码来从任何IDataReader cea csv文件。使用ExecuteReader()和HttpResponse.OutputStream的结果调用它。它将写出第一行中的列名称,然后写出一组或多组数据行。按照matt的建议将其输出到浏览器,但我会建议内容类型为'text/csv'。

public static void createCsvFile(IDataReader reader, StreamWriter writer) { 
    for (int columnCounter = 0; columnCounter < reader.FieldCount; columnCounter++) { 
    if (columnCounter > 0) { 
     writer.Write(Separator); 
    } 
    writer.Write(Delimiter + reader.GetName(columnCounter) + Delimiter); 
    } 
    writer.WriteLine(string.Empty); 

    do { 
    while (reader.Read()) { 
     for (int columnCounter = 0; columnCounter < reader.FieldCount; columnCounter++) { 
     if (columnCounter > 0) { 
     writer.Write(Separator); 
     } 
     writer.Write("\""+ reader.GetValue(columnCounter).ToString().Replace('"', '\'') + "\""); 
     } 
     writer.WriteLine(string.Empty); 
    } 
    writer.Flush(); 
    } 
    while (reader.NextResult()); 
相关问题