Я пытаюсь экспортировать таблицу в Excel со страницы ASP.NET Core Razor. Я создал IEnumerable с именем Delays и использовал его для отображения таблицы и применения сортировки.
Теперь я хочу экспортировать ту же отсортированную таблицу в Excel, но эта IEnumerable становится нулевой после выхода из метода Get(). Как мне сохранить это отсортированное и отфильтрованное IEnumerable после метода Get()? Или я могу создать еще один IEnumerable и скопировать один из другого?
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using SMS_Automation.Data;
using SMS_Automation.Model;
using OfficeOpenXml;
using Microsoft.EntityFrameworkCore;
using System.Linq;
using System.IO;
namespace SMS_Automation.Pages
{
public class delay_viewModel : PageModel
{
private readonly ApplicationDbContex _db;
public IEnumerable<Delay_Model> Delays { get; set; }
public delay_viewModel(ApplicationDbContex db)
{
_db = db;
}
public void OnGet()
{
Delays = _db.Delay;
Delays = Delays.OrderByDescending(s => s.Agency);
}
public async Task<IActionResult> OnPostExportExcelAsync()
{
// above code loads the data using LINQ with EF (query of table), you can substitute this with any data source.
var stream = new MemoryStream();
using (var package = new ExcelPackage(stream))
{
var workSheet = package.Workbook.Worksheets.Add("Sheet1");
workSheet.Cells.LoadFromCollection(Delays, true);
workSheet.Column(4).Style.Numberformat.Format = "dd-MM-YYYY hh:mm";
workSheet.Column(5).Style.Numberformat.Format = "dd-MM-YYYY hh:mm";
workSheet.Column(10).Style.Numberformat.Format = "dd-MM-YYYY hh:mm";
workSheet.Cells.AutoFitColumns();
package.Save();
}
stream.Position = 0;
// I define the name of the file using the current datetime
string excelName = $"Delays-{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.xlsx";
// This will be the actual export
return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", excelName);
}
}
}
Я пытался совместить одно IEnumerable с другим, но не получилось.
Вы пытались материализовать запрос: Delays = Delays.OrderByDescending(,,,).ToList()?





HTTP не имеет состояния. Состояние, заданное в одном запросе, недоступно в другом. Это по дизайну. Если вы хотите работать с данными в обработчике запросов Post, вам нужно создать их там.
public async Task<IActionResult> OnPostExportExcelAsync()
{
// instantiate Delays here
Delays = _db.Delay.OrderByDescending(s => s.Agency);
var stream = new MemoryStream();
using (var package = new ExcelPackage(stream))
{
var workSheet = package.Workbook.Worksheets.Add("Sheet1");
workSheet.Cells.LoadFromCollection(Delays, true);
workSheet.Column(4).Style.Numberformat.Format = "dd-MM-YYYY hh:mm";
workSheet.Column(5).Style.Numberformat.Format = "dd-MM-YYYY hh:mm";
workSheet.Column(10).Style.Numberformat.Format = "dd-MM-YYYY hh:mm";
workSheet.Cells.AutoFitColumns();
package.Save();
}
stream.Position = 0;
string excelName = $"Delays-{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.xlsx";
return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", excelName);
}
Спасибо, Майк. Это работает. Но что, если я передаю строку из формы и фильтрую данные на основе этого, чтобы сначала отобразить отфильтрованные данные, а затем я хочу экспортировать тот же список в Excel?
@AnveshJadav Используйте привязку модели: Learnrazorpages.com/razor-pages/model-binding
Здесь строка workSheet.Cells.LoadFromCollection(Delays, true); выдает нулевую ошибку