এমভিসি, সি # এবং jQuery ব্যবহার করে সিএসভিতে রফতানি করুন


85

আমি সিএসভি ফাইলে একটি তালিকা রফতানি করার চেষ্টা করছি। আমি প্রতিক্রিয়া প্রবাহে ফাইলটি লিখতে চাইছি এমন পর্যন্ত কাজ করে ফেলেছি। এটি কিছুই করে না।

আমার কোডটি এখানে:

পৃষ্ঠাটি থেকে পদ্ধতিটি কল করুন।

$('#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>

4
হতে পারে এসও-তে এই প্রশ্নটি সহায়তা করে: stackoverflow.com/questions/4522590/…
রব

আপনি দয়া করে প্রশ্নটি সম্পাদনা করার পরিবর্তে আপনার উত্তরটিকে প্রকৃত উত্তর হিসাবে নথিভুক্ত করতে পারেন।
কল্টোর

উত্তর:


251

yan.kun সঠিক পথে ছিল তবে এটি অনেক সহজ।

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

কমাগুলি থাকা স্ট্রিংগুলি আমরা কীভাবে পরিচালনা করব? আমি পাঠ্য বাছাইকারী হিসাবে ডাবল উদ্ধৃতি ব্যবহার করার চেষ্টা করেছি তবে এটি কার্যকর হবে বলে মনে হচ্ছে না।
মাইক কোল

4
@ মিমসান এই এটির সৌন্দর্য, আপনি জাভাস্ক্রিপ্ট ব্যবহার করবেন না। আপনি কেবলমাত্র আপনার অ্যাঙ্কর ট্যাগটির href কে অ্যাকশনে সেট করেছেন। <a href="ControllerName/ActionName">Download CSV</a>
বিফ ম্যাগগ্রিফ

4
আমি নোঙ্গর ট্যাগের জন্য href সেট করেছি। এটা ঠিক কাজ করছে। তবে আমি এখনও দেখতে পাচ্ছি পুরো পৃষ্ঠাটি আবার পোস্ট হয়েছে। পোস্টব্যাক সীমাবদ্ধ করার উপায় কি আছে?
মিমসসান

4
@ মমসাসান আপনার নির্দিষ্ট সেটআপ সম্পর্কে বিশদ সহ একটি নতুন প্রশ্ন জিজ্ঞাসা করা উচিত।
বিফ ম্যাগগ্রিফ

4
ডাউনলোড সিএসভি তৈরি করার জন্য আমি আপনার উপায়টি ব্যবহার করি, সবকিছু ঠিক আছে বলে মনে হয়, আমি ডিবাগ করি, এটি নিয়ামকের কাছে যায়। কিন্তু ব্রাউজারটি ডাউনলোড ফাইলের কোনও চিহ্ন দেখায় না? আপনি কি মনে করেন কি হয়েছে, আমার ওয়েবকনফিগ বা কিছু পরিবর্তন করতে হবে?
zquanghoangz

13

এমভিসি দিয়ে আপনি সহজেই এই জাতীয় কোনও ফাইল ফিরে আসতে পারেন:

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
আপনি কি সত্যিই ওয়েব সার্ভারে একগুচ্ছ ফাইল তৈরি করতে চান? এগুলি পরিষ্কার করার বিষয়ে কী? সিকিউরিটির কী হবে?
ক্রিস

@ ক্রিস কি ফাইল সিস্টেমের পরিবর্তে সার্ভারের স্মৃতিতে ফাইল তৈরি করে না?
গ্যালদিন

ডাউনলোড সিএসভি তৈরি করার জন্য আমি আপনার উপায়টি ব্যবহার করি, সবকিছু ঠিক আছে বলে মনে হয়, আমি ডিবাগ করি, এটি নিয়ামকের কাছে যায়। কিন্তু ব্রাউজারটি ডাউনলোড ফাইলের কোনও চিহ্ন দেখায় না? আপনি কি মনে করেন কি হয়েছে, আমার ওয়েবকনফিগ বা কিছু পরিবর্তন করতে হবে?
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 / পোস্ট থেকে সিএসভি বাউন্স করার পদ্ধতিটি ব্যবহার করতে এবং ব্যবহারকারীর কাছে সিএসভি প্রম্পট হিসাবে ফিরে আসতে দেয়।

    [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

ভিউ কলটিতে একটি বোতাম থেকে। ক্লিক করুন (কিছু জাভা স্ক্রিপ্ট কল করুন)। সেখান থেকে উইন্ডো দ্বারা নিয়ন্ত্রক পদ্ধতিতে কল করুন oc 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

এমভিসি 4 এ সরল এক্সেল ফাইল তৈরি করুন

সর্বজনীন অ্যাকশন ফলাফল ফলাফল () File ফাইল ফেরত (নতুন System.Text.UTF8 এনকোডিং ()। গেটবাইটস ("স্ট্রিং ডেটা"), "অ্যাপ্লিকেশন / সিএসভি", "filename.csv"); }



এটি একটি ভাল উত্তর। এটি মাত্র খারাপভাবে ফর্ম্যাট হয়েছে এবং সেরা উত্তরের নকল করে যা 6 বছর আগে পোস্ট করা হয়েছিল। : ডি
ক্যালটার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.