using System.Collections.Generic; using System.Drawing; using ClosedXML.Excel; using DeclarationAutomatization.Models; namespace DeclarationAutomatization.Services; public class ExcelExportService { public void Export( string outputPath, IEnumerable declarationItems, IEnumerable sheet3Rows) { using var workbook = new XLWorkbook(); WriteSheet2(workbook, declarationItems); WriteSheet3(workbook, sheet3Rows); workbook.SaveAs(outputPath); } private static void WriteSheet2(XLWorkbook workbook, IEnumerable items) { var ws = workbook.Worksheets.Add("Лист2"); // Заголовки var headers = new[] { "п/п", "Наименование, характеристика, сорт, артикул товара", "ТН ВЭД", "Страна ID", "Количество,шт.", "Сумма с учетом НДС, руб. РФ", "ВЕС брутто, КГ", "Масса нетто, КГ", "Код декларации", "Регистрационный номер", "Дата регистрационного номера" }; for (int c = 0; c < headers.Length; c++) { var cell = ws.Cell(1, c + 1); cell.Value = headers[c]; cell.Style.Font.Bold = true; cell.Style.Fill.BackgroundColor = XLColor.LightGray; } int row = 2; decimal totalAmount = 0, totalGross = 0, totalNet = 0; foreach (var item in items) { ws.Cell(row, 1).Value = item.SequentialNumber; ws.Cell(row, 2).Value = item.Description; ws.Cell(row, 3).Value = item.TnVed; ws.Cell(row, 4).Value = item.CountryId; ws.Cell(row, 5).Value = item.Quantity; ws.Cell(row, 6).Value = item.AmountWithVat; ws.Cell(row, 7).Value = item.GrossWeight; ws.Cell(row, 8).Value = item.NetWeight; ws.Cell(row, 9).Value = item.DeclarationCode; ws.Cell(row, 10).Value = item.RegNumber; ws.Cell(row, 11).Value = item.RegDate; // Цветовая маркировка строк по уровню уверенности var rowStyle = ws.Row(row).Style; var fillColor = item.Confidence switch { ConfidenceLevel.Auto => XLColor.FromArgb(198, 239, 206), // светло-зелёный ConfidenceLevel.Review => XLColor.FromArgb(255, 235, 156), // светло-жёлтый ConfidenceLevel.Missing => XLColor.FromArgb(255, 199, 206), // светло-красный _ => XLColor.White }; ws.Row(row).Style.Fill.BackgroundColor = fillColor; totalAmount += item.AmountWithVat; totalGross += item.GrossWeight; totalNet += item.NetWeight; row++; } // Итоговая строка ws.Cell(row, 5).Value = "ИТОГО:"; ws.Cell(row, 5).Style.Font.Bold = true; ws.Cell(row, 6).Value = totalAmount; ws.Cell(row, 7).Value = totalGross; ws.Cell(row, 8).Value = totalNet; ws.Row(row).Style.Font.Bold = true; ws.Columns().AdjustToContents(); ws.Column(2).Width = 50; // описание — широкая колонка } private static void WriteSheet3(XLWorkbook workbook, IEnumerable rows) { var ws = workbook.Worksheets.Add("Лист3"); var headers = new[] { "п/п", "Наименование (классификатор)", "Регистрационный номер", "Дата регистрационного номера" }; for (int c = 0; c < headers.Length; c++) { var cell = ws.Cell(1, c + 1); cell.Value = headers[c]; cell.Style.Font.Bold = true; cell.Style.Fill.BackgroundColor = XLColor.LightGray; } int row = 2; foreach (var r in rows) { ws.Cell(row, 1).Value = r.SequentialNumber; ws.Cell(row, 2).Value = r.ClassifierCode; ws.Cell(row, 3).Value = r.RegNumber; ws.Cell(row, 4).Value = r.RegDate; row++; } ws.Columns().AdjustToContents(); } }