Files
declaratrions-automatization/DeclarationAutomatization/Services/ExcelExportService.cs
T
Dianaka123 059895d1c3 feat: WPF-приложение для автоматизации оформления деклараций
- Чтение СПРАВКИ из Excel (ClosedXML), поддержка нескольких файлов
- Группировка по ТН ВЭД: схлопывание строк с суммированием кол-ва/веса/суммы
- Автоназначение кодов деклараций по справочнику ТН ВЭД (87 пар)
- Цветовая маркировка: зелёный/жёлтый/красный по уровню уверенности
- Самообучение: ручной выбор кода сохраняется в tnved_codes.json
- Формирование Лист3 с разворачиванием строк по рег. номерам (ключевая функция)
- Экспорт Лист2 + Лист3 в Excel
2026-04-05 23:19:58 +03:00

130 lines
4.5 KiB
C#

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<DeclarationItem> declarationItems,
IEnumerable<Sheet3Row> sheet3Rows)
{
using var workbook = new XLWorkbook();
WriteSheet2(workbook, declarationItems);
WriteSheet3(workbook, sheet3Rows);
workbook.SaveAs(outputPath);
}
private static void WriteSheet2(XLWorkbook workbook, IEnumerable<DeclarationItem> 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<Sheet3Row> 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();
}
}