web-dev-qa-db-fra.com

Exporter au format CSV à l'aide de MVC, C # et jQuery

J'essaie d'exporter une liste dans un fichier CSV. J'ai tout fait fonctionner au point que je veux écrire dans le fichier de réponse. Cela ne fait rien.

Voici mon code:

Appelez la méthode à partir de la page.

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

Le code dans le contrôleur est le suivant:

[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();
        }

Mais après Response.Write(sw), rien ne se passe. Est-il même possible de sauvegarder un fichier de cette façon?

Cordialement

Éditer
Les en-têtes de réponse que je vois lorsque je clique sur le bouton sont les suivants:

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

Ce qui me semble correct.

Éditer
Je me suis débarrassé de la partie jQuery et l’a remplacé par un lien hypertexte et cela fonctionne très bien pour moi maintenant:

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

yan.kun était sur la bonne voie, mais c'est beaucoup plus facile.

    public FileContentResult DownloadCSV()
    {
        string csv = "Charlie, Chaplin, Chuckles";
        return File(new System.Text.UTF8Encoding().GetBytes(csv), "text/csv", "Report123.csv");
    }
233
Biff MaGriff

Avec MVC, vous pouvez simplement retourner un fichier comme ceci:

public ActionResult ExportData()
{
    System.IO.FileInfo exportFile = //create your ExportFile
    return File(exportFile.FullName, "text/csv", string.Format("Export-{0}.csv", DateTime.Now.ToString("yyyyMMdd-HHmmss")));
}
12
yan.kun

En plus de la réponse de Biff MaGriff. Pour exporter le fichier à l'aide de JQuery, redirigez l'utilisateur vers une nouvelle page.

$('#btn_export').click(function () {
    window.location.href = 'NewsLetter/Export';
});
7
Harminder

Que se passe-t-il si vous vous débarrassez du dramaturge:

        Response.Clear();
        Response.AddHeader("Content-Disposition", "attachment; filename=adressenbestand.csv");
        Response.ContentType = "text/csv";
        //write the header
        Response.Write(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))
        {
            Response.Write(String.Format("{0},{1},{2},{3}", record.EmailAddress, record.Gender.HasValue ? resourceManager.GetString(record.Gender.ToString()) : "", record.FirstName, record.LastName));
        }

        Response.End();
5
chris

Depuis un bouton de la vue, appelez .click (appelez un script Java). À partir de là, appelez la méthode du contrôleur par window.location.href = 'Controller/Method';

Dans le contrôleur, appelez la base de données pour obtenir le datatable ou appelez une méthode pour obtenir les données de la table de la base de données dans un datatable, puis procédez comme suit:

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();
                           }
3
Ashrughna

En ce qui concerne Biff, voici quelques modifications qui me permettent d’utiliser cette méthode pour faire rebondir un fichier CSV de jQuery/Post contre le serveur et revenir sous forme d’invite CSV à l’utilisateur.

    [Themed(false)]
    public FileContentResult DownloadCSV()
    {

        var csvStringData = new StreamReader(Request.InputStream).ReadToEnd();

        csvStringData = Uri.UnescapeDataString(csvStringData.Replace("mydata=", ""));

        return File(new System.Text.UTF8Encoding().GetBytes(csvStringData), "text/csv", "report.csv");
    }

Vous aurez besoin de la ligne unescape si vous tapez ceci depuis un formulaire avec un code comme celui-ci,

    var input = $("<input>").attr("type", "hidden").attr("name", "mydata").val(data);
    $('#downloadForm').append($(input));
    $("#downloadForm").submit();
3
MonsCamus

Même si vous avez résolu votre problème, voici une autre tentative d’exportation de CSV à l’aide de MVC.

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

Je pense que tu as oublié d'utiliser

  Response.Flush();

en dessous de

  Response.Write(sw);

vérifiez s'il vous plaît

0
Deepan Raj