在 Excel 中下载数据的 Ajax 调用不起作用

问题描述 投票:0回答:1

我在 .NET Core 中编写了代码,通过手动调用操作方法来下载 Excel 中的数据。

但是当我们使用 jQuery Ajax 调用相同的操作时,相同的代码将无法工作。

我尝试在网上查看一些文章但没有成功。

我的操作很简单,我将本月参数传递到控制器中并下载本月数据。如上所述,手动调用可以工作,但 Ajax 调用不会下载文件。

控制器动作方法

public IActionResult Tasksheet()
{
    using var workbook = new XLWorkbook();
    var worksheet = workbook.Worksheets.Add("DefectEfforts");
    
    var currentRow = 1;
 
    var startDate = DateTime.Now.Date;
    startDate = new DateTime(startDate.Year, startDate.Month, 1);

    var endDate = startDate.AddMonths(1).AddSeconds(-1);
    var model = db.DefectEfforts.Where(x => x.ActualStartDate >= startDate && x.ActualStartDate < endDate).ToList();

    worksheet.Cell(currentRow, 1).Value = "Project";
    worksheet.Cell(currentRow, 2).Value = "Task";
    worksheet.Cell(currentRow, 3).Value = "Status";
    worksheet.Cell(currentRow, 4).Value = "Responsible";

    foreach (var user in model)
    {
        currentRow++;
        worksheet.Cell(currentRow, 2).Value = user.ProjectSubtask;
        worksheet.Cell(currentRow, 3).Value = user.Effortstatus;
        worksheet.Cell(currentRow, 4).Value = user.UserName;
        worksheet.Cell(currentRow, 1).Value = user.Projectname;
    }
    
    using var stream = new MemoryStream();
    workbook.SaveAs(stream);
    var content = stream.ToArray();

    return File(content, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "MontlyTasks.xlsx");
}

Ajax 调用

$('#extractData').click(function (e) {
    e.preventDefault()

    //var pds = $('#preDefinedSelect :selected').val()

    //alert(pds)

    $.ajax({
        type: "POST",
        url: "/Task/Tasksheet",
        success: function (result) {
            alert("Export generated")
        }, error: function() {
            alert("Failed to export data")
        }

    })
})

控制器生成的值

generated value

非常感谢任何建议。

jquery ajax asp.net-core-mvc
1个回答
0
投票

我的操作很简单,我将这个月份的参数传递给 控制器并下载本月的数据。正如刚才提到的 手动调用有效,但 Ajax 调用不下载文件

根据您共享的代码片段和描述,由于您的ajax功能,您关心获得意外结果,因为您没有成功决定任何事情。

执行Tasksheet方法后,返回FileContentResult给Ajax成功函数,但里面什么也没有。

为了下载 Excel,您需要一种额外的下载方法,应在 ajax 成功函数内调用该方法,使用

window.location
重定向到控制器中的 DownloadExcel 操作。

让我们看看实践:

public virtual ActionResult DownloadExcel()
{
    TempData["file"] = "This is sample";

   
    string fileContent = TempData["file"] as string;
    byte[] content = Encoding.UTF8.GetBytes(fileContent);

    // Return the file with the appropriate content type and filename
    return File(content, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "MonthlyTasks.xlsx");

}

阿贾克斯:

<button type="button" name="submitButton" value="Edit" class="btn btn-primary"
        onclick="GetAjaxResponse()">
    Submit Request
</button>



@section scripts {
    <script>
        function GetAjaxResponse() {
            $.ajax({
                type: "POST",
                url: "/NullModel/Tasksheet",
                success: function (result) {
                    window.location = '/ControllerName/DownloadExcel';
                }, error: function () {
                    alert("Failed to export data")
                }

            })

        }
    </script>
}

输出:

enter image description here enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.