Files
Dianaka123 697ae44519 feat: единый файл Лист1+СПРАВКА, фильтры, сортировка, живой п/п
- Загрузка одного .xlsx (СПРАВКА + Лист1 в одном файле)
- Рег. номера берутся из СПРАВКА автоматически, группируются по (ТН ВЭД, Страна)
- Отдельный опциональный справочник кодов (CodesImportService)
- Фильтры: Все / Авто / Проверить / Нет кода / Без нетто
- Таблица сразу отсортирована по ТН ВЭД с живым обновлением п/п
- Начальный п/п: поле в UI, автоинкремент после экспорта
- Лист2: рамки, жёлтая строка при >1 рег. номере, итого по кол-ву
- Лист3: ТН ВЭД в колонке B вместо константы 09035
- Красный ErrorMessage под кнопкой загрузки, удалён SpravkaFileEntry
2026-04-07 11:47:31 +03:00

49 lines
1.5 KiB
C#

using System;
using System.Collections.Generic;
using ClosedXML.Excel;
using DeclarationAutomatization.Models;
namespace DeclarationAutomatization.Services;
// Читает справочник ТН ВЭД → код декларации из внешнего xlsx-файла.
// Ожидаемый формат: лист "новые", колонка B = ТН ВЭД, колонка C = код.
public class CodesImportService
{
private const string SheetName = "новые";
public List<CodeLookupEntry> ReadEntries(string filePath)
{
using var workbook = new XLWorkbook(filePath);
IXLWorksheet? sheet = null;
foreach (var ws in workbook.Worksheets)
{
if (ws.Name.Equals(SheetName, StringComparison.OrdinalIgnoreCase))
{ sheet = ws; break; }
}
if (sheet == null)
throw new InvalidOperationException($"Лист '{SheetName}' не найден в файле: {filePath}");
var result = new List<CodeLookupEntry>();
int lastRow = sheet.LastRowUsed()?.RowNumber() ?? 1;
for (int r = 1; r <= lastRow; r++)
{
var tnVed = sheet.Cell(r, 2).GetString().Trim();
var code = sheet.Cell(r, 3).GetString().Trim();
if (tnVed.Length != 10 || string.IsNullOrWhiteSpace(code))
continue;
result.Add(new CodeLookupEntry
{
TnVed = tnVed,
Codes = new List<string> { code },
});
}
return result;
}
}