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 RespondXlsx(this ControllerBase controller, XLWorkbook file, string fileName) { var stream = new MemoryStream(); file.SaveAs(stream); stream.Seek(0, SeekOrigin.Begin); controller.Response.Headers.Add("Content-Disposition", "inline; filename=" + fileName); return TypedResults.File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName); } public static FileStreamHttpResult RespondXlsxTable(this ControllerBase controller, IEnumerable 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(this ControllerBase controller, T obj, string fileName = "Data.xml") { var stream = new MemoryStream(); //use utf8 encoding var serializer = new XmlSerializer(typeof(T)); var settings = new XmlWriterSettings { Indent = true, Encoding = Encoding.UTF8, }; //Console.Writeline(stream.Length); using (var writer = XmlWriter.Create(stream, settings)) { serializer.Serialize(writer, obj); //Console.Writeline(stream.Length); stream.Seek(0, SeekOrigin.Begin); controller.Response.Headers.Add("Content-Disposition", "inline; filename=" + fileName); return TypedResults.File(stream, "text/xml", fileName); } } }