91 Stimmen

Export nach CSV mit MVC, C# und jQuery

Ich versuche, eine Liste in eine CSV-Datei zu exportieren. Es funktioniert alles bis zu dem Punkt, an dem ich die Datei in den Antwortstrom schreiben möchte. Das tut aber nichts.

Hier ist mein Code:

Rufen Sie die Methode von der Seite aus auf.

$('#btn_export').click(function () {
         $.post('NewsLetter/Export');
});

Der Code im Controller sieht wie folgt aus:

[HttpPost]
        public void Export()
        {
            try
            {
                var filter = Session[FilterSessionKey] != null ? Session[FilterSessionKey] as SubscriberFilter : new SubscriberFilter();

                var predicate = _subscriberService.BuildPredicate(filter);
                var compiledPredicate = predicate.Compile();
                var filterRecords = _subscriberService.GetSubscribersInGroup().Where(x => !x.IsDeleted).AsEnumerable().Where(compiledPredicate).GroupBy(s => s.Subscriber.EmailAddress).OrderBy(x => x.Key);

                ExportAsCSV(filterRecords);
            }
            catch (Exception exception)
            {
                Logger.WriteLog(LogLevel.Error, exception);
            }
        }

        private void ExportAsCSV(IEnumerable<IGrouping<String, SubscriberInGroup>> filterRecords)
        {
            var sw = new StringWriter();
            //write the header
            sw.WriteLine(String.Format("{0},{1},{2},{3}", CMSMessages.EmailAddress, CMSMessages.Gender, CMSMessages.FirstName, CMSMessages.LastName));

            //write every subscriber to the file
            var resourceManager = new ResourceManager(typeof(CMSMessages));
            foreach (var record in filterRecords.Select(x => x.First().Subscriber))
            {
                sw.WriteLine(String.Format("{0},{1},{2},{3}", record.EmailAddress, record.Gender.HasValue ? resourceManager.GetString(record.Gender.ToString()) : "", record.FirstName, record.LastName));
            }

            Response.Clear();
            Response.AddHeader("Content-Disposition", "attachment; filename=adressenbestand.csv");
            Response.ContentType = "text/csv";
            Response.Write(sw);
            Response.End();
        }

Aber nach Response.Write(sw) Es passiert nichts. Ist es überhaupt möglich, eine Datei auf diese Weise zu speichern?

Mit freundlichen Grüßen

Editer
Wenn ich auf die Schaltfläche klicke, sehe ich die folgenden Antwort-Header:

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/csv; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNetMvc-Version: 2.0
Content-Disposition: attachment; filename=adressenbestand.csv
X-Powered-By: ASP.NET
Date: Wed, 12 Jan 2011 13:05:42 GMT
Content-Length: 113

Das scheint mir in Ordnung zu sein

Editer
Ich bin den jQuery-Teil losgeworden und habe ihn durch einen Hyperlink ersetzt, und jetzt funktioniert es bei mir gut:

<a class="export" href="NewsLetter/Export">exporteren</a>

3voto

Ashrughna Punkte 31

Von einer Schaltfläche in der Ansicht rufen Sie .click (rufen Sie ein Java-Skript auf). Von dort aus rufen Sie die Controller-Methode durch window.location.href = 'Controller/Methode' auf;

In Controller entweder die Datenbank aufrufen und erhalten die datatable oder rufen Sie einige Methode erhalten die Daten aus der Datenbanktabelle zu einem datatable und dann tun folgende,

using (DataTable dt = new DataTable())
                        {
                            sda.Fill(dt);
                            //Build the CSV file data as a Comma separated string.
                            string csv = string.Empty;
                            foreach (DataColumn column in dt.Columns)
                            {
                                //Add the Header row for CSV file.
                                csv += column.ColumnName + ',';
                            }
                            //Add new line.
                            csv += "\r\n";
                            foreach (DataRow row in dt.Rows)
                            {
                                foreach (DataColumn column in dt.Columns)
                                {
                                    //Add the Data rows.
                                    csv += row[column.ColumnName].ToString().Replace(",", ";") + ',';
                                }
                                //Add new line.
                                csv += "\r\n";
                             }
                             //Download the CSV file.
                             Response.Clear();
                             Response.Buffer = true;
                             Response.AddHeader("content-disposition", "attachment;filename=SqlExport"+DateTime.Now+".csv");
                             Response.Charset = "";
                             //Response.ContentType = "application/text";
                             Response.ContentType = "application/x-msexcel";
                             Response.Output.Write(csv);
                             Response.Flush();
                             Response.End();
                           }

1voto

Sandip Punkte 112

Auch wenn Sie Ihr Problem gelöst haben, hier ist eine andere versuchen, csv mit mvc exportieren.

return new FileStreamResult(fileStream, "text/csv") { FileDownloadName = fileDownloadName };

0voto

Deepan Raj Punkte 178

Ich glaube, Sie haben vergessen, die

  Response.Flush();

unter

  Response.Write(sw);

bitte prüfen

-3voto

suresh B Punkte 51
  public FileContentResult DownloadCSV()
    {
        return File(new System.Text.UTF8Encoding().GetBytes("Ram, Saran, Raja"), "text/csv", "downloadFileName.csv");
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X