producing CSV files on the fly

Two people recently have asked me how to produce this sort of output from ASP.NET.  Please note, the code here is not meant to be an example of any best practices.  There are plenty of things that could (should) be done a bit differently.  The listing is for the express purpose of showing how to simply get it done.  Doing it the “right“ way is up to you :)

What isn't shown here is the code to get your ADO.NET DataTable object from your database.  Assuming that you have your DataTable, what you need to do is turn that into a string, and send that string to the browser in such a way that the browser opens it in a “new“ window, in Excel or whatever application the user has configured to load .CSV files with.

What also isn't shown here is how you'd “get to“ this page.  On any other page in your application, you could have a button whose click event will do a simple Server.Transfer to this page.  Or anything like that.

The thing to remember, is “you don't need anything at all in your Webform.“  Just leave it blank.

I hope someone can make use of this.

Travis

 

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Response.ContentType = ""

Response.AppendHeader("Content-Disposition", "inline;filename=filename.csv")

Response.Write(GetCSV(myDataTable))

Response.End()

End Sub

Private Function GetCSV(ByVal dt As DataTable) As String

Dim sb As New System.Text.StringBuilder

Dim rowCounter, colCounter As Integer

'first the row with fieldnames

For colCounter = 0 To dt.Columns.Count - 1

sb.Append(Chr(34))

sb.Append(dt.Columns(colCounter).ColumnName)

sb.Append(Chr(34))

sb.Append(",")

Next

sb.Append(vbCrLf)

'then the rows of data

For rowCounter = 0 To dt.Rows.Count - 1

For colCounter = 0 To dt.Columns.Count - 1

If Not IsDBNull(dt.Rows(rowCounter).Item(colCounter)) Then

If Not IsNumeric(dt.Rows(rowCounter).Item(colCounter)) Then

sb.Append(Chr(34))

End If

sb.Append(dt.Rows(rowCounter).Item(colCounter))

If Not IsNumeric(dt.Rows(rowCounter).Item(colCounter)) Then

sb.Append(Chr(34))

End If

Else

'sb.Append(Chr(34) & Chr(34))

End If

If colCounter <> dt.Columns.Count - 1 Then

sb.Append(",")

End If

Next

sb.Append(vbCrLf)

Next

Return sb.ToString

End Function

Print | posted on Monday, October 27, 2003 9:18 PM

Feedback

# re: producing CSV files on the fly

left by anon at 4/22/2004 9:59 AM Gravatar
try using it in a dataset and using a for each loop instead
pseudocode:
for each datarow in datasettablesrows
for each item in datarow.itemarray
add comma
end for
end for

# re: producing CSV files on the fly

left by erik at 4/13/2006 7:54 AM Gravatar
Excellent example. This is just what I was looking for so that I wouldn't have to create the file on the server and then stream it to the client.
Comments have been closed on this topic.