Bevor ich aber mit .NET 2.0 so richtig loslege hier noch ein kleiner Codebeitrag. Man hat ja immer wieder die Anforderung Daten in CSV zu exportieren (im Zeitalter von XML für mich unverständlich aber gut
). Dafür veröffentliche ich jetzt das fünftausenste Code-Beispiel.
Zunächst habe ich eine allgemeine Basisklasse geschrieben, die auch für weiter Exportformate genutzt werden kann:
using System;
using System.Data;
using System.Web;
using System.Text;
using System.IO;
namespace GaliNeo.Framework
{
/// <summary>
/// Zusammenfassung für BaseConverter.
/// </summary>
public abstract class BaseConverter
{
public BaseConverter()
{
}
/// <summary>
/// Export DataTable to http stream
/// </summary>
/// <param name="oDataTable"></param>
/// <param name="response"></param>
/// <param name="sFileName"></param>
public void ExportToResponseStream(DataTable oDataTable, System.Web.HttpResponse response, string sFileName)
{
response.Clear() ;
response.ClearHeaders();
response.ClearContent();
response.Buffer = true;
//Very importent because "ü", "ä", usw....
response.ContentEncoding = System.Text.Encoding.Default ;
response.ContentType = GetHTTPContentType() ;
response.AppendHeader("content-disposition", "attachment; filename=" + HttpUtility.UrlEncode(sFileName, System.Text.Encoding.UTF8)) ;
response.Write( ConvertDataTable(oDataTable).ToString() ) ;
//close http response
response.End();
}
/// <summary>
/// Export datatable to file
/// </summary>
/// <param name="oDataTable"></param>
/// <param name="sFileName"></param>
/// <returns></returns>
public bool ExportToFile(DataTable oDataTable, string sFileName )
{
try
{
string fullpath = System.IO.Path.GetFullPath( sFileName ) ;
if (System.IO.Directory.Exists ( fullpath ))
{
System.IO.Directory.CreateDirectory( fullpath ) ;
}
StreamWriter SW;
SW=File.CreateText(sFileName);
SW.WriteLine(ConvertDataTable(oDataTable).ToString());
SW.Close();
return true ;
}
catch
{
return false ;
}
}
protected abstract StringBuilder ConvertDataTable(DataTable oDataTable) ;
protected abstract string GetHTTPContentType() ;
}
}
Die Klasse ermöglicht es eine Stream entweder auf Festplatte zu schreiben oder aber in den HTTP Responsestream.
Die passende CSV-Klasse ist relativ simple und kein wirkliches Geheimnis:
using System;
using System.Data;
using System.IO;
using System.Text;
namespace GaliNeo.Framework
{
/// <summary>
/// Summary description for CSVConvertor.
/// </summary>
public class CSVConverter : BaseConverter
{
protected override string GetHTTPContentType()
{
return "text/csv";
}
/// <summary>
/// To generate CSV file.
/// </summary>
/// <param name="oDataTable"></param>
/// <param name="directoryPath"></param>
/// <param name="fileName"></param>
/// <returns></returns>
protected override StringBuilder ConvertDataTable(DataTable oDataTable)
{
StringBuilder oStringBuilder = new StringBuilder();
// Start, Creating column header
foreach(DataColumn oDataColumn in oDataTable.Columns)
{
oStringBuilder.Append(oDataColumn.ColumnName + ",");
oStringBuilder.Append( System.Environment.NewLine ) ;
}
//End, Creating column header
//Start, Creating rows
foreach(DataRow oDataRow in oDataTable.Rows)
{
foreach(DataColumn oDataColumn in oDataTable.Columns)
{
oStringBuilder.Append(oDataRow[oDataColumn.ColumnName] + ",");
}
oStringBuilder.Append( System.Environment.NewLine ) ;
}
//End, Creating rows
return oStringBuilder;
}
}
}
Fertig!