using System; using AsbCloudApp.Data.Trajectory; using ClosedXML.Excel; using System.IO; using System.Linq; using System.Reflection; using AsbCloudApp.Data; using AsbCloudApp.Requests.ParserOptions; namespace AsbCloudInfrastructure.Services.Trajectory.Parser; public abstract class TrajectoryParserService : ParserServiceBase where T : TrajectoryGeoDto { private const int HeaderRowsCount = 2; private const int ColumnCount = 6; protected TrajectoryParserService(IServiceProvider serviceProvider) : base(serviceProvider) { } protected abstract string SheetName { get; } protected abstract string TemplateFileName { get; } protected abstract ValidationResultDto ParseRow(IXLRow row); public override Stream GetTemplateFile() => Assembly.GetExecutingAssembly().GetTemplateCopyStream(TemplateFileName) ?? throw new ArgumentNullException($"Файл '{TemplateFileName}' не найден"); public override ParserResultDto Parse(Stream file, IParserOptionsRequest options) { using var workbook = new XLWorkbook(file, XLEventTracking.Disabled); var sheet = workbook.Worksheets.FirstOrDefault(ws => ws.Name.ToLower().Trim() == SheetName.ToLower().Trim()) ?? throw new FileFormatException($"Книга excel не содержит листа {SheetName}."); var trajectoryRows = ParseExcelSheet(sheet, ParseRow, ColumnCount, HeaderRowsCount); return trajectoryRows; } }