Skip to content

Instantly share code, notes, and snippets.

@jbubriski
Created May 24, 2013 20:09
Show Gist options
  • Select an option

  • Save jbubriski/5646178 to your computer and use it in GitHub Desktop.

Select an option

Save jbubriski/5646178 to your computer and use it in GitHub Desktop.
A CSV Writer that can be used to write directly to a response stream in ASP.NET
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
namespace DataUtils
{
/// <summary>
/// Derived from Richard Carr's (Black Wasp) CsvWriter class at http://blackwasp.co.uk/WriteCsv.aspx
/// </summary>
public class CsvWriter : StreamWriter
{
char _delimiter, _quote;
string _singleQuote, _doubleQuote;
List<char> _quotableCharacters;
string _commentToken;
public char Delimiter
{
get
{
return _delimiter;
}
set
{
_delimiter = value;
ResetQuotableCharacters();
}
}
public char Quote
{
get
{
return _quote;
}
set
{
_quote = value;
_singleQuote = value.ToString();
_doubleQuote = _singleQuote + _singleQuote;
ResetQuotableCharacters();
}
}
public string CommentToken
{
get
{
return _commentToken;
}
set
{
if (value == null) throw new ArgumentNullException("value");
if (value.Length == 0) throw new ArgumentException("Value must not be empty");
_commentToken = value;
}
}
private void ResetQuotableCharacters()
{
_quotableCharacters = new List<char>();
_quotableCharacters.AddRange(Environment.NewLine.ToCharArray());
_quotableCharacters.Add(_delimiter);
_quotableCharacters.Add(_quote);
}
public CsvWriter(Stream stream)
: base(stream)
{
Delimiter = ',';
Quote = '"';
CommentToken = "## ";
}
public void WriteLine(string[] fields)
{
bool first = true;
foreach (string field in fields)
{
WriteField(first, field);
first = false;
}
WriteLine();
}
private void WriteField(bool first, string field)
{
if (!first)
{
Write(_delimiter);
}
WritePreparedField(field);
}
private void WritePreparedField(string field)
{
string prepared = PrepareField(field);
Write(prepared);
}
private string PrepareField(string field)
{
string quotesDoubled = DoubleQuotes(field);
string prepared = AddQuotesIfRequired(quotesDoubled);
return prepared;
}
private string DoubleQuotes(string field)
{
return field.Replace(_singleQuote, _doubleQuote);
}
private string AddQuotesIfRequired(string field)
{
foreach (char quotable in _quotableCharacters)
{
if (field.StartsWith(_commentToken) || field.Contains(quotable))
{
return string.Format("{0}{1}{0}", _quote, field);
}
}
return field;
}
public void WriteComment(string comment)
{
Write(_commentToken);
WriteLine(comment);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using DataUtils;
namespace WebApplication1
{
public partial class Default : System.Web.UI.Page
{
protected void Unnamed1_Click(object sender, EventArgs e)
{
Response.Clear();
Response.ContentType = "text/csv";
Response.AddHeader("Content-Disposition", "attachment; filename=data-export.csv");
var csvWriter = new CsvWriter(Response.OutputStream);
// Output column list
var columns = new List<string>();
columns.Add("Column 1");
columns.Add("Column 2");
csvWriter.WriteLine(columns.ToArray());
// Output data
// In your loop, write the columns
//for (int i = 0; i < UPPER; i++)
//{
var data = new List<string>();
data.Add("data 1");
data.Add("data 2");
csvWriter.WriteLine(data.ToArray());
//}
csvWriter.Flush();
Response.End();
}
}
}
@rborude24
Copy link
Copy Markdown

What is the option for "Response.OutputStream" in ASP.NET core

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment