697ae44519
- Загрузка одного .xlsx (СПРАВКА + Лист1 в одном файле) - Рег. номера берутся из СПРАВКА автоматически, группируются по (ТН ВЭД, Страна) - Отдельный опциональный справочник кодов (CodesImportService) - Фильтры: Все / Авто / Проверить / Нет кода / Без нетто - Таблица сразу отсортирована по ТН ВЭД с живым обновлением п/п - Начальный п/п: поле в UI, автоинкремент после экспорта - Лист2: рамки, жёлтая строка при >1 рег. номере, итого по кол-ву - Лист3: ТН ВЭД в колонке B вместо константы 09035 - Красный ErrorMessage под кнопкой загрузки, удалён SpravkaFileEntry
49 lines
1.5 KiB
C#
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;
|
|
}
|
|
}
|