NejCommon.NET/Controllers/ResponseEnricher.cs
2025-09-11 13:34:29 +02:00

83 lines
2.8 KiB
C#

using System.Globalization;
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 string ToAscii(string input)
{
if (string.IsNullOrEmpty(input))
return input;
// Normalize to FormD (decomposition)
string normalized = input.Normalize(NormalizationForm.FormD);
var sb = new StringBuilder();
foreach (char c in normalized)
{
var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c);
// Skip non-spacing marks (accents, umlauts, etc.)
if (unicodeCategory != UnicodeCategory.NonSpacingMark)
{
sb.Append(c);
}
}
// Normalize back to FormC and remove any remaining non-ASCII chars
string cleaned = sb.ToString().Normalize(NormalizationForm.FormC);
// Ensure only ASCII characters remain
var ascii = new StringBuilder();
foreach (char c in cleaned)
{
ascii.Append(c <= 127 ? c : '?'); // replace non-ASCII with '?' or remove
}
return ascii.ToString();
}
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=" + ToAscii(fileName.Normalize(NormalizationForm.FormD)));
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);
}
}