2011-01-12 5 views
73

का उपयोग कर सीएसवी में निर्यात करें, मैं एक CSV फ़ाइल में एक सूची निर्यात करने की कोशिश कर रहा हूं। मुझे यह सब उस बिंदु तक काम कर रहा है जिसे मैं प्रतिक्रिया स्ट्रीम में फ़ाइल में लिखना चाहता हूं। यह कुछ भी नहीं करता है।एमवीसी, सी # और jQuery

कॉल पेज से विधि:

यहाँ मेरी कोड है।

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

लेकिन Response.Write(sw) कुछ भी नहीं के बाद हो रहा है:

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

नियंत्रक में कोड इस प्रकार है। क्या इस तरह से फाइल को सहेजना भी संभव है?

सादर

संपादित
प्रतिक्रिया हेडर मैं देख रहा हूँ कि जब मैं बटन पर क्लिक करें हैं:

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 

कौन सा मेरे लिए ठीक लग रहे हैं ..

संपादित
मैं jQuery भाग से छुटकारा पाने के लिए इसे एक हाइपरलिंक द्वारा प्रतिस्थापित किया गया और यह काम कर रहा है अब मेरे लिए ठीक:

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

हो सकता है कि इतने पर इस सवाल में मदद करता है डेटाबेस कॉल करते हैं और datatable या कॉल प्राप्त कुछ विधि एक datatable के लिए डेटाबेस तालिका से डेटा प्राप्त करें और फिर निम्न है,: http: // stackoverflow.com/questions/4522590/unable-to-open-download-save-dialog – Rob

उत्तर

207

yan.kun

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

हम स्ट्रिंग्स को कैसे संभालेंगे जिनमें अल्पविराम शामिल है? मैंने टेक्स्ट क्वालीफायर के रूप में डबल कोट्स का उपयोग करने की कोशिश की लेकिन यह काम नहीं कर रहा है। –

+0

हम कैसे जावा विधि से इस विधि विधि DownloadCSV कॉल करने के लिए ?? – mmssaann

+1

@mmssaann यह इसकी सुंदरता है, आप जावास्क्रिप्ट का उपयोग नहीं करते हैं। आपने बस अपने एंकर टैग के href को क्रिया में सेट किया है। 'Download CSV' –

11

MVC के साथ आप आसानी से इस तरह एक फ़ाइल लौट सकते हैं सही रास्ते पर था लेकिन यह बहुत आसान है।

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

क्या आप वास्तव में वेब सर्वर पर फ़ाइलों का एक समूह बनाना चाहते हैं? उन्हें साफ करने के बारे में क्या? सुरक्षा के बारे में क्या? – chris

+0

@chris फाइल सिस्टम के बजाए सर्वर की स्मृति में फ़ाइलों को नहीं बनाता है? – gldraphael

4

अगर आप stringwriter से छुटकारा पाने के क्या होता है::

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

नहीं जो कि कोई फर्क नहीं पड़ता है। मैंने इसे पहले से ही अलग तरीके से हल किया है। मेरा संपादन देखें। फिर भी आपकी सहायता के लिए धन्यवाद! – Gerard

1

भले ही आपने अपनी समस्या का समाधान किया हो, फिर भी एक और एमवीसी का उपयोग कर सीएसवी निर्यात करने का प्रयास कर रहा है।

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

बिफ के संबंध में, यहाँ कुछ बदलाव है कि मुझे सर्वर के विरुद्ध jQuery/पोस्ट से CSV उछाल और वापस उपयोगकर्ता के लिए आप CSV शीघ्र के रूप में आने के लिए विधि का उपयोग करते है।

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

आप बिफ MaGriff के जवाब के अलावा, यदि आप निम्नलिखित की तरह कोड के साथ एक रूप से इस तक पहुंच गए हैं unescape लाइन की आवश्यकता होगी

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

। JQuery का उपयोग कर फ़ाइल निर्यात करने के लिए, उपयोगकर्ता को एक नए पृष्ठ पर रीडायरेक्ट करें।

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

मैं लगता है कि तुम

Response.Write(sw); 

तहत

Response.Flush(); 

उपयोग करने के लिए जाँच कृपया

-2

सरल एक्सेल फ़ाइल MVC में बना 4

public ActionResult परिणाम भूल गया () { वापसी फ़ाइल (नई प्रणाली.Text.UTF8Encoding()। GetBytes ("स्ट्रिंग डेटा"), "एप्लिकेशन/सीएसवी", "filename.csv"); }

+0

यह एक अच्छा जवाब नहीं है। कृपया देखें [मैं एक अच्छा उत्तर कैसे लिखूं?] (Https://stackoverflow.com/help/how-to-answer) – Clijsters

2

दृश्य कॉल में एक बटन से। क्लिक करें (कुछ जावा स्क्रिप्ट को कॉल करें)। वहां से window.location.href = 'नियंत्रक/विधि' द्वारा कॉल नियंत्रक विधि;

नियंत्रक में या तो

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(); 
          } 
संबंधित मुद्दे