2010-03-29 4 views
2

J'ai une vue MS SQL que je souhaite mettre à disposition en tant que téléchargement CSV dans mon application ASPNET Web Forms. J'utilise Entity Framework pour d'autres vues et tables dans le projet. Quelle est la meilleure façon d'activer ce téléchargement?Comment servir une vue au format CSV dans les formulaires Web ASP.NET

Je pourrais ajouter un LinkButton dont le gestionnaire de clic itère sur la vue, écrit son formulaire CSV sur le disque, puis sert ce fichier. Cependant, je préfère ne pas écrire sur le disque si cela peut être évité, et cela implique un code d'itération qui peut être évité avec une autre solution.

Répondre

2

Vous pouvez itérer sur l'ensemble de données, mais au lieu de créer le fichier CSV sur votre serveur, il suffit de retourner dans la réponse HTTP. La fonction suivante devrait faire l'affaire.

Public Shared Sub ExportTextFile(ByVal response As System.Web.HttpResponse, ByVal text As String, ByVal fileName As String) 

    response.Clear() 
    response.AddHeader("content-disposition", String.Format("attachment;filename={0}", fileName)) 
    response.Charset = "" 
    response.Cache.SetCacheability(HttpCacheability.NoCache) 
    response.ContentType = "application/vnd.text" 

    Dim stringWrite As New System.IO.StringWriter 
    Dim htmlWrite = New HtmlTextWriter(stringWrite) 
    response.Write(text.ToString) 
    response.End() 

End Sub 
+0

Donc, une méthode similaire à ExportTextFile() serait utilisée comme gestionnaire de clic du lien, sans page cible .aspx? – ChessWhiz

+0

@Chess vous pouvez le faire, ou supprimez ce code dans le Page_Load d'une page ExportTextFile.aspx. Puis lien vers ça. – mxmissile

+1

Si vous suivez cette voie (et vous devriez probablement le faire), pensez simplement à implémenter votre propre gestionnaire HTTP pour ne pas avoir à supporter le coût d'un chargement de page complet. Voir http://www.hanselman.com/blog/PermaLink,guid,5c59d662-b250-4eb2-96e4-f274295bd52e.aspx et http://haacked.com/archive/2005/03/17/AnAbstractBoilerplateHttpHandler.aspx pour référence . – R0MANARMY

1

Voir this article, en particulier la méthode WriteToCsv(); Cela enverra les données csv au navigateur en tant que PersonList.csv.

Mise à jour: scénario Asp.Net possible:

protected void Page_Load(object sender, EventArgs e) 
{ 
    var data = GetMyData(...); 
    CSVExporter.WriteToCSV(data); 
} 
+1

Il est un bon début, mais les valeurs de chaîne doit toujours être entouré par des guillemets, comme des virgules incorporés dans les données bousiller sinon le CSV. –

+0

Avec cette solution, les méthodes de CSVExporter seraient-elles fusionnées avec une page .aspx qui appelle WriteToCsv() dans son Page_Load()? – ChessWhiz

+0

Il y a aussi apparemment un projet Linq to CSV qui supporte l'écriture au format CSV http://www.codeproject.com/KB/linq/LINQtoCSV.aspx#writing_to_a_file – R0MANARMY

0

Voici mon code pour créer un fichier csv à partir de n'importe quel IDataReader. Appelez-le en utilisant les résultats d'un ExecuteReader() et HttpResponse.OutputStream. Il écrira les noms des colonnes dans la première ligne, puis un ou plusieurs ensembles de lignes de données. Envoyez-le au navigateur comme suggéré par matt, bien que je suggère le type de contenu 'text/csv'.

public static void createCsvFile(IDataReader reader, StreamWriter writer) { 
    for (int columnCounter = 0; columnCounter < reader.FieldCount; columnCounter++) { 
    if (columnCounter > 0) { 
     writer.Write(Separator); 
    } 
    writer.Write(Delimiter + reader.GetName(columnCounter) + Delimiter); 
    } 
    writer.WriteLine(string.Empty); 

    do { 
    while (reader.Read()) { 
     for (int columnCounter = 0; columnCounter < reader.FieldCount; columnCounter++) { 
     if (columnCounter > 0) { 
     writer.Write(Separator); 
     } 
     writer.Write("\""+ reader.GetValue(columnCounter).ToString().Replace('"', '\'') + "\""); 
     } 
     writer.WriteLine(string.Empty); 
    } 
    writer.Flush(); 
    } 
    while (reader.NextResult()); 
Questions connexes