首页 > 解决方案 > 如果DataTable中的记录数超过AJAX成功调用的1条lac记录,如何自动下载excel文件?

问题描述

我有一个包含超过 100 000 条记录的数据表。我正在尝试在 excel 中导出该数据,如果记录数超过 100k,我希望自动下载。

在控制器动作方法中:

if (res.Count > 40000)
{
  ExportDataToExcel(parameters);
}

然后我创建了一个函数:

public void ExportDataToExcel(some parameters)
         {


             DataTable tbl = new DataTable("SomeReport");
             tbl = objCommon.GetGridDataTableFormat(some parameters);// this function is fetching me `datatable` 


             tbl.TableName = "Report";
               using (XLWorkbook wb = new XLWorkbook())
               {

                   wb.Worksheets.Add(tbl);
                  // wb.SaveAs("DiscountReport-" + DateTime.Now);
                   wb.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
                   wb.Style.Font.Bold = true;

                 Response.Clear();
                 Response.Buffer = true;
                 Response.Charset = "";
                 Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                 Response.AddHeader("content-disposition", "attachment;filename= DiscountReport.xlsx");

                 using (MemoryStream MyMemoryStream = new MemoryStream())
                 {
                     wb.SaveAs(MyMemoryStream);
                     MyMemoryStream.WriteTo(Response.OutputStream);
                     Response.Flush();
                     Response.End();
                 }

               }

在此之后它返回 Ajax,成功:

 success: function(data) {

something 
}

上述函数参数部分的数据如下:

数据传入成功函数的参数

我只需要将这些数据导出到excel并自动下载。可以吗?或者我应该改变我的方法。

编辑:@palash:
我一定在实现部分做错了什么。有点像用勺子喂食的感觉。但这是我在理解逻辑后实现您的代码的方式。:

 $.ajax({
                    url: '/Reports/_GetDiscountGrid',
                    data: {
                        State: stat,
                        Zone: zon,
                        Amrac: amr,
                        Store: store,
                        Hierarchy: hirarcy,
                        DiscountType: discountType,
                        Itemcategorycode: itemcatCode,
                        Itemcode: code,
                        Period: period,
                        OfferNo: offernumber
                    },
                    datatype: "html",
                    type:"GET",
                    success: function(data) {
                        $('#tbldiscountDIV').empty();

                        if (typeof (data) == "string") {
                            $('#tbldiscountDIV2').show();
                            DownLoadSheet(data, "DiscountReport.xlsx");
                        }

在此之后,我定义为:

function DownLoadSheet(data,fileName)
     {

         const a = document.createElement("a");
         document.body.appendChild(a);
        a.style="display:none";
        return function (data,fileName)
        {
            const blob = new Blob([data], { type: "application/vnd.openxmlfomrats-officedocument.spreadsheetml.sheet" }),
                url = window.URL.createObjectURL(blob);
            a.href=url;
            a.download=fileName;
            a.click();
            window.URL.revokeObjectURL(url);
         }//return for function end
         a.href = url;
         var temp = blob;
     }

在它返回 AJAX 调用并退出之后。我发现目标和下载参数是空的,我哪里出错了?

[excel格式的数据][2]

标签: jqueryajaxasp.net-mvc

解决方案


在该success方法中,实际上 xlsx 文件作为响应返回。你可以像这样下载它:

const DownloadSheet = (function() {
  const a = document.createElement("a");
  document.body.appendChild(a);
  a.style = "display: none";
  return function(data, fileName) {
    const blob = new Blob([data], {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}),
      url = window.URL.createObjectURL(blob);
    a.href = url;
    a.download = fileName;
    a.click();
    window.URL.revokeObjectURL(url);
  };
}());

$.ajax({
  type: "GET",
  url: url,
  success: function(response) {
     DownloadSheet(response, 'DiscountReport.xlsx')
  }
});

推荐阅读