From 0b95361b69a08dab0b7079241c996130a73be974 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Fri, 29 Sep 2023 16:48:59 +0500 Subject: [PATCH] =?UTF-8?q?=D0=92=D1=8B=D0=BD=D0=B5=D1=81=20=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D0=BE=D0=B4=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=B2=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20=D1=80=D0=B0=D1=81?= =?UTF-8?q?=D1=88=D0=B8=D1=80=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/DailyReport/XLExtentions.cs | 161 ---------------- .../ProcessMap/ProcessMapPlanImportService.cs | 49 ++--- .../PlannedTrajectoryImportService.cs | 36 ++-- .../WellOperationDefaultExcelParser.cs | 30 +-- .../WellOperationGazpromKhantosExcelParser.cs | 29 +-- AsbCloudInfrastructure/XLExtentions.cs | 176 ++++++++++++++++++ 6 files changed, 218 insertions(+), 263 deletions(-) delete mode 100644 AsbCloudInfrastructure/Services/DailyReport/XLExtentions.cs create mode 100644 AsbCloudInfrastructure/XLExtentions.cs diff --git a/AsbCloudInfrastructure/Services/DailyReport/XLExtentions.cs b/AsbCloudInfrastructure/Services/DailyReport/XLExtentions.cs deleted file mode 100644 index 30eee683..00000000 --- a/AsbCloudInfrastructure/Services/DailyReport/XLExtentions.cs +++ /dev/null @@ -1,161 +0,0 @@ -using ClosedXML.Excel; -using System; - -namespace AsbCloudInfrastructure.Services.DailyReport -{ - - internal static class XLExtentions - { - public static IXLRange _SetValue(this IXLRange range, object value) - { - var mergedRange = range.Merge(); - mergedRange.FirstCell()._SetValue(value); - var colWidth = mergedRange.FirstCell().WorksheetColumn().Width; - var maxCharsToWrap = colWidth / (0.1d * mergedRange.FirstCell().Style.Font.FontSize); - if (value is string valueString && valueString.Length > maxCharsToWrap) - { - var row = mergedRange.FirstCell().WorksheetRow(); - var baseHeight = row.Height; - row.Height = 0.5d * baseHeight * Math.Ceiling(1d + valueString.Length / maxCharsToWrap); - } - mergedRange.Style.SetAllBorders() - .Alignment.SetWrapText(true); - return mergedRange; - } - - public static IXLCell _SetValue(this IXLCell cell, object value) - { - switch (value) - { - case DateTime dateTime: - cell._SetValue(dateTime); - break; - case IFormattable formattable: - cell._SetValue(formattable); - break; - case string valueString: - cell._SetValue(valueString); - break; - default: - cell.Value = value; - break; - } - - return cell; - } - - public static IXLCell _SetValue(this IXLCell cell, string value, bool adaptRowHeight = false) - { - cell.Value = value; - cell.Style - .SetAllBorders() - .Alignment.WrapText = true; - - cell.Value = value; - if (adaptRowHeight) - { - var colWidth = cell.WorksheetColumn().Width; - var maxCharsToWrap = colWidth / (0.1d * cell.Style.Font.FontSize); - if (value.Length > maxCharsToWrap) - { - var row = cell.WorksheetRow(); - var baseHeight = row.Height; - row.Height = 0.5d * baseHeight * Math.Ceiling(1d + value.Length / maxCharsToWrap); - } - } - - return cell; - } - - public static IXLCell _ValueNoBorder(this IXLCell cell, string value, bool adaptRowHeight = false) - { - cell.Value = value; - cell.Style.Alignment.WrapText = true; - - cell.Value = value; - if (adaptRowHeight) - { - var colWidth = cell.WorksheetColumn().Width; - var maxCharsToWrap = colWidth / (0.1d * cell.Style.Font.FontSize); - if (value.Length > maxCharsToWrap) - { - var row = cell.WorksheetRow(); - var baseHeight = row.Height; - row.Height = 0.5d * baseHeight * Math.Ceiling(1d + value.Length / maxCharsToWrap); - } - } - - return cell; - } - - - - - public static IXLCell _SetValue(this IXLCell cell, DateTime value, string dateFormat = "DD.MM.YYYY HH:MM:SS") - { - cell.Value = value; - cell.Style - .SetAllBorders() - .Alignment.WrapText = true; - - cell.Value = value; - - cell.DataType = XLDataType.DateTime; - cell.Style.DateFormat.Format = "DD.MM.YYYY HH:MM:SS"; - - return cell; - } - - public static IXLCell _SetValue(this IXLCell cell, IFormattable value, string format = "0.00") - { - cell.Value = value; - cell.Style - .SetAllBorders() - .Alignment.WrapText = true; - - cell.Value = value; - - cell.DataType = XLDataType.Number; - cell.Style.NumberFormat.Format = "0.00"; - - return cell; - } - - public static IXLStyle SetAllBorders(this IXLStyle style, XLBorderStyleValues borderStyle = XLBorderStyleValues.Thin) - { - style.Border.RightBorder = borderStyle; - style.Border.LeftBorder = borderStyle; - style.Border.TopBorder = borderStyle; - style.Border.BottomBorder = borderStyle; - style.Border.InsideBorder = borderStyle; - style.Border.OutsideBorder = borderStyle; - return style; - } - - public static IXLStyle SetBaseFont(this IXLStyle style) - { - style.Font.FontName = "Calibri"; - style.Font.FontSize = 10; - return style; - } - - public static IXLStyle SetH1(this IXLStyle style) - { - style.Font.FontName = "Calibri"; - style.Font.FontSize = 14; - return style; - } - - /// - /// Костыль исправляющий проблему в библиотеке IXLRange Range(this IXLWorksheet, IXLAddress, IXLAddress) с кастингом IXLAddress к XLAddress. - /// - /// - /// - /// - /// - public static IXLRange _Range(this IXLWorksheet sheet, CellAddress begin, CellAddress end) - => sheet.Range(begin.RowNumber, begin.ColumnNumber, end.RowNumber, end.ColumnNumber); - - } - -} diff --git a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapPlanImportService.cs b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapPlanImportService.cs index e8185a34..7ff6ecf2 100644 --- a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapPlanImportService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapPlanImportService.cs @@ -187,23 +187,23 @@ public class ProcessMapPlanImportService : IProcessMapPlanImportService private ProcessMapPlanDto ParseRow(IXLRow row) { - var wellSectionTypeCaption = GetCellValue(row, columnWellSectionType).Trim().ToLower(); - var modeName = GetCellValue(row, columnMode).Trim().ToLower(); - var depthStart = GetCellValue(row, columnDepthStart); - var depthEnd = GetCellValue(row, columnDepthEnd); - var pressurePlan = GetCellValue(row, columnPressurePlan); - var pressureLimitMax = GetCellValue(row, columnPressureLimitMax); - var axialLoadPlan = GetCellValue(row, columnAxialLoadPlan); - var axialLoadLimitMax = GetCellValue(row, columnAxialLoadLimitMax); - var topDriveTorquePlan = GetCellValue(row, columnTopDriveTorquePlan); - var topDriveTorqueLimitMax = GetCellValue(row, columnTopDriveTorqueLimitMax); - var topDriveSpeedPlan = GetCellValue(row, columnTopDriveSpeedPlan); - var topDriveSpeedLimitMax = GetCellValue(row, columnTopDriveSpeedLimitMax); - var flowPlan = GetCellValue(row, columnFlowPlan); - var flowLimitMax = GetCellValue(row, columnFlowLimitMax); - var ropPlan = GetCellValue(row, columnRopPlan); - var usageSaub = GetCellValue(row, columnUsageSaub); - var usageSpin = GetCellValue(row, columnUsageSpin); + var wellSectionTypeCaption = row.Cell(columnWellSectionType).GetCellValue().Trim().ToLower(); + var modeName = row.Cell(columnMode).GetCellValue().Trim().ToLower(); + var depthStart = row.Cell(columnDepthStart).GetCellValue(); + var depthEnd = row.Cell(columnDepthEnd).GetCellValue(); + var pressurePlan = row.Cell(columnPressurePlan).GetCellValue(); + var pressureLimitMax = row.Cell(columnPressureLimitMax).GetCellValue(); + var axialLoadPlan = row.Cell(columnAxialLoadPlan).GetCellValue(); + var axialLoadLimitMax = row.Cell(columnAxialLoadLimitMax).GetCellValue(); + var topDriveTorquePlan = row.Cell(columnTopDriveTorquePlan).GetCellValue(); + var topDriveTorqueLimitMax = row.Cell(columnTopDriveTorqueLimitMax).GetCellValue(); + var topDriveSpeedPlan = row.Cell(columnTopDriveSpeedPlan).GetCellValue(); + var topDriveSpeedLimitMax = row.Cell(columnTopDriveSpeedLimitMax).GetCellValue(); + var flowPlan = row.Cell(columnFlowPlan).GetCellValue(); + var flowLimitMax = row.Cell(columnFlowLimitMax).GetCellValue(); + var ropPlan = row.Cell(columnRopPlan).GetCellValue(); + var usageSaub = row.Cell(columnUsageSaub).GetCellValue(); + var usageSpin = row.Cell(columnUsageSpin).GetCellValue(); var wellSection = sections.FirstOrDefault(s => s.Caption.Trim().ToLower() == wellSectionTypeCaption) ?? throw new FileFormatException( @@ -342,19 +342,4 @@ public class ProcessMapPlanImportService : IProcessMapPlanImportService 2 => "Слайд", _ => "Ручной", }; - - //TODO: вынести в метод расширения - private static T GetCellValue(IXLRow row, int columnNumber) - { - try - { - var cell = row.Cell(columnNumber); - return (T)Convert.ChangeType(cell.Value, typeof(T)); - } - catch - { - throw new FileFormatException( - $"Лист {row.Worksheet.Name}. Ячейка: ({row.RowNumber()},{columnNumber}) содержит некорректное значение"); - } - } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/Trajectory/PlannedTrajectoryImportService.cs b/AsbCloudInfrastructure/Services/Trajectory/PlannedTrajectoryImportService.cs index 6ea64efb..ff1c59b6 100644 --- a/AsbCloudInfrastructure/Services/Trajectory/PlannedTrajectoryImportService.cs +++ b/AsbCloudInfrastructure/Services/Trajectory/PlannedTrajectoryImportService.cs @@ -177,32 +177,18 @@ namespace AsbCloudInfrastructure.Services.Trajectory private TrajectoryGeoPlanDto ParseRow(IXLRow row) { - var _wellboreDepth = row.Cell(ColumnWellboreDepth).Value; - var _zenithAngle = row.Cell(ColumnZenithAngle).Value; - var _azimuthGeo = row.Cell(ColumnAzimuthGeo).Value; - var _azimuthMagnetic = row.Cell(ColumnAzimuthMagnetic).Value; - var _verticalDepth = row.Cell(ColumnVerticalDepth).Value; - var _radius = row.Cell(ColumnRadius).Value; - var _comment = row.Cell(ColumnComment).Value; - - var trajectoryRow = new TrajectoryGeoPlanDto(); - - static double getDoubleValue(object value, string nameParam, IXLRow row) + var trajectoryRow = new TrajectoryGeoPlanDto { - if (value is double _value) - return _value; - throw new FileFormatException($"Лист {row.Worksheet.Name}. Строка {row.RowNumber()} - некорректные данные - {nameParam}"); - } - - trajectoryRow.WellboreDepth = getDoubleValue(_wellboreDepth, "Глубина по стволу", row); - trajectoryRow.ZenithAngle = getDoubleValue(_zenithAngle, "Зенитный угол", row); - trajectoryRow.AzimuthGeo = getDoubleValue(_azimuthGeo, "Азимут географический", row); - trajectoryRow.AzimuthMagnetic = getDoubleValue(_azimuthMagnetic, "Азимут магнитный", row); - trajectoryRow.VerticalDepth = getDoubleValue(_verticalDepth, "Глубина вертикальная", row); - trajectoryRow.Radius = getDoubleValue(_radius, "Радиус цели", row); - - if (_comment is not null) - trajectoryRow.Comment = _comment.ToString(); + WellboreDepth = row.Cell(ColumnWellboreDepth).GetCellValue(), + ZenithAngle = row.Cell(ColumnZenithAngle).GetCellValue(), + AzimuthGeo = row.Cell(ColumnAzimuthGeo).GetCellValue(), + AzimuthMagnetic = row.Cell(ColumnAzimuthMagnetic).GetCellValue(), + VerticalDepth = row.Cell(ColumnVerticalDepth).GetCellValue(), + Radius = row.Cell(ColumnRadius).GetCellValue(), + Comment = row.Cell(ColumnComment).IsEmpty() ? null : + row.Cell(ColumnComment).GetCellValue() + }; + return trajectoryRow; } } diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/WellOperationDefaultExcelParser.cs b/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/WellOperationDefaultExcelParser.cs index f5f56612..ef9ed499 100644 --- a/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/WellOperationDefaultExcelParser.cs +++ b/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/WellOperationDefaultExcelParser.cs @@ -79,28 +79,14 @@ public class WellOperationDefaultExcelParser : IWellOperationExcelParser return new RowDto { Number = xlRow.RowNumber(), - Section = GetCellValue(xlRow.Cell(DefaultTemplateInfo.ColumnSection)), - Category = GetCellValue(xlRow.Cell(DefaultTemplateInfo.ColumnCategory)), - CategoryInfo = GetCellValue(xlRow.Cell(DefaultTemplateInfo.ColumnCategoryInfo)), - DepthStart = GetCellValue(xlRow.Cell(DefaultTemplateInfo.ColumnDepthStart)), - DepthEnd = GetCellValue(xlRow.Cell(DefaultTemplateInfo.ColumnDepthEnd)), - Date = GetCellValue(xlRow.Cell(DefaultTemplateInfo.ColumnDate)), - Duration = GetCellValue(xlRow.Cell(DefaultTemplateInfo.ColumnDuration)), - Comment = GetCellValue(xlRow.Cell(DefaultTemplateInfo.ColumnComment)) + Section = xlRow.Cell(DefaultTemplateInfo.ColumnSection).GetCellValue(), + Category = xlRow.Cell(DefaultTemplateInfo.ColumnCategory).GetCellValue(), + CategoryInfo = xlRow.Cell(DefaultTemplateInfo.ColumnCategoryInfo).GetCellValue(), + DepthStart = xlRow.Cell(DefaultTemplateInfo.ColumnDepthStart).GetCellValue(), + DepthEnd = xlRow.Cell(DefaultTemplateInfo.ColumnDepthEnd).GetCellValue(), + Date = xlRow.Cell(DefaultTemplateInfo.ColumnDate).GetCellValue(), + Duration = xlRow.Cell(DefaultTemplateInfo.ColumnDuration).GetCellValue(), + Comment = xlRow.Cell(DefaultTemplateInfo.ColumnComment).GetCellValue() }; } - - //TODO: вынести в метод расширения - private static T GetCellValue(IXLCell cell) - { - try - { - return (T)Convert.ChangeType(cell.Value, typeof(T)); - } - catch - { - throw new FileFormatException( - $"Лист '{cell.Worksheet.Name}'. Ячейка: ({cell.Address.RowNumber},{cell.Address.ColumnNumber}) содержит некорректное значение"); - } - } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/WellOperationGazpromKhantosExcelParser.cs b/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/WellOperationGazpromKhantosExcelParser.cs index 6f0b412d..d1ce47cd 100644 --- a/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/WellOperationGazpromKhantosExcelParser.cs +++ b/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/WellOperationGazpromKhantosExcelParser.cs @@ -97,11 +97,11 @@ public class WellOperationGazpromKhantosExcelParser : IWellOperationExcelParser operations.Add(new Operation { RowNumber = xlRow.RowNumber(), - CategoryInfo = GetCellValue(xlRow.Cell(operationAttributes[OperationAttributes.CategoryInfo])), - SectionDiameter = GetCellValue(xlRow.Cell(operationAttributes[OperationAttributes.SectionDiameter])), - Depth = GetCellValue(xlRow.Cell(operationAttributes[OperationAttributes.Depth])), - Duration = GetCellValue(xlRow.Cell(operationAttributes[OperationAttributes.Duration])), - Date = GetCellValue(xlRow.Cell(operationAttributes[OperationAttributes.Date])) + CategoryInfo = xlRow.Cell(operationAttributes[OperationAttributes.CategoryInfo]).GetCellValue(), + SectionDiameter =xlRow.Cell(operationAttributes[OperationAttributes.SectionDiameter]).GetCellValue(), + Depth = xlRow.Cell(operationAttributes[OperationAttributes.Depth]).GetCellValue(), + Duration = xlRow.Cell(operationAttributes[OperationAttributes.Duration]).GetCellValue(), + Date = xlRow.Cell(operationAttributes[OperationAttributes.Date]).GetCellValue() }); } catch (FileFormatException ex) @@ -183,7 +183,7 @@ public class WellOperationGazpromKhantosExcelParser : IWellOperationExcelParser foreach (var cell in cells) { - var operationAttribute = GetValueDictionary(operationAttributesDict, GetCellValue(cell), 0.7); + var operationAttribute = GetValueDictionary(operationAttributesDict, cell.GetCellValue(), 0.7); if (operationAttribute is null || operationAttributes.Any(a => a.Key == operationAttribute)) continue; @@ -234,21 +234,4 @@ public class WellOperationGazpromKhantosExcelParser : IWellOperationExcelParser .Select(line => line.Split(separator)) .ToDictionary(parts => parts[0].Trim(), parts => parts[1].Trim()); } - - //TODO: вынести в метод расширения - private static T GetCellValue(IXLCell cell) - { - try - { - if (typeof(T) != typeof(DateTime)) - return (T)Convert.ChangeType(cell.GetFormattedString(), typeof(T), CultureInfo.InvariantCulture); - - return (T)(object)DateTime.FromOADate((double)cell.Value); - } - catch - { - throw new FileFormatException( - $"Лист '{cell.Worksheet.Name}'. Ячейка: ({cell.Address.RowNumber},{cell.Address.ColumnNumber}) содержит некорректное значение"); - } - } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/XLExtentions.cs b/AsbCloudInfrastructure/XLExtentions.cs new file mode 100644 index 00000000..ac2a40a1 --- /dev/null +++ b/AsbCloudInfrastructure/XLExtentions.cs @@ -0,0 +1,176 @@ +using ClosedXML.Excel; +using System; +using System.Globalization; +using System.IO; +using AsbCloudInfrastructure.Services.DailyReport; + +namespace AsbCloudInfrastructure; + +internal static class XLExtentions +{ + internal static IXLRange _SetValue(this IXLRange range, object value) + { + var mergedRange = range.Merge(); + mergedRange.FirstCell()._SetValue(value); + var colWidth = mergedRange.FirstCell().WorksheetColumn().Width; + var maxCharsToWrap = colWidth / (0.1d * mergedRange.FirstCell().Style.Font.FontSize); + if (value is string valueString && valueString.Length > maxCharsToWrap) + { + var row = mergedRange.FirstCell().WorksheetRow(); + var baseHeight = row.Height; + row.Height = 0.5d * baseHeight * Math.Ceiling(1d + valueString.Length / maxCharsToWrap); + } + + mergedRange.Style.SetAllBorders() + .Alignment.SetWrapText(true); + return mergedRange; + } + + internal static IXLCell _SetValue(this IXLCell cell, object value) + { + switch (value) + { + case DateTime dateTime: + cell._SetValue(dateTime); + break; + case IFormattable formattable: + cell._SetValue(formattable); + break; + case string valueString: + cell._SetValue(valueString); + break; + default: + cell.Value = value; + break; + } + + return cell; + } + + internal static IXLCell _SetValue(this IXLCell cell, string value, bool adaptRowHeight = false) + { + cell.Value = value; + cell.Style + .SetAllBorders() + .Alignment.WrapText = true; + + cell.Value = value; + if (adaptRowHeight) + { + var colWidth = cell.WorksheetColumn().Width; + var maxCharsToWrap = colWidth / (0.1d * cell.Style.Font.FontSize); + if (value.Length > maxCharsToWrap) + { + var row = cell.WorksheetRow(); + var baseHeight = row.Height; + row.Height = 0.5d * baseHeight * Math.Ceiling(1d + value.Length / maxCharsToWrap); + } + } + + return cell; + } + + internal static IXLCell _ValueNoBorder(this IXLCell cell, string value, bool adaptRowHeight = false) + { + cell.Value = value; + cell.Style.Alignment.WrapText = true; + + cell.Value = value; + if (adaptRowHeight) + { + var colWidth = cell.WorksheetColumn().Width; + var maxCharsToWrap = colWidth / (0.1d * cell.Style.Font.FontSize); + if (value.Length > maxCharsToWrap) + { + var row = cell.WorksheetRow(); + var baseHeight = row.Height; + row.Height = 0.5d * baseHeight * Math.Ceiling(1d + value.Length / maxCharsToWrap); + } + } + + return cell; + } + + + internal static IXLCell _SetValue(this IXLCell cell, DateTime value, string dateFormat = "DD.MM.YYYY HH:MM:SS") + { + cell.Value = value; + cell.Style + .SetAllBorders() + .Alignment.WrapText = true; + + cell.Value = value; + + cell.DataType = XLDataType.DateTime; + cell.Style.DateFormat.Format = "DD.MM.YYYY HH:MM:SS"; + + return cell; + } + + internal static IXLCell _SetValue(this IXLCell cell, IFormattable value, string format = "0.00") + { + cell.Value = value; + cell.Style + .SetAllBorders() + .Alignment.WrapText = true; + + cell.Value = value; + + cell.DataType = XLDataType.Number; + cell.Style.NumberFormat.Format = "0.00"; + + return cell; + } + + internal static IXLStyle SetAllBorders(this IXLStyle style, XLBorderStyleValues borderStyle = XLBorderStyleValues.Thin) + { + style.Border.RightBorder = borderStyle; + style.Border.LeftBorder = borderStyle; + style.Border.TopBorder = borderStyle; + style.Border.BottomBorder = borderStyle; + style.Border.InsideBorder = borderStyle; + style.Border.OutsideBorder = borderStyle; + return style; + } + + internal static IXLStyle SetBaseFont(this IXLStyle style) + { + style.Font.FontName = "Calibri"; + style.Font.FontSize = 10; + return style; + } + + internal static IXLStyle SetH1(this IXLStyle style) + { + style.Font.FontName = "Calibri"; + style.Font.FontSize = 14; + return style; + } + + /// + /// Костыль исправляющий проблему в библиотеке IXLRange Range(this IXLWorksheet, IXLAddress, IXLAddress) с кастингом IXLAddress к XLAddress. + /// + /// + /// + /// + /// + internal static IXLRange _Range(this IXLWorksheet sheet, CellAddress begin, CellAddress end) + => sheet.Range(begin.RowNumber, begin.ColumnNumber, end.RowNumber, end.ColumnNumber); + + + internal static T GetCellValue(this IXLCell cell) + { + try + { + if (typeof(T) != typeof(DateTime)) + return (T)Convert.ChangeType(cell.GetFormattedString(), typeof(T), CultureInfo.InvariantCulture); + + return (T)(object)DateTime.FromOADate((double)cell.Value); + } + catch + { + throw new FileFormatException( + $"Лист '{cell.Worksheet.Name}'. Ячейка: ({cell.Address.RowNumber},{cell.Address.ColumnNumber}) содержит некорректное значение"); + } + } +} \ No newline at end of file