MVC, C # और jQuery का उपयोग करके CSV को निर्यात करें


85

मैं एक सूची को CSV फ़ाइल में निर्यात करने का प्रयास कर रहा हूं। मुझे यह सब उस बिंदु पर काम करना था जो मैं प्रतिक्रिया स्ट्रीम में फ़ाइल करना चाहता हूं। यह कुछ भी नहीं करता है।

यहाँ मेरा कोड है:

पृष्ठ से विधि को कॉल करें।

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

नियंत्रक में कोड निम्नानुसार है:

[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)भी कुछ नहीं हो रहा है। क्या इस तरह से फ़ाइल को सहेजना संभव है?

सादर


जब मैं बटन पर क्लिक करता हूं तो मुझे जो प्रतिक्रियाएं दिखाई देती हैं उन्हें संपादित करें :

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 के भाग से छुटकारा मिल गया है और यह मेरे लिए अब ठीक काम कर रहा है:

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

1
शायद SO पर यह सवाल मदद करता है: stackoverflow.com/questions/4522590/…
Rob

क्या आप कृपया प्रश्न को संपादित करने के बजाय एक वास्तविक उत्तर के रूप में अपने उत्तर का दस्तावेजीकरण कर सकते हैं।
कलस्टर

जवाबों:


250

yan.kun सही रास्ते पर था लेकिन यह बहुत आसान है।

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

हम उन स्ट्रिंग्स को कैसे संभालेंगे जिनमें कॉमा हैं? मैंने टेक्स्ट क्वालिफायर के रूप में दोहरे उद्धरण चिह्नों का उपयोग करने की कोशिश की, लेकिन यह काम नहीं करता है।
माइक कोल

1
@mmssaann यह की सुंदरता है, आप जावास्क्रिप्ट का उपयोग नहीं करते हैं। आप अपने एंकर टैग को कार्रवाई के लिए सेट करते हैं। <a href="ControllerName/ActionName">Download CSV</a>
बिफ मागरिफ

1
मैंने एंकर टैग के लिए href सेट किया है। यह ठीक काम कर रहा है। हालाँकि मैं अभी भी देख सकता हूँ कि पूरा पृष्ठ वापस पोस्ट किया गया है। क्या पोस्टबैक को प्रतिबंधित करने का कोई तरीका है?
mmssaann

1
@mmssaann आपको अपने विशेष सेटअप के बारे में विवरण के साथ एक नया प्रश्न पूछना चाहिए।
बिफ मागरिफ

1
मैं CSV डाउनलोड करने के लिए आपके तरीके का उपयोग करता हूं, सब कुछ ठीक लगता है, मैं डिबग करता हूं, यह कंट्रोलर को जाता है। लेकिन ब्राउज़र डाउनलोड फ़ाइल का कोई संकेत नहीं दिखाता है? क्या आपको लगता है कि क्या होता है, मुझे Web.config या कुछ और बदलने की जरूरत है?
zquanghoangz

13

MVC के साथ आप इस तरह से एक फाइल वापस कर सकते हैं:

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
क्या आप वास्तव में वेब सर्वर पर फ़ाइलों का एक गुच्छा बनाना चाहते हैं? उन्हें साफ करने के बारे में क्या? सुरक्षा के बारे में क्या?
क्रिस

@chris फाइल सिस्टम के बजाय सर्वर की मेमोरी में फाइल नहीं बनाता है?
गालिन

मैं CSV डाउनलोड करने के लिए आपके तरीके का उपयोग करता हूं, सब कुछ ठीक लगता है, मैं डिबग करता हूं, यह कंट्रोलर को जाता है। लेकिन ब्राउज़र डाउनलोड फ़ाइल का कोई संकेत नहीं दिखाता है? क्या आपको लगता है कि क्या होता है, मुझे Web.config या कुछ और बदलने की जरूरत है?
zquanghoangz

7

बिफ माग्रिफ के जवाब के अलावा। JQuery का उपयोग करके फ़ाइल को निर्यात करने के लिए, उपयोगकर्ता को एक नए पृष्ठ पर पुनर्निर्देशित करें।

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

5

स्ट्रिंगर से छुटकारा पाने पर क्या होता है:

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

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

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

यदि आपको निम्नलिखित के जैसे कोड वाले फ़ॉर्म से इसे मार रहा है, तो आपको अनस्केप लाइन की आवश्यकता होगी

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

3

दृश्य कॉल में एक बटन से .click (कुछ जावा स्क्रिप्ट को कॉल करें)। वहाँ से 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();
                           }

1

यहां तक ​​कि अगर आपने अपना मुद्दा हल कर लिया है, तो यहां एक और पीवीसी का उपयोग करके सीएसवी को निर्यात करने का प्रयास किया गया है।

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

0

मुझे लगता है कि आप उपयोग करना भूल गए हैं

  Response.Flush();

के अंतर्गत

  Response.Write(sw);

कृपया जांचें


-3

सरल एक्सेल फाइल mvc 4 में बनाते हैं

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


यह एक अच्छा जवाब नहीं है। कृपया देखें कि मैं एक अच्छा उत्तर कैसे लिखूं?
क्लिजस्टर्स 10

यह एक अच्छा जवाब है। यह सिर्फ बुरी तरह से स्वरूपित है और सबसे अच्छा उत्तर दोहराता है जो 6 साल पहले पोस्ट किया गया था। : डी
कैल्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.