我在 .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")
}
})
})
控制器生成的值
非常感谢任何建议。
我的操作很简单,我将这个月份的参数传递给 控制器并下载本月的数据。正如刚才提到的 手动调用有效,但 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>
}
输出: