namespace QWERTYkez.ExcelProcessor { /// /// Представляет ширину столбца в Excel. Поддерживает задание в символах, пунктах, сантиметрах и миллиметрах. /// Для методов FromCM/FromMM/FromPoints требуется калибровка через , иначе точность не гарантирована. /// public readonly struct ColumnWidth { private readonly double _rawValue; private readonly UnitType _unit; private enum UnitType { Characters, Points, Centimeters, Millimeters } /// Коэффициент перевода символов в пункты по умолчанию (используется, если нет калибровочной таблицы). public static double DefaultPointsPerChar { get; set; } = 5.65; private ColumnWidth(double value, UnitType unit) { _rawValue = value; _unit = unit; } /// Задаёт ширину в character units (символах стандартного шрифта). public static ColumnWidth FromCharacters(double characters) => new(characters, UnitType.Characters); /// Задаёт ширину в пунктах. [Obsolete("Для правильной работы требуется установленный Excel, точность гарантирована только для этого компьютера")] public static ColumnWidth FromPoints(double points) => new(points, UnitType.Points); /// Задаёт ширину в сантиметрах. [Obsolete("Для правильной работы требуется установленный Excel, точность гарантирована только для этого компьютера")] public static ColumnWidth FromCM(double cm) => new(cm, UnitType.Centimeters); /// Задаёт ширину в миллиметрах. [Obsolete("Для правильной работы требуется установленный Excel, точность гарантирована только для этого компьютера")] public static ColumnWidth FromMM(double mm) => new(mm, UnitType.Millimeters); /// Возвращает целевую ширину в пунктах (если ширина задана в пунктах, см или мм). internal double GetTargetPoints() { return _unit switch { UnitType.Points => _rawValue, UnitType.Centimeters => _rawValue * 28.3464566929, UnitType.Millimeters => (_rawValue / 10.0) * 28.3464566929, _ => double.NaN }; } internal double GetTargetCentimeters() { return _unit switch { UnitType.Centimeters => _rawValue, UnitType.Millimeters => _rawValue / 10.0, UnitType.Points => _rawValue / 28.3464566929, _ => double.NaN }; } internal bool IsCharacterUnit => _unit == UnitType.Characters; internal double CharacterValue => IsCharacterUnit ? _rawValue : double.NaN; } }