Exportieren / Umwandeln von DataTable in CSV

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!

 

Kommentare (4) -

Dirk
19.04.2006 14:50:25 #

Cooles teil, konnte ich (fast) auf anhieb verstehen Smile

hab's auch nachgebaut, nun hab ich aber das problem, dass der StringBuilder anscheinend probleme mit Ä,Ö,Ü etc., sowie dem €-Zeichen hat... was kann ich da tun?

Daniel
20.04.2006 08:12:50 #

Hallo Dirk,

so schwer ist der Code ja auch nicht und zum Glück nur wenige Zeilen Code. Das Problem mit den Umlauten hatte ich auch zuerst. Lag bei mir aber am Response-Stream und nicht am Stringbuilder.
Hast Du Dir das Ergebeniss von Stringbuilder mal angeschaut - also als temp. File auf Platte geschrieben? Wie sieht das denn im DataTable aus?



Dirk
24.04.2006 07:29:43 #

frag mich nicht so schwere sachen ^^ bin noch anfänger ^^

hab jetzt aber raus, wie ich das €-Zeichen hinkrieg (die umlaute auch, aber k.A. wie ich das gemacht hab ^^):

[code]
NumberFormatInfo nfi = new CultureInfo("de-DE", false).NumberFormat;
ausgabe_Row["Kosten"] = Kosten[i].ToString("C", nfi);
[/code]

recombinant hormones
30.08.2006 12:57:49 #

recombinant hormones

Pingbacks and trackbacks (2)+

Kommentar schreiben

Neue Themen .NET 2.0, Winform und Google-API

Neue Themen .NET 2.0, Winform und Google-API

Ab Heute wird die Thematik dieses Blogs ein wenig erweitert. Nun ist es endlich so weit und di Entwicklung mit .NET 2.0 geht bei mir endlich los. In der nächsten Zeit wird der Schwerpunkt mehr auf .NET Winforms und der Google-API liegen.

Aber keine Angst ich werde DotNetNuke nicht wirklich vernachlässigen.

Kommentar schreiben