using ClosedXML.Excel;
using FoodLabeling.Application.Contracts.Dtos.Reports;
namespace FoodLabeling.Application.Helpers;
///
/// Reports — Print Log 全量导出 Excel(列与 Web Print Log 表头对齐)
///
public static class ReportsPrintLogExcelHelper
{
/// 导出表头(与 UI 一致)
public static readonly string[] Headers =
{
"Label ID", "Product Name", "Product Category", "Label Category", "Template", "Printed at", "Printed by", "Location", "Expiration"
};
///
/// 将 Print Log 行写入 xlsx 内存流(工作表名 Print Log)。
///
public static MemoryStream BuildWorkbook(IReadOnlyList rows)
{
var ms = new MemoryStream();
using var wb = new XLWorkbook();
var ws = wb.AddWorksheet("Print Log");
for (var i = 0; i < Headers.Length; i++)
{
ws.Cell(1, i + 1).Value = Headers[i];
ws.Cell(1, i + 1).Style.Font.Bold = true;
}
var r = 2;
foreach (var x in rows)
{
ws.Cell(r, 1).Value = x.LabelCode ?? string.Empty;
ws.Cell(r, 2).Value = x.ProductName ?? string.Empty;
ws.Cell(r, 3).Value = x.ProductCategoryName ?? string.Empty;
ws.Cell(r, 4).Value = x.LabelCategoryName ?? string.Empty;
ws.Cell(r, 5).Value = x.TemplateText ?? string.Empty;
ws.Cell(r, 6).Value = ReportsDateTimeDisplayHelper.FormatPrintedAt(x.PrintedAt);
ws.Cell(r, 7).Value = x.PrintedByName ?? string.Empty;
ws.Cell(r, 8).Value = x.LocationText ?? string.Empty;
ws.Cell(r, 9).Value = x.ExpiryDateText ?? string.Empty;
r++;
}
ws.Columns().AdjustToContents();
wb.SaveAs(ms);
ms.Position = 0;
return ms;
}
}