MVC, C # ve jQuery kullanarak CSV'ye aktarın


85

Bir listeyi bir CSV dosyasına aktarmaya çalışıyorum. Her şeyi yanıt akışına dosyaya yazmak istediğim noktaya kadar çalıştırdım. Bu hiçbir şey yapmaz.

İşte kodum:

Yöntemi sayfadan çağırın.

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

Denetleyicideki kod aşağıdaki gibidir:

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

Ama Response.Write(sw)hiçbir şey olmadıktan sonra . Bir dosyayı bu şekilde kaydetmek mümkün mü?

Saygılarımızla

Düzenle
Düğmeye tıkladığımda gördüğüm yanıt başlıkları:

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

Bana uygun görünen ..

Düzenle
jQuery kısmından kurtuldum ve yerine bir köprü koydum ve şu anda bu benim için iyi çalışıyor:

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

1
Belki SO ile ilgili bu soru yardımcı olur: stackoverflow.com/questions/4522590/…
Rob

Soruyu düzenlemek yerine cevabınızı gerçek bir cevap olarak belgeleyebilir misiniz lütfen?
Caltor

Yanıtlar:


251

yan.kun doğru yoldaydı ama bu çok daha kolay.

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

Virgül içeren dizeleri nasıl ele alırız? Metin niteleyici olarak çift tırnak kullanmayı denedim ama işe yaramıyor gibi görünüyor.
Mike Cole

1
@mmssaann Güzelliği bu, javascript kullanmıyorsunuz. Sadece bağlantı etiketinizin href değerini eyleme ayarlarsınız. <a href="ControllerName/ActionName">Download CSV</a>
Biff MaGriff

1
Bağlantı etiketi için href ayarladım. İyi çalışıyor. Ancak yine de tüm sayfanın geri gönderildiğini görebiliyorum. Geri gönderimi kısıtlamanın bir yolu var mı?
mmssaann

1
@mmssaann Özel kurulumunuzla ilgili ayrıntıları içeren yeni bir soru sormalısınız.
Biff MaGriff

1
CSV'yi indirmek için yönteminizi kullanıyorum, her şey yolunda görünüyor, hata ayıkladım, denetleyiciye gidiyor. Ancak tarayıcı herhangi bir indirme dosyası belirtisi göstermiyor mu? Ne olduğunu düşünüyor musunuz, Web.config veya başka bir şeyi değiştirmem gerekiyor mu?
zquanghoangz

13

MVC ile aşağıdaki gibi bir dosyayı kolayca iade edebilirsiniz:

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")));
}

8
Web sunucusunda gerçekten bir sürü dosya oluşturmak istiyor musunuz? Peki ya onları temizlemek? Güvenlik ne olacak?
chris

@chris, dosya sistemi yerine sunucunun belleğinde dosya oluşturmaz mı?
galdin

CSV'yi indirmek için yönteminizi kullanıyorum, her şey yolunda görünüyor, hata ayıkladım, denetleyiciye gidiyor. Ancak tarayıcı herhangi bir indirme dosyası belirtisi göstermiyor mu? Ne olduğunu düşünüyor musunuz, Web.config veya başka bir şeyi değiştirmem gerekiyor mu?
zquanghoangz

7

Biff MaGriff'in cevabına ek olarak. Dosyayı JQuery kullanarak dışa aktarmak için kullanıcıyı yeni bir sayfaya yönlendirin.

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

5

Yazı yazarından kurtulursanız ne olur:

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

hayır bu da bir fark yaratmaz. Bunu zaten farklı bir şekilde çözdüm. Düzenlememe bakın. Yine de yardımın için teşekkürler!
Gerard

3

Biff'e saygı duyuyorum, işte CSV'yi jQuery / Post'tan sunucuya geri döndürmek için yöntemi kullanmama ve kullanıcıya CSV istemi olarak geri dönmeme izin veren birkaç ince ayar.

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

Aşağıdaki gibi koda sahip bir formdan buna ulaşıyorsanız, unescape satırına ihtiyacınız olacak

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

3

Görünüm çağrısındaki bir düğmeden .click (biraz java betiği arayın). Oradan window.location.href = 'Controller / Method' ile denetleyici yöntemini çağırın;

Denetleyicide ya veritabanı çağrısını yapın ve datatable'ı alın ya da bazı yöntemleri çağırın veritabanı tablosundan verileri bir datatable'a alın ve ardından aşağıdakileri yapın,

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

1

Sorununuzu çözmüş olsanız bile, işte başka bir deneme csv'yi mvc kullanarak dışa aktarmayı deneyin.

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

0

Sanırım kullanmayı unuttun

  Response.Flush();

altında

  Response.Write(sw);

lütfen kontrol edin


-3

Mvc 4'te basit excel dosyası oluşturma

public ActionResult sonuçları () {return File (new System.Text.UTF8Encoding (). GetBytes ("string data"), "application / csv", "dosyaadı.csv"); }


Bu iyi bir cevap değil. Lütfen nasıl iyi bir cevap yazarım?
Clijsters

Bu iyi bir cevap. Kötü biçimlendirilmiş ve 6 yıl önce yayınlanan en iyi cevabı yineliyor. : D
Caltor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.