63 lines
3.4 KiB
C#
63 lines
3.4 KiB
C#
namespace QWERTYkez.ExcelProcessor
|
|
{
|
|
/// <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;
|
|
}
|
|
} |