NejCommon.NET/Controllers/ResponseEnricher.cs

49 lines
1.7 KiB
C#

using System.Text;
using System.Xml;
using System.Xml.Serialization;
using ClosedXML.Excel;
using Microsoft.AspNetCore.Http.HttpResults;
using Microsoft.AspNetCore.Mvc;
namespace NejCommon.Controllers;
public static class Responses
{
public static FileStreamHttpResult RespondFileStream(this ControllerBase controller, Stream stream, string contentType, string fileName)
{
stream.Seek(0, SeekOrigin.Begin);
controller.Response.Headers.Add("Content-Disposition", "inline; filename=" + fileName);
return TypedResults.File(stream, contentType, fileName);
}
public static FileStreamHttpResult RespondXlsx(this ControllerBase controller, XLWorkbook file, string fileName)
{
var stream = new MemoryStream();
file.SaveAs(stream);
return RespondFileStream(controller, stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName);
}
public static FileStreamHttpResult RespondXlsxTable<T>(this ControllerBase controller, IEnumerable<T> data, string name = "Data", string? sheetName = null)
{
if (sheetName is null)
{
//limit the name to 31 characters
sheetName = name.Length > 31 ? name.Substring(0, 31) : name;
}
var notebook = new XLWorkbook();
var sheet = notebook.Worksheets.Add(sheetName);
sheet.FirstCell().InsertTable(data);
sheet.Columns().AdjustToContents();
return controller.RespondXlsx(notebook, name + ".xlsx");
}
public static FileStreamHttpResult RespondXml<T>(this ControllerBase controller, T obj, string fileName = "Data.xml")
{
var stream = Utils.Xml.Serialize(obj);
return RespondFileStream(controller, stream, "text/xml", fileName);
}
}