এজেএক্স এমভিসির মাধ্যমে এক্সেল ফাইলটি ডাউনলোড করুন


94

এমভিসিতে আমার একটি বড় (ইশ) ফর্ম রয়েছে।

আমাকে সেই ফর্মের সাবসেট থেকে ডেটাযুক্ত একটি এক্সেল ফাইল তৈরি করতে সক্ষম হওয়া দরকার।

মুশকিলটি হ'ল এটির বাকী ফর্মটিকে প্রভাবিত করা উচিত নয় এবং তাই আমি এজেএক্সের মাধ্যমে এটি করতে চাই। আমি এসও সম্পর্কিত কয়েকটি প্রশ্ন জুড়ে এসেছি যা সম্পর্কিত বলে মনে হচ্ছে, তবে উত্তরগুলির অর্থ কী তা আমি পুরোপুরি কার্যকর করতে পারি না।

এইটি আমার পরে যা সবচেয়ে নিকটতম বলে মনে হচ্ছে: এসপি-নেট-এমভিসি-ডাউনলোডিং-এক্সেল - তবে আমি নিশ্চিত নই যে আমি প্রতিক্রিয়াটি বুঝতে পেরেছি এবং এখন এটি বেশ কয়েক বছর পুরনো। ফাইল ডাউনলোড করার জন্য একটি আইফ্রেমে ব্যবহার সম্পর্কে আমি আর একটি নিবন্ধ (এটি আর খুঁজে পাচ্ছি না) জুড়ে এসেছি, তবে এমভিসির সাথে এটি কীভাবে কাজ করবেন তা সম্পর্কে আমি নিশ্চিত নই।

আমার এক্সেল ফাইলটি ঠিক আছে যদি আমি একটি সম্পূর্ণ পোস্ট ফিরে করছি তবে আমি এটি এমভিসিতে এজেএক্সের সাথে কাজ করতে পারি না।

উত্তর:


218

আপনি এজেএক্স কলের মাধ্যমে ডাউনলোডের জন্য সরাসরি কোনও ফাইল ফেরত দিতে পারবেন না, তাই আপনার সার্ভারে সম্পর্কিত ডেটা পোস্ট করার জন্য একটি এজ্যাক্স কল ব্যবহার করার বিকল্প বিকল্প approach এরপরে আপনি এক্সেল ফাইল তৈরি করতে সার্ভার সাইড কোড ব্যবহার করতে পারেন (আমি এর জন্য ইপিপ্লাস বা এনপিওআই ব্যবহার করার পরামর্শ দেব যদিও এটি মনে হচ্ছে আপনার এই অংশটি কাজ করছে)।

সেপ্টেম্বর 2016 আপডেট করুন

আমার আসল উত্তরটি (নীচে) 3 বছরের বেশি বয়সী ছিল, তাই আমি ভেবেছিলাম যে আমি আপডেট করব কারণ এজেএক্স এর মাধ্যমে ফাইলগুলি ডাউনলোড করার সময় আমি সার্ভারে আর ফাইল তৈরি করব না, যদিও মূল উত্তরটি এখনও রেখেছি কারণ এটি নির্ভর করে এখনও কিছু ব্যবহার হতে পারে আপনার নির্দিষ্ট প্রয়োজনীয়তা।

আমার এমভিসি অ্যাপ্লিকেশনগুলির একটি সাধারণ পরিস্থিতি এমন একটি ওয়েব পৃষ্ঠার মাধ্যমে প্রতিবেদন করছে যা কিছু ব্যবহারকারীর কনফিগার করা রিপোর্টের পরামিতি (তারিখের সীমা, ফিল্টার ইত্যাদি) রয়েছে। যখন ব্যবহারকারীরা সেগুলিতে সেগুলি প্যারামিটারগুলি নির্দিষ্ট করে থাকেন, তখন প্রতিবেদনটি উত্পন্ন হয় (উদাহরণস্বরূপ কোনও এক্সেল ফাইল আউটপুট হিসাবে বলে) এবং তারপরে আমি ফলাফলটি ফাইলটিকে TempDataএকটি অনন্য রেফারেন্স সহ বালতিতে বাইট অ্যারে হিসাবে সংরক্ষণ করি । এই রেফারেন্সটি আমার এজেএক্স ফাংশনের জসন ফলাফল হিসাবে ফিরে পেয়েছে যা পরবর্তী সময়ে ডেটা বের TempDataকরতে এবং শেষ ব্যবহারকারী ব্রাউজারে ডাউনলোড করতে পৃথক নিয়ন্ত্রক পদক্ষেপে পুনর্নির্দেশ করে ।

এটি আরও বিশদ দেওয়ার জন্য, ধরে নিই যে আপনার কাছে একটি এমভিসি ভি রয়েছে যা একটি ফর্ম একটি মডেল শ্রেণীর সাথে আবদ্ধ, মডেলটিকে কল করতে দিন ReportVM

প্রথমত, একটি নিয়ামক পদক্ষেপ পোস্ট মডেল গ্রহণ করা প্রয়োজন, একটি উদাহরণ হবে:

public ActionResult PostReportPartial(ReportVM model){

   // Validate the Model is correct and contains valid data
   // Generate your report output based on the model parameters
   // This can be an Excel, PDF, Word file - whatever you need.

   // As an example lets assume we've generated an EPPlus ExcelPackage

   ExcelPackage workbook = new ExcelPackage();
   // Do something to populate your workbook

   // Generate a new unique identifier against which the file can be stored
   string handle = Guid.NewGuid().ToString();

   using(MemoryStream memoryStream = new MemoryStream()){
        workbook.SaveAs(memoryStream);
        memoryStream.Position = 0;
        TempData[handle] = memoryStream.ToArray();
   }      

   // Note we are returning a filename as well as the handle
   return new JsonResult() { 
         Data = new { FileGuid = handle, FileName = "TestReportOutput.xlsx" }
   };

}

এজেএক্স কল করে যে আমার এমভিসি ফর্মটি উপরের নিয়ামকের কাছে পোস্ট করে এবং প্রতিক্রিয়া গ্রহণ করে এটির মতো দেখাচ্ছে:

$ajax({
    cache: false,
    url: '/Report/PostReportPartial',
    data: _form.serialize(), 
    success: function (data){
         var response = JSON.parse(data);
         window.location = '/Report/Download?fileGuid=' + response.FileGuid 
                           + '&filename=' + response.FileName;
    }
})

ফাইলটি ডাউনলোড করার জন্য নিয়ামক পদক্ষেপ:

[HttpGet]
public virtual ActionResult Download(string fileGuid, string fileName)
{   
   if(TempData[fileGuid] != null){
        byte[] data = TempData[fileGuid] as byte[];
        return File(data, "application/vnd.ms-excel", fileName);
   }   
   else{
        // Problem - Log the error, generate a blank file,
        //           redirect to another controller action - whatever fits with your application
        return new EmptyResult();
   }
}

অন্য একটি পরিবর্তন যা প্রয়োজনে সহজেই সংযোজন করা যায় তা হ'ল তৃতীয় প্যারামিটার হিসাবে ফাইলের মাইমে টাইপ পাস করা যাতে একটি কন্ট্রোলার ক্রিয়াটি সঠিকভাবে বিভিন্ন আউটপুট ফাইল ফর্ম্যাটগুলি সরবরাহ করতে পারে।

এটি সার্ভারে তৈরি ও সঞ্চয় করার জন্য কোনও শারীরিক ফাইলের প্রয়োজনীয়তা অপসারণ করে, তাই কোনও বাড়ির রক্ষণাবেক্ষণের রুটিন প্রয়োজন হয় না এবং এটি আবার শেষ ব্যবহারকারীটির জন্য নির্বিঘ্ন।

দ্রষ্টব্য, এর TempDataপরিবর্তে ব্যবহারের সুবিধাটি Sessionহ'ল একবার TempDataপড়লে ডেটা সাফ হয়ে যায় তাই আপনার যদি ফাইলের অনুরোধের পরিমাণ বেশি থাকে তবে মেমরির ব্যবহারের ক্ষেত্রে এটি আরও কার্যকর হবে। দেখুন TempData শ্রেষ্ঠ অনুশীলন

মূল উত্তর

আপনি এজেএক্স কলের মাধ্যমে ডাউনলোডের জন্য সরাসরি কোনও ফাইল ফেরত দিতে পারবেন না, তাই আপনার সার্ভারে সম্পর্কিত ডেটা পোস্ট করার জন্য একটি এজ্যাক্স কল ব্যবহার করার বিকল্প বিকল্প approach এরপরে আপনি এক্সেল ফাইল তৈরি করতে সার্ভার সাইড কোড ব্যবহার করতে পারেন (আমি এর জন্য ইপিপ্লাস বা এনপিওআই ব্যবহার করার পরামর্শ দেব যদিও এটি মনে হচ্ছে আপনার এই অংশটি কাজ করছে)।

একবার সার্ভারে ফাইলটি তৈরি হয়ে গেলে ফাইলটি (বা কেবল ফাইলের নাম) আপনার এজেএক্স কলটির রিটার্ন মান হিসাবে ফেরত দেয় এবং তারপরে window.locationএই ইউআরএলে জাভাস্ক্রিপ্ট সেট করে যা ব্রাউজারটি ফাইলটি ডাউনলোড করার অনুরোধ জানাবে।

শেষ ব্যবহারকারীদের দৃষ্টিকোণ থেকে, ফাইল ডাউনলোড অপারেশন নির্বিঘ্ন কারণ তারা অনুরোধের উত্স যে পৃষ্ঠাটি ছেড়ে যায় তা কখনও ছাড়েন না।

এটি অর্জনের জন্য নীচে একটি অজ্যাক্স কলের একটি সাধারণ স্বীকৃত উদাহরণ রয়েছে:

$.ajax({
    type: 'POST',
    url: '/Reports/ExportMyData', 
    data: '{ "dataprop1": "test", "dataprop2" : "test2" }',
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    success: function (returnValue) {
        window.location = '/Reports/Download?file=' + returnValue;
    }
});
  • url পরামিতি হ'ল নিয়ন্ত্রক / অ্যাকশন পদ্ধতি যেখানে আপনার কোডটি এক্সেল ফাইল তৈরি করবে।
  • ডেটা প্যারামিটারে জাসন ডেটা রয়েছে যা ফর্মটি থেকে বের করা হবে।
  • রিটার্নভ্যালু হ'ল আপনার নতুন নির্মিত এক্সেল ফাইলের ফাইলের নাম।
  • দ্বারা window.location কন্ট্রোলার / অ্যাকশন পদ্ধতি যে আসলে ডাউনলোডের জন্য আপনার ফাইল ফেরৎ কমান্ড পুনঃনির্দেশ।

ডাউনলোড ক্রিয়াকলাপের জন্য একটি নমুনা নিয়ন্ত্রক পদ্ধতিটি হ'ল:

[HttpGet]
public virtual ActionResult Download(string file)
{   
  string fullPath = Path.Combine(Server.MapPath("~/MyFiles"), file);
  return File(fullPath, "application/vnd.ms-excel", file);
}

4
এটি একটি ভাল সম্ভাব্য বিকল্পের মতো দেখায়, তবে আমি এটির আগে এগিয়ে যাওয়ার আগে, অন্য কোনও বিকল্প নেই যা সার্ভারে ফাইল তৈরির সাথে জড়িত না?
ভালুক

4
আমি যে সম্পর্কে সচেতন তা নয় - এই পদ্ধতিটি আমি বহুবার সফলভাবে ব্যবহার করেছি। ব্যবহারকারীর দৃষ্টিকোণ থেকে এটি নির্বিঘ্ন, কেবলমাত্র মনে রাখা উচিত যে আপনার তৈরি করা ফাইলগুলি পরিচ্ছন্ন করার জন্য একটি গৃহকর্মের রুটিনের প্রয়োজন হবে যেহেতু সময়ের সাথে সাথে এটি বাড়বে।
connectedsoftware

7
একটি এন্ডপয়েন্ট '/ ডাউনলোড? ফাইল ফাইল তৈরি করুন ...' স্ক্রিম প্রচুর সুরক্ষা ঝুঁকিপূর্ণ - আমি কোনও নিরাপত্তা বিশেষজ্ঞ নই তবে আমি মনে করি আপনি ব্যবহারকারীর প্রমাণীকরণ, ইনপুট স্যানিটেশন, এমভিসি'র [ভ্যালিডএন্টিফোরজিটোকেন] যুক্ত করতে এবং অন্যান্য সুরক্ষার সর্বোত্তম উল্লেখ করতে চান এই উত্তরের অনুশীলন।
জিমি

4
@ সিএসএল আমি সর্বদা 0x800a03f6 ত্রুটিটি পেয়ে যাচ্ছি - জাভাস্ক্রিপ্ট রানটাইম ত্রুটি: ভেরর প্রতিক্রিয়াতে অবৈধ অক্ষর = JSON.parse (ডেটা);
স্ট্যান্ডেজ

4
দুর্দান্ত, আপনি পুরানো উত্তরটি নীচে রাখেন না কেন? এবং শীর্ষে নতুন উত্তর, যাতে লোকেরা সময় নষ্ট না করে
goamn

19

আমার 2 সেন্ট - আপনার সার্ভারে একটি এক্সেলকে একটি ফিজিকাল ফাইল হিসাবে সংরক্ষণ করার দরকার নেই - পরিবর্তে এটি (সেশন) ক্যাশে সংরক্ষণ করুন। আপনার ক্যাশে ভেরিয়েবলের জন্য একটি অনন্য উত্পন্ন নাম ব্যবহার করুন (এটি যে এক্সেল ফাইলটিকে সঞ্চয় করে) - এটি আপনার (প্রাথমিক) অ্যাজাক্স কলের প্রত্যাবর্তন হবে। এইভাবে আপনাকে ফাইল অ্যাক্সেসের সমস্যাগুলি মোকাবেলা করতে হবে না, যখন প্রয়োজন হয় না তখন ফাইলগুলি পরিচালনা (মুছে ফেলা) ইত্যাদি and


4
আপনি ঠিক কিভাবে এটি করতে হবে? আকর্ষণীয় মনে হচ্ছে।
নাটালিয়া

4
একটি উদাহরণটি দুর্দান্ত হবে (মানে কীভাবে এটি ক্যাশে সংরক্ষণ করতে হবে, এক্সেল ফাইল তৈরি করা নয়)।
তাদেজ

যদিও এটি কতটা স্কেলেবল? কোনও ব্যবহারকারী যদি বেশ কয়েকটি বড় রিপোর্ট ডাউনলোড করে থাকেন?
Zapnologica

আপনি যদি আউজুরে থাকেন তবে সেশনটি আপনার কাজটি আরএআরফিনিটি বন্ধ না করা পর্যন্ত কাজ করবে।
জীশেন লি

17

আমি সম্প্রতি এমভিসিতে এটি সম্পাদন করতে সক্ষম হয়েছি (যদিও এজেএক্স ব্যবহারের দরকার ছিল না) কোনও শারীরিক ফাইল তৈরি না করে এবং ভেবেছিলাম যে আমি আমার কোডটি ভাগ করব:

সুপার সিম্পল জাভাস্ক্রিপ্ট ফাংশন (ডেটাবেলস ডটনেটল বোতাম ক্লিক এটিকে ট্রিগার করে):

function getWinnersExcel(drawingId) {
    window.location = "/drawing/drawingwinnersexcel?drawingid=" + drawingId;
}

সি # নিয়ামক কোড:

    public FileResult DrawingWinnersExcel(int drawingId)
    {
        MemoryStream stream = new MemoryStream(); // cleaned up automatically by MVC
        List<DrawingWinner> winnerList = DrawingDataAccess.GetWinners(drawingId); // simple entity framework-based data retrieval
        ExportHelper.GetWinnersAsExcelMemoryStream(stream, winnerList, drawingId);

        string suggestedFilename = string.Format("Drawing_{0}_Winners.xlsx", drawingId);
        return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml", suggestedFilename);
    }

এক্সপোর্টহেল্পার ক্লাসে আমি এক্সিল ফাইল উত্পন্ন করতে তৃতীয় পক্ষের সরঞ্জাম ( জেমবক্স.স্প্রেডশিট ) ব্যবহার করি এবং এতে সেভ টু স্ট্রিম বিকল্প রয়েছে। বলা হচ্ছে, এক্সেল ফাইল তৈরির বেশ কয়েকটি উপায় রয়েছে যা সহজেই মেমরি স্ট্রিমে লেখা যেতে পারে।

public static class ExportHelper
{
    internal static void GetWinnersAsExcelMemoryStream(MemoryStream stream, List<DrawingWinner> winnerList, int drawingId)
    {

        ExcelFile ef = new ExcelFile();

        // lots of excel worksheet building/formatting code here ...

        ef.SaveXlsx(stream);
        stream.Position = 0; // reset for future read

     }
}

আইই, ক্রোম এবং ফায়ারফক্সে ব্রাউজারটি ফাইলটি ডাউনলোড করার অনুরোধ জানায় এবং প্রকৃত কোনও নেভিগেশন ঘটে না।


4
আমারও একই রকম পন্থা ছিল। সমস্যাটি হ'ল ডাউনলোডটি কখন শেষ হবে তা আপনি জানেন না যাতে আপনি সেই জঘন্য
প্রিলোডারটি

8

প্রথমে কন্ট্রোলার অ্যাকশন তৈরি করুন যা এক্সেল ফাইল তৈরি করবে

[HttpPost]
public JsonResult ExportExcel()
{
    DataTable dt = DataService.GetData();
    var fileName = "Excel_" + DateTime.Now.ToString("yyyyMMddHHmm") + ".xls";

    //save the file to server temp folder
    string fullPath = Path.Combine(Server.MapPath("~/temp"), fileName);

    using (var exportData = new MemoryStream())
    {
        //I don't show the detail how to create the Excel, this is not the point of this article,
        //I just use the NPOI for Excel handler
        Utility.WriteDataTableToExcel(dt, ".xls", exportData);

        FileStream file = new FileStream(fullPath, FileMode.Create, FileAccess.Write);
        exportData.WriteTo(file);
        file.Close();
    }

    var errorMessage = "you can return the errors in here!";

    //return the Excel file name
    return Json(new { fileName = fileName, errorMessage = "" });
}

তারপরে ডাউনলোড অ্যাকশনটি তৈরি করুন

[HttpGet]
[DeleteFileAttribute] //Action Filter, it will auto delete the file after download, 
                      //I will explain it later
public ActionResult Download(string file)
{
    //get the temp folder and file path in server
    string fullPath = Path.Combine(Server.MapPath("~/temp"), file);

    //return the file for download, this is an Excel 
    //so I set the file content type to "application/vnd.ms-excel"
    return File(fullPath, "application/vnd.ms-excel", file);
}

আপনি যদি ডাউনলোডের পরে ফাইলটি মুছতে চান তবে এটি তৈরি করুন

public class DeleteFileAttribute : ActionFilterAttribute
{
    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.Flush();

        //convert the current filter context to file and get the file path
        string filePath = (filterContext.Result as FilePathResult).FileName;

        //delete the file after download
        System.IO.File.Delete(filePath);
    }
}

এবং শেষ পর্যন্ত আপনার কাছ থেকে এমভিসি রেজার ভিউ থেকে অজ্যাক্স কল

//I use blockUI for loading...
$.blockUI({ message: '<h3>Please wait a moment...</h3>' });    
$.ajax({
    type: "POST",
    url: '@Url.Action("ExportExcel","YourController")', //call your controller and action
    contentType: "application/json; charset=utf-8",
    dataType: "json",
}).done(function (data) {
    //console.log(data.result);
    $.unblockUI();

    //get the file name for download
    if (data.fileName != "") {
        //use window.location.href for redirect to download action for download the file
        window.location.href = "@Url.RouteUrl(new 
            { Controller = "YourController", Action = "Download"})/?file=" + data.fileName;
    }
});

7

আমি সিএসএল দ্বারা পোস্ট করা সমাধানটি ব্যবহার করেছি তবে আমি আপনাকে সুপারিশ করব যে পুরো সেশনে ফাইল ডেটা সেশনে সংরক্ষণ করবেন না। টেম্পডাটা ব্যবহার করে ফাইলের ডেটা পরবর্তী অনুরোধের পরে স্বয়ংক্রিয়ভাবে মুছে ফেলা হয় (যা ফাইলের জন্য জিইটি অনুরোধ)। আপনি ডাউনলোড অ্যাকশনে সেশনে ফাইল ডেটা অপসারণ পরিচালনা করতে পারেন।

সেশন স্টেট স্টোরেজ এবং সেশন চলাকালীন কতগুলি ফাইল রফতানি করা হয় এবং যদি আপনার অনেক ব্যবহারকারী থাকে তার উপর নির্ভর করে সেশনটি অনেক বেশি মেমরি / স্থান গ্রাস করতে পারে।

পরিবর্তে টেম্পডাটা ব্যবহার করার জন্য আমি সিএসএল থেকে সেরার সাইড কোডটি আপডেট করেছি।

public ActionResult PostReportPartial(ReportVM model){

   // Validate the Model is correct and contains valid data
   // Generate your report output based on the model parameters
   // This can be an Excel, PDF, Word file - whatever you need.

   // As an example lets assume we've generated an EPPlus ExcelPackage

   ExcelPackage workbook = new ExcelPackage();
   // Do something to populate your workbook

   // Generate a new unique identifier against which the file can be stored
   string handle = Guid.NewGuid().ToString()

   using(MemoryStream memoryStream = new MemoryStream()){
        workbook.SaveAs(memoryStream);
        memoryStream.Position = 0;
        TempData[handle] = memoryStream.ToArray();
   }      

   // Note we are returning a filename as well as the handle
   return new JsonResult() { 
         Data = new { FileGuid = handle, FileName = "TestReportOutput.xlsx" }
   };

}

[HttpGet]
public virtual ActionResult Download(string fileGuid, string fileName)
{   
   if(TempData[fileGuid] != null){
        byte[] data = TempData[fileGuid] as byte[];
        return File(data, "application/vnd.ms-excel", fileName);
   }   
   else{
        // Problem - Log the error, generate a blank file,
        //           redirect to another controller action - whatever fits with your application
        return new EmptyResult();
   }
}

@ নিকলাস আমি টেম্পটাটাও ব্যবহার শুরু করেছি, আপনার উত্তর আমাকে এটি প্রতিফলিত করার জন্য আমার আপডেট করতে অনুরোধ করেছিল!
connectedsoftware

5

ক্লোজড এক্সএমএল.এক্সসেল ব্যবহার করে;

   public ActionResult Downloadexcel()
    {   
        var Emplist = JsonConvert.SerializeObject(dbcontext.Employees.ToList());
        DataTable dt11 = (DataTable)JsonConvert.DeserializeObject(Emplist, (typeof(DataTable)));
        dt11.TableName = "Emptbl";
        FileContentResult robj;
        using (XLWorkbook wb = new XLWorkbook())
        {
            wb.Worksheets.Add(dt11);
            using (MemoryStream stream = new MemoryStream())
            {
                wb.SaveAs(stream);
                var bytesdata = File(stream.ToArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "myFileName.xlsx");
                robj = bytesdata;
            }
        }


        return Json(robj, JsonRequestBehavior.AllowGet);
    }


AJAX CALL সাফল্য ব্লকে, সাফল্য: ফাংশন (Rdata) {ডিবাগার; var বাইটস = নতুন Uint8Array (Rdata.FileContents); var ব্লব = নতুন ব্লব ([বাইটস], {প্রকার: "অ্যাপ্লিকেশন / vnd.openxmlformats-officedocament.spreadsheetml.sheet"}); var লিঙ্ক = ডকুমেন্ট.ক্রেটএলিমেন্ট ('এ'); link.href = window. URL.createObjectURL (ব্লব); link.download = "myFileName.xlsx"; লিঙ্কক্লিক (); ।,
জিভিকেআরও

উপরের লিঙ্কে কেউ এক্সেল ফাইল ডাউনলোড বাস্তবায়ন করেছেন, এটি কেবলমাত্র @ html.Beginform () এর জন্য কাজ করে তারপরে ছোট পরিবর্তনগুলির পরে সেই কোডটির দরকার পড়ে, এজ্যাক্স কল সাফল্য ব্লকটির জন্য, দয়া করে এটি পরীক্ষা করে দেখুন, এটি
অ্যাজেএক্স কলটিতে

3
aj .জ্যাক্স ({
                প্রকার: "জিইটি",
                url: "/ হোম / ডাউনলোডেক্সেল /",
                কনটেন্ট টাইপ: "অ্যাপ্লিকেশন / জসন; চরসেট = utf-8",
                তথ্য: নাল,
                সাফল্য: ফাংশন (Rdata) {
                    ডিবাগার;
                    var বাইটস = নতুন Uint8Array (Rdata.FileContents); 
                    var ব্লব = নতুন ব্লব ([বাইটস], {প্রকার: "অ্যাপ্লিকেশন / vnd.openxmlformats-officedocament.spreadsheetml.sheet"});
                    var লিঙ্ক = ডকুমেন্ট.ক্রেটএলিমেন্ট ('এ');
                    link.href = window. URL.createObjectURL (ব্লব);
                    link.download = "myFileName.xlsx";
                    লিঙ্কক্লিক ();
                },
                ত্রুটি: ফাংশন (ভুল) {

                }

            });

1

অজ্যাক্স কল থেকে 502 ব্যাড গেটওয়ের ফলাফল পেয়েছি বিধায় সবকিছু নিয়ন্ত্রকের কাছ থেকে জরিমানা ফিরে আসার পরেও গ্রহণযোগ্য উত্তরটি আমার পক্ষে বেশ কার্যকর হয়নি ।

সম্ভবত আমি টেম্পডাটার সাথে একটি সীমাটি ছুঁড়েছিলাম - নিশ্চিত নয় তবে আমি দেখতে পেয়েছি যে আমি যদি টেম্পাডাটার পরিবর্তে আইমেমোরিচি ব্যবহার করি তবে এটি ভাল কাজ করেছে, তাই গৃহীত উত্তরে কোডটির আমার অভিযোজিত সংস্করণটি এখানে:

public ActionResult PostReportPartial(ReportVM model){

   // Validate the Model is correct and contains valid data
   // Generate your report output based on the model parameters
   // This can be an Excel, PDF, Word file - whatever you need.

   // As an example lets assume we've generated an EPPlus ExcelPackage

   ExcelPackage workbook = new ExcelPackage();
   // Do something to populate your workbook

   // Generate a new unique identifier against which the file can be stored
   string handle = Guid.NewGuid().ToString();

   using(MemoryStream memoryStream = new MemoryStream()){
        workbook.SaveAs(memoryStream);
        memoryStream.Position = 0;
        //TempData[handle] = memoryStream.ToArray();

        //This is an equivalent to tempdata, but requires manual cleanup
        _cache.Set(handle, memoryStream.ToArray(), 
                    new MemoryCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromMinutes(10))); 
                    //(I'd recommend you revise the expiration specifics to suit your application)

   }      

   // Note we are returning a filename as well as the handle
   return new JsonResult() { 
         Data = new { FileGuid = handle, FileName = "TestReportOutput.xlsx" }
   };

}

এজেএক্স কলটি গৃহীত উত্তরের সাথে রয়ে গেছে (আমি কোনও পরিবর্তন করেছি):

$ajax({
    cache: false,
    url: '/Report/PostReportPartial',
    data: _form.serialize(), 
    success: function (data){
         var response = JSON.parse(data);
         window.location = '/Report/Download?fileGuid=' + response.FileGuid 
                           + '&filename=' + response.FileName;
    }
})

ফাইলটি ডাউনলোড করার জন্য নিয়ামক পদক্ষেপ:

[HttpGet]
public virtual ActionResult Download(string fileGuid, string fileName)
{   
    if (_cache.Get<byte[]>(fileGuid) != null)
    {
        byte[] data = _cache.Get<byte[]>(fileGuid);
        _cache.Remove(fileGuid); //cleanup here as we don't need it in cache anymore
        return File(data, "application/vnd.ms-excel", fileName);
    }
    else
    {
        // Something has gone wrong...
        return View("Error"); // or whatever/wherever you want to return the user
    }
}

...

মেমোরি ক্যাশে সেট আপ করার জন্য এখন কিছু অতিরিক্ত কোড রয়েছে ...

"_Cache" ব্যবহারের জন্য আমি নিয়ামকের জন্য কনস্ট্রাক্টারে ইনজেকশন দিয়েছি:

using Microsoft.Extensions.Caching.Memory;
namespace MySolution.Project.Controllers
{
 public class MyController : Controller
 {
     private readonly IMemoryCache _cache;

     public LogController(IMemoryCache cache)
     {
        _cache = cache;
     }

     //rest of controller code here
  }
 }

এবং নিশ্চিত হয়ে নিন যে আপনার স্টার্টআপ। সি-তে কনফিগার সার্ভিসগুলিতে নিম্নলিখিতগুলি রয়েছে:

services.AddDistributedMemoryCache();

0

এই থ্রেডটি আমাকে নিজের সমাধানটি তৈরি করতে সহায়তা করেছে যা আমি এখানে ভাগ করব। আমি প্রথমে ইস্যু ছাড়াই একটি জিইটি এজ্যাক্স অনুরোধটি ব্যবহার করছি তবে এটি এমন একটি পয়েন্টে পৌঁছেছে যেখানে অনুরোধের ইউআরএলটির দৈর্ঘ্য ছাড়িয়ে গেছে সুতরাং আমাকে একটি পোষ্টে দাঁড়াতে হবে।

জাভাস্ক্রিপ্ট JQuery ফাইল ডাউনলোড প্লাগইন ব্যবহার করে এবং 2 সফল কল রয়েছে of ফাইলটি পুনরুদ্ধারে একটি পোস্ট (প্যারাম প্রেরণে) এবং একটি জিইটি।

 function download(result) {
        $.fileDownload(uri + "?guid=" + result,
        {
            successCallback: onSuccess.bind(this),
            failCallback: onFail.bind(this)
        });
    }

    var uri = BASE_EXPORT_METADATA_URL;
    var data = createExportationData.call(this);

    $.ajax({
        url: uri,
        type: 'POST',
        contentType: 'application/json',
        data: JSON.stringify(data),
        success: download.bind(this),
        fail: onFail.bind(this)
    });

সার্ভার পাশ

    [HttpPost]
    public string MassExportDocuments(MassExportDocumentsInput input)
    {
        // Save query for file download use
        var guid = Guid.NewGuid();
        HttpContext.Current.Cache.Insert(guid.ToString(), input, null, DateTime.Now.AddMinutes(5), Cache.NoSlidingExpiration);
        return guid.ToString();
    }

   [HttpGet]
    public async Task<HttpResponseMessage> MassExportDocuments([FromUri] Guid guid)
    {
        //Get params from cache, generate and return
        var model = (MassExportDocumentsInput)HttpContext.Current.Cache[guid.ToString()];
          ..... // Document generation

        // to determine when file is downloaded
        HttpContext.Current
                   .Response
                   .SetCookie(new HttpCookie("fileDownload", "true") { Path = "/" });

        return FileResult(memoryStream, "documents.zip", "application/zip");
    }

0

সিএসএলের উত্তরটি এমন একটি প্রকল্পে বাস্তবায়িত হয়েছিল যা আমি কাজ করছি তবে আমার যে সমস্যাটি হয়েছে তা আজুরের সমস্যাটি আমাদের ফাইল ডাউনলোডগুলি ভেঙে দিয়েছে। পরিবর্তে, আমি একটি এজ্যাক্স কল দিয়ে এটি করতে সক্ষম হয়েছি:

সার্ভার

[HttpPost]
public FileResult DownloadInvoice(int id1, int id2)
{
    //necessary to get the filename in the success of the ajax callback
    HttpContext.Response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition");

    byte[] fileBytes = _service.GetInvoice(id1, id2);
    string fileName = "Invoice.xlsx";
    return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
}

ক্লায়েন্ট ( এজ্যাক্ট পোস্ট থেকে হ্যান্ডেল ফাইল ডাউনলোডের পরিবর্তিত সংস্করণ )

$("#downloadInvoice").on("click", function() {
    $("#loaderInvoice").removeClass("d-none");

    var xhr = new XMLHttpRequest();
    var params = [];
    xhr.open('POST', "@Html.Raw(Url.Action("DownloadInvoice", "Controller", new { id1 = Model.Id1, id2 = Model.Id2 }))", true);
    xhr.responseType = 'arraybuffer';
    xhr.onload = function () {
        if (this.status === 200) {
            var filename = "";
            var disposition = xhr.getResponseHeader('Content-Disposition');
            if (disposition && disposition.indexOf('attachment') !== -1) {
                var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
                var matches = filenameRegex.exec(disposition);
                if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, '');
            }
            var type = xhr.getResponseHeader('Content-Type');

            var blob = typeof File === 'function'
                ? new File([this.response], filename, { type: type })
                : new Blob([this.response], { type: type });
            if (typeof window.navigator.msSaveBlob !== 'undefined') {
                // IE workaround for "HTML7007: One or more blob URLs were revoked by closing the blob for which they were created. These URLs will no longer resolve as the data backing the URL has been freed."
                window.navigator.msSaveBlob(blob, filename);
            } else {
                var URL = window.URL || window.webkitURL;
                var downloadUrl = URL.createObjectURL(blob);

                if (filename) {
                    // use HTML5 a[download] attribute to specify filename
                    var a = document.createElement("a");
                    // safari doesn't support this yet
                    if (typeof a.download === 'undefined') {
                        window.location = downloadUrl;
                    } else {
                        a.href = downloadUrl;
                        a.download = filename;
                        document.body.appendChild(a);
                        a.click();
                    }
                } else {
                    window.location = downloadUrl;

                }

                setTimeout(function() {
                        URL.revokeObjectURL(downloadUrl);
                    $("#loaderInvoice").addClass("d-none");
                }, 100); // cleanup
            }
        }
    };
    xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    xhr.send($.param(params));
});

0
  $.ajax({
    global: false,
    url: SitePath + "/User/ExportTeamMembersInExcel",
    "data": { 'UserName': UserName, 'RoleId': RoleId, UserIds: AppraseeId },
    "type": "POST",
    "dataType": "JSON",
   "success": function (result) {
        debugger
        var bytes = new Uint8Array(result.FileContents);
        var blob = new Blob([bytes], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" });
        var link = document.createElement('a');
        link.href = window.URL.createObjectURL(blob);
        link.download = "myFileName.xlsx";
        link.click();
      },
    "error": function () {
        alert("error");
    }
})


[HttpPost]
    public JsonResult ExportTeamMembersInExcel(string UserName, long? RoleId, string[] UserIds)
    {
        MemoryStream stream = new MemoryStream();
        FileContentResult robj;
        DataTable data = objuserservice.ExportTeamToExcel(UserName, RoleId, UserIds);
        using (XLWorkbook wb = new XLWorkbook())
        {
            wb.Worksheets.Add(data, "TeamMembers");
            using (stream)
            {
                wb.SaveAs(stream);
            }
        }
        robj = File(stream.ToArray(), System.Net.Mime.MediaTypeNames.Application.Octet, "TeamMembers.xlsx");
        return Json(robj, JsonRequestBehavior.AllowGet);
    }

ফাইলটি খুলতে পারে না, এক্সেলটি কেবল খোলে এবং তারপরে কেবল নিজেকে বন্ধ করে না, আমি এমনকি লবজের আগে স্ট্রিম.ক্লোজ () যুক্ত করেছিলাম তবে কাজ করছে না।
ডাওনকোড

0

আমি বেশ সরল শব্দ হতে পারে, এবং হতে পারে বেশ সমালোচনা আকৃষ্ট, কিন্তু এখানে আমি তা,
( এটা সঙ্গে যুক্ত নয় ajaxরপ্তানির জন্য, কিন্তু এটা করে না হয় একটি পূর্ণ postback )

এই পোস্ট এবং এই উত্তরের জন্য ধন্যবাদ ।
একটি সাধারণ নিয়ামক তৈরি করুন

public class HomeController : Controller
{               
   /* A demo action
    public ActionResult Index()
    {           
        return View(model);
    }
   */
    [HttpPost]
    public FileResult ExportData()
    {
        /* An example filter
        var filter = TempData["filterKeys"] as MyFilter;
        TempData.Keep();            */
        var someList = db.GetDataFromDb(/*filter*/) // filter as an example

    /*May be here's the trick, I'm setting my filter in TempData["filterKeys"] 
     in an action,(GetFilteredPartial() illustrated below) when 'searching' for the data,
     so do not really need ajax here..to pass my filters.. */

     //Some utility to convert list to Datatable
     var dt = Utility.ConvertToDataTable(someList); 

      //  I am using EPPlus nuget package 
      using (ExcelPackage pck = new ExcelPackage())
      {
          ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Sheet1");
          ws.Cells["A1"].LoadFromDataTable(dt, true);

            using (var memoryStream = new MemoryStream())
            {                   
              pck.SaveAs(memoryStream);
              return File(memoryStream.ToArray(),
              "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
              "ExportFileName.xlsx");                    
            }                
        }   
    }

    //This is just a supporting example to illustrate setting up filters ..        
   /* [HttpPost]
    public PartialViewResult GetFilteredPartial(MyFilter filter)
    {            
        TempData["filterKeys"] = filter;
        var filteredData = db.GetConcernedData(filter);
        var model = new MainViewModel();
        model.PartialViewModel = filteredData;

        return PartialView("_SomePartialView", model);
    } */     
} 

এবং এখানে দেখুন ..

/*Commenting out the View code, in order to focus on the imp. code     
 @model Models.MainViewModel
 @{Layout...}     

      Some code for, say, a partial View  
      <div id="tblSampleBody">
        @Html.Partial("_SomePartialView", Model.PartialViewModel)
      </div>
  */                                                       
//The actual part.. Just **posting** this bit of data from the complete View...
//Here, you are not posting the full Form..or the complete View
   @using (Html.BeginForm("ExportData", "Home", FormMethod.Post))
    {
        <input type="submit" value="Export Data" />
    }
//...
//</div>

/*And you may require to pass search/filter values.. as said in the accepted answer..
That can be done while 'searching' the data.. and not while
 we need an export..for instance:-             

<script>             
  var filterData = {
      SkipCount: someValue,
      TakeCount: 20,
      UserName: $("#UserName").val(),
      DepartmentId: $("#DepartmentId").val(),     
   }

  function GetFilteredData() {
       $("#loader").show();
       filterData.SkipCount = 0;
       $.ajax({
          url: '@Url.Action("GetFilteredPartial","Home")',
          type: 'POST',
          dataType: "html",
          data: filterData,
          success: function (dataHTML) {
          if ((dataHTML === null) || (dataHTML == "")) {
              $("#tblSampleBody").html('<tr><td>No Data Returned</td></tr>');
                $("#loader").hide();
            } else {
                $("#tblSampleBody").html(dataHTML);                    
                $("#loader").hide();
            }
        }
     });
   }    
</script>*/

সমগ্র বিন্দু কৌতুক মনে হচ্ছে যে, আমরা একটি ফর্ম (ক পোস্ট করছেন অংশ রাজো দৃশ্য এর) যার উপর আমরা কলিং একটি Action method, যা আয়: একটি FileResult, এবং এই FileResultরিটার্ন the Excel File..
এবং ফিল্টার মান পোস্ট করার জন্য, যেমন বললেন, ( এবং যদি আপনার প্রয়োজন হয়), আমি অন্য ক্রিয়ায় একটি পোস্ট অনুরোধ করছি, যেমন বর্ণনা করার চেষ্টা করা হয়েছে ..


-1

আমি Asp.Net ওয়েবফর্ম ব্যবহার করছি এবং আমি কেবল সার্ভার পাশ থেকে একটি ফাইল ডাউনলোড করতে চাই। অনেক নিবন্ধ আছে তবে আমি কেবল প্রাথমিক উত্তর খুঁজে পাচ্ছি না। এখন, আমি একটি প্রাথমিক উপায় চেষ্টা করেছিলাম এবং পেয়েছি।

এটাই আমার সমস্যা।

রানটাইমে আমাকে গতিশীলভাবে প্রচুর ইনপুট বোতাম তৈরি করতে হবে। এবং আমি একটি অনন্য ফাইল নাম্বার দিয়ে প্রতিটি বোতাম ডাউনলোড বোতামে যুক্ত করতে চাই।

আমি প্রতিটি বোতামটি এই জাতীয়ভাবে তৈরি করি:

fragment += "<div><input type=\"button\" value=\"Create Excel\" onclick=\"CreateExcelFile(" + fileNumber + ");\" /></div>";

প্রতিটি বোতাম এই এজ্যাক্স পদ্ধতিতে কল করে।

$.ajax({
    type: 'POST',
    url: 'index.aspx/CreateExcelFile',
    data: jsonData,
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    success: function (returnValue) {
      window.location = '/Reports/Downloads/' + returnValue.d;
    }
});

তারপরে আমি একটি বেসিক সহজ পদ্ধতি লিখেছিলাম।

[WebMethod]
public static string CreateExcelFile2(string fileNumber)
{
    string filePath = string.Format(@"Form_{0}.xlsx", fileNumber);
    return filePath;
}

আমি এই ফর্মটি_1, ফর্ম 2, ফর্ম 14 তৈরি করছি ... এবং আমি এই প্রোগ্রামটি অন্য প্রোগ্রামের সাথে মুছে ফেলতে যাচ্ছি। তবে যদি রেসপন্স ব্যবহারের মতো ফাইল ডাউনলোড করতে কেবল বাইট অ্যারে প্রেরণের কোনও উপায় থাকে। আমি এটি ব্যবহার করতে চাই

আমি আশা করি এটি যে কারও জন্য উপকারী হবে।


-1

জমা দিন ফর্ম

public ActionResult ExportXls()
{   
 var filePath="";
  CommonHelper.WriteXls(filePath, "Text.xls");
}

 public static void WriteXls(string filePath, string targetFileName)
    {
        if (!String.IsNullOrEmpty(filePath))
        {
            HttpResponse response = HttpContext.Current.Response;
            response.Clear();
            response.Charset = "utf-8";
            response.ContentType = "text/xls";
            response.AddHeader("content-disposition", string.Format("attachment; filename={0}", targetFileName));
            response.BinaryWrite(File.ReadAllBytes(filePath));
            response.End();
        }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.