Добавьте файлы проекта.
This commit is contained in:
63
QWERTYkez.ExcelProcessor/Editors/ColumnWidth.cs
Normal file
63
QWERTYkez.ExcelProcessor/Editors/ColumnWidth.cs
Normal file
@@ -0,0 +1,63 @@
|
||||
namespace QWERTYkez.ExcelProcessor.Editors
|
||||
{
|
||||
/// <summary>
|
||||
/// Представляет ширину столбца в Excel. Поддерживает задание в символах, пунктах, сантиметрах и миллиметрах.
|
||||
/// Для методов FromCM/FromMM/FromPoints требуется калибровка через <see cref="ExcelWriter"/>, иначе точность не гарантирована.
|
||||
/// </summary>
|
||||
public readonly struct ColumnWidth
|
||||
{
|
||||
private readonly double _rawValue;
|
||||
private readonly UnitType _unit;
|
||||
|
||||
private enum UnitType { Characters, Points, Centimeters, Millimeters }
|
||||
|
||||
/// <summary>Коэффициент перевода символов в пункты по умолчанию (используется, если нет калибровочной таблицы).</summary>
|
||||
public static double DefaultPointsPerChar { get; set; } = 5.65;
|
||||
|
||||
private ColumnWidth(double value, UnitType unit)
|
||||
{
|
||||
_rawValue = value;
|
||||
_unit = unit;
|
||||
}
|
||||
|
||||
/// <summary>Задаёт ширину в character units (символах стандартного шрифта).</summary>
|
||||
public static ColumnWidth FromCharacters(double characters) => new(characters, UnitType.Characters);
|
||||
|
||||
/// <summary>Задаёт ширину в пунктах.</summary>
|
||||
[Obsolete("Для правильной работы требуется установленный Excel, точность гарантирована только для этого компьютера")]
|
||||
public static ColumnWidth FromPoints(double points) => new(points, UnitType.Points);
|
||||
|
||||
/// <summary>Задаёт ширину в сантиметрах.</summary>
|
||||
[Obsolete("Для правильной работы требуется установленный Excel, точность гарантирована только для этого компьютера")]
|
||||
public static ColumnWidth FromCM(double cm) => new(cm, UnitType.Centimeters);
|
||||
|
||||
/// <summary>Задаёт ширину в миллиметрах.</summary>
|
||||
[Obsolete("Для правильной работы требуется установленный Excel, точность гарантирована только для этого компьютера")]
|
||||
public static ColumnWidth FromMM(double mm) => new(mm, UnitType.Millimeters);
|
||||
|
||||
/// <summary>Возвращает целевую ширину в пунктах (если ширина задана в пунктах, см или мм).</summary>
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user