kosta Member

Joined: 09 Aug 2015 Posts: 161 Location: Salonic
|
Posted: 21/07/2017 12:58 Post subject: Writing a DataTable to a CSV File |
|
|
Writing a DataTable to a CSV File
Thomas Corey
There are many times when we need to export the contents of a DataTable to a compus compatible with spreadsheet applications, such as Microsoft Excel or Apple Numbers. This quick little class will write the contents of a DataTable to a TextWriter instance, whether this is a physical file or network stream.
// C# Code
| Code: | public static class Rfc4180Writer
{
public static void WriteDataTable(DataTable sourceTable, TextWriter writer, bool includeHeaders)
{
if (includeHeaders) {
IEnumerable<String> headerValues = sourceTable.Columns
.OfType<DataColumn>()
.Select(column => QuoteValue(column.ColumnName));
writer.WriteLine(String.Join(",", headerValues));
}
IEnumerable<String> items = null;
foreach (DataRow row in sourceTable.Rows) {
items = row.ItemArray.Select(o => QuoteValue(o.ToString()));
writer.WriteLine(String.Join(",", items));
}
writer.Flush();
}
private static string QuoteValue(string value)
{
return String.Concat("\"",
value.Replace("\"", "\"\""), "\"");
}
} |
Making use of the class is straightforward in a number of applications. For the desktop world, here's a console app demonstrating the use via StreamWriter:
// C# Code
| Code: | public static class Program {
public static void Main() {
DataTable sourceTable = new DataTable();
sourceTable.Columns.AddRange(new DataColumn[] {
new DataColumn("ID", typeof(Guid)),
new DataColumn("Date", typeof(DateTime)),
new DataColumn("StringValue", typeof(string)),
new DataColumn("NumberValue", typeof(int)),
new DataColumn("BooleanValue", typeof(bool))
});
sourceTable.Rows.Add(Guid.NewGuid(), DateTime.Now, "String1", 100, true);
sourceTable.Rows.Add(Guid.NewGuid(), DateTime.Now, "String2", 200, false);
sourceTable.Rows.Add(Guid.NewGuid(), DateTime.Now, "String3", 300, true);
using (StreamWriter writer = new StreamWriter("C:\\Temp\\dump.csv")) {
Rfc4180Writer.WriteDataTable(sourceTable, writer, true);
}
}
} |
For the ASP.NET MVC world, specifically MVC 3 or later, the demonstration isn't much different than the above example except the result is returned as a FilePathResult instance on a controller action:
// C# Code
| Code: | public class ReportController : Controller
{
[HttpGet()]
public ActionResult Export()
{
DataTable sourceTable = new DataTable();
sourceTable.Columns.AddRange(new DataColumn[] {
new DataColumn("ID", typeof(Guid)),
new DataColumn("Date", typeof(DateTime)),
new DataColumn("StringValue", typeof(string)),
new DataColumn("NumberValue", typeof(int)),
new DataColumn("BooleanValue", typeof(bool))
});
sourceTable.Rows.Add(Guid.NewGuid(), DateTime.Now, "String1", 100, true);
sourceTable.Rows.Add(Guid.NewGuid(), DateTime.Now, "String2", 200, false);
sourceTable.Rows.Add(Guid.NewGuid(), DateTime.Now, "String3", 300, true);
byte[] outputBuffer = null;
using (MemoryStream tempStream = new MemoryStream()) {
using (StreamWriter writer = new StreamWriter(tempStream)) {
Rfc4180Writer.WriteDataTable(sourceTable, writer, true);
}
outputBuffer = tempStream.ToArray();
}
return File(outputBuffer, "text/csv", "export.csv");
}
} |
https://www.codeproject.com/Tips/665519/Writing-a-DataTable-to-a-CSV-File
Common Format and MIME Type for Comma-Separated Values (CSV) Files
http://tools.ietf.org/html/rfc4180 |
|