开发者

How to serve a View as CSV in ASP.NET Web Forms

I have a MS SQL view that I want to make available as a CSV down开发者_StackOverflow中文版load in my ASPNET Web Forms app. I am using Entity Framework for other views and tables in the project. What's the best way to enable this download?

I could add a LinkButton whose click handler iterates over the view, writes its CSV form to the disk, and then serves that file. However, I'd prefer not to write to the disk if it can be avoided, and that involves iteration code that may be avoided with some other solution.


You could iterate over the dataset, but instead of creating the CSV file on your server simply return it through the HTTP response. The following function should do the trick.

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


See this article, specifically the method WriteToCsv(); This will send the csv data to the browser as PersonList.csv.

Update: Possible Asp.Net scenario:

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


Here is my code to ceate a csv file from any IDataReader. Call it using the results of an ExecuteReader() and HttpResponse.OutputStream. It will write out the column names in the first row, then one or more sets of data rows. Output it to the browser as suggested by matt, though I would suggest content type '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());


I found this question, which addresses the HttpHandler portion of the dilemma.

In ASP.NET, how to get the browser to download string content into a file? (C#)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜