0.9.1
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
namespace QWERTYkez.ExcelProcessor.Editors;
|
||||
namespace QWERTYkez.ExcelProcessor;
|
||||
|
||||
internal static class CellAddressHelper
|
||||
{
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace QWERTYkez.ExcelProcessor.Editors;
|
||||
namespace QWERTYkez.ExcelProcessor;
|
||||
|
||||
/// <summary>
|
||||
/// Определяет выравнивание содержимого ячейки: горизонтальное, вертикальное, перенос текста и уменьшение по размеру.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace QWERTYkez.ExcelProcessor.Editors;
|
||||
namespace QWERTYkez.ExcelProcessor;
|
||||
|
||||
/// <summary>
|
||||
/// Определяет границы ячейки: верхнюю, нижнюю, левую, правую и диагональные.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace QWERTYkez.ExcelProcessor.Editors;
|
||||
namespace QWERTYkez.ExcelProcessor;
|
||||
|
||||
/// <summary>
|
||||
/// Определяет заливку (фон) ячейки.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace QWERTYkez.ExcelProcessor.Editors;
|
||||
namespace QWERTYkez.ExcelProcessor;
|
||||
|
||||
/// <summary>
|
||||
/// Определяет шрифтовое оформление всей ячейки: размер, семейство, цвет, начертание.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace QWERTYkez.ExcelProcessor.Editors
|
||||
namespace QWERTYkez.ExcelProcessor
|
||||
{
|
||||
/// <summary>
|
||||
/// Представляет ширину столбца в Excel. Поддерживает задание в символах, пунктах, сантиметрах и миллиметрах.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace QWERTYkez.ExcelProcessor.Editors;
|
||||
namespace QWERTYkez.ExcelProcessor;
|
||||
|
||||
public readonly struct ExColor(System.Drawing.Color? Color)
|
||||
{
|
||||
@@ -59,4 +59,24 @@ public readonly struct ExColor(System.Drawing.Color? Color)
|
||||
}
|
||||
return excelColor;
|
||||
}
|
||||
|
||||
public static ExColor FromRgb(string rgb)
|
||||
{
|
||||
if (string.IsNullOrEmpty(rgb)) return new ExColor(null);
|
||||
if (rgb.Length == 6)
|
||||
{
|
||||
byte r = Convert.ToByte(rgb.Substring(0, 2), 16);
|
||||
byte g = Convert.ToByte(rgb.Substring(2, 2), 16);
|
||||
byte b = Convert.ToByte(rgb.Substring(4, 2), 16);
|
||||
return new ExColor(System.Drawing.Color.FromArgb(r, g, b));
|
||||
}
|
||||
else if (rgb.Length == 8)
|
||||
{
|
||||
byte r = Convert.ToByte(rgb.Substring(2, 2), 16);
|
||||
byte g = Convert.ToByte(rgb.Substring(4, 2), 16);
|
||||
byte b = Convert.ToByte(rgb.Substring(6, 2), 16);
|
||||
return new ExColor(System.Drawing.Color.FromArgb(r, g, b));
|
||||
}
|
||||
return new ExColor(null);
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace QWERTYkez.ExcelProcessor.Editors;
|
||||
namespace QWERTYkez.ExcelProcessor;
|
||||
|
||||
/// <summary>
|
||||
/// Внутренняя реализация <see cref="IBook"/>, которая делегирует вызовы к <see cref="ExcelWriter"/>.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace QWERTYkez.ExcelProcessor.Editors;
|
||||
namespace QWERTYkez.ExcelProcessor;
|
||||
|
||||
/// <summary>
|
||||
/// Внутренняя реализация <see cref="ICell"/>.
|
||||
@@ -390,7 +390,7 @@ internal sealed class ExcelCell : ICell
|
||||
}
|
||||
}
|
||||
|
||||
public ICell Set(Action<ICellText> value)
|
||||
public ICell Text(Action<ICellText> value)
|
||||
{
|
||||
if (value == null) return this;
|
||||
_writer.ThrowIfDisposed();
|
||||
@@ -425,6 +425,39 @@ internal sealed class ExcelCell : ICell
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public ICellText? Text()
|
||||
{
|
||||
_writer.ThrowIfDisposed();
|
||||
lock (_writer._syncLock)
|
||||
{
|
||||
var cell = GetCellElement();
|
||||
if (cell == null || cell.DataType?.Value != CellValues.InlineString || cell.InlineString == null)
|
||||
return null;
|
||||
|
||||
var textObj = new ExcelCellText();
|
||||
foreach (var run in cell.InlineString.Elements<Run>())
|
||||
{
|
||||
string text = run.GetFirstChild<Text>()?.Text ?? string.Empty;
|
||||
RunFormat? format = null;
|
||||
if (run.RunProperties != null)
|
||||
{
|
||||
// Преобразуем RunProperties в RunFormat (можно вынести в отдельный метод)
|
||||
format = RunFormat.FromRunProperties(run.RunProperties);
|
||||
}
|
||||
textObj.AddRun(text, format);
|
||||
}
|
||||
return textObj;
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public bool TryText(out ICellText cellText)
|
||||
{
|
||||
cellText = Text()!;
|
||||
return cellText is not null;
|
||||
}
|
||||
|
||||
public ICell Set(string value)
|
||||
{
|
||||
if (value == null) return this;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace QWERTYkez.ExcelProcessor.Editors;
|
||||
namespace QWERTYkez.ExcelProcessor;
|
||||
|
||||
/// <summary>
|
||||
/// Внутренняя реализация <see cref="ICellText"/> для работы с богатым текстом ячейки.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace QWERTYkez.ExcelProcessor.Editors;
|
||||
namespace QWERTYkez.ExcelProcessor;
|
||||
|
||||
/// <summary>
|
||||
/// Внутренняя реализация <see cref="IColumn"/>.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace QWERTYkez.ExcelProcessor.Editors;
|
||||
namespace QWERTYkez.ExcelProcessor;
|
||||
|
||||
/// <summary>
|
||||
/// Внутренняя реализация <see cref="IRange"/>.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace QWERTYkez.ExcelProcessor.Editors;
|
||||
namespace QWERTYkez.ExcelProcessor;
|
||||
|
||||
/// <summary>
|
||||
/// Внутренняя реализация <see cref="IRow"/>.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace QWERTYkez.ExcelProcessor.Editors;
|
||||
namespace QWERTYkez.ExcelProcessor;
|
||||
|
||||
/// <summary>
|
||||
/// Внутренняя реализация <see cref="IRun"/> для хранения форматированного фрагмента текста.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace QWERTYkez.ExcelProcessor.Editors;
|
||||
namespace QWERTYkez.ExcelProcessor;
|
||||
|
||||
/// <summary>
|
||||
/// Внутренняя реализация <see cref="ISheet"/>.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace QWERTYkez.ExcelProcessor.Editors;
|
||||
namespace QWERTYkez.ExcelProcessor;
|
||||
|
||||
/// <summary>Представляет книгу Excel</summary>
|
||||
public interface IBook
|
||||
@@ -700,7 +700,13 @@ public interface ICell
|
||||
ICell Set(CellFont format);
|
||||
|
||||
/// <summary>Устанавливает богатый текст (форматированный) с помощью делегата.</summary>
|
||||
ICell Set(Action<ICellText> value);
|
||||
ICell Text(Action<ICellText> value);
|
||||
|
||||
/// <summary>Возвращает объект для редактирования богатого текста ячейки (если ячейка содержит InlineString).</summary>
|
||||
bool TryText(out ICellText cellText);
|
||||
|
||||
/// <summary>Возвращает объект для редактирования богатого текста ячейки (если ячейка содержит InlineString).</summary>
|
||||
ICellText? Text();
|
||||
|
||||
/// <summary>Устанавливает простое текстовое значение (без форматирования).</summary>
|
||||
ICell Set(string value);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace QWERTYkez.ExcelProcessor.Editors;
|
||||
namespace QWERTYkez.ExcelProcessor;
|
||||
|
||||
public class NumberFormatPattern
|
||||
{
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace QWERTYkez.ExcelProcessor.Editors;
|
||||
namespace QWERTYkez.ExcelProcessor;
|
||||
|
||||
/// <summary>
|
||||
/// Предоставляет типобезопасное представление высоты строки в Excel с поддержкой различных единиц измерения.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace QWERTYkez.ExcelProcessor.Editors;
|
||||
namespace QWERTYkez.ExcelProcessor;
|
||||
|
||||
/// <summary>
|
||||
/// Определяет форматирование отдельного фрагмента (Run) внутри ячейки с богатым текстом.
|
||||
@@ -30,6 +30,66 @@ public readonly struct RunFormat
|
||||
/// <summary>Вертикальное смещение (надстрочный или подстрочный).</summary>
|
||||
public VerticalTextRunAlignment? Vertical { get; init; }
|
||||
|
||||
public static RunFormat? FromRunProperties(RunProperties rPr)
|
||||
{
|
||||
UnderlineStyle? underline;
|
||||
if (rPr.GetFirstChild<Underline>()?.Val?.Value is { } underlineVal)
|
||||
{
|
||||
if (underlineVal == UnderlineValues.Single)
|
||||
{
|
||||
underline = UnderlineStyle.Single;
|
||||
}
|
||||
else if (underlineVal == UnderlineValues.Double)
|
||||
{
|
||||
underline = UnderlineStyle.Double;
|
||||
}
|
||||
else if (underlineVal == UnderlineValues.SingleAccounting)
|
||||
{
|
||||
underline = UnderlineStyle.SingleAccounting;
|
||||
}
|
||||
else if (underlineVal == UnderlineValues.DoubleAccounting)
|
||||
{
|
||||
underline = UnderlineStyle.DoubleAccounting;
|
||||
}
|
||||
else underline = null!;
|
||||
}
|
||||
else underline = null!;
|
||||
|
||||
VerticalTextRunAlignment? vertical;
|
||||
if (rPr.GetFirstChild<VerticalTextAlignment>()?.Val?.Value is { } verticalVal)
|
||||
{
|
||||
if (verticalVal == VerticalAlignmentRunValues.Superscript)
|
||||
{
|
||||
vertical = VerticalTextRunAlignment.Superscript;
|
||||
}
|
||||
else if (verticalVal == VerticalAlignmentRunValues.Subscript)
|
||||
{
|
||||
vertical = VerticalTextRunAlignment.Subscript;
|
||||
}
|
||||
else vertical = null!;
|
||||
}
|
||||
else vertical = null!;
|
||||
|
||||
|
||||
if (rPr == null) return null;
|
||||
var fmt = new RunFormat
|
||||
{
|
||||
IsBold = rPr.GetFirstChild<Bold>() != null,
|
||||
IsItalic = rPr.GetFirstChild<Italic>() != null,
|
||||
IsStrike = rPr.GetFirstChild<Strike>() != null,
|
||||
// DoubleStrike в Excel не поддерживается, опускаем
|
||||
|
||||
Underline = underline,
|
||||
Color = rPr.GetFirstChild<Color>()?.Rgb is not null
|
||||
? ExColor.FromRgb(rPr.GetFirstChild<Color>()!.Rgb!.Value!)
|
||||
: null!,
|
||||
FontSize = rPr.GetFirstChild<FontSize>()?.Val?.Value,
|
||||
FontFamily = rPr.GetFirstChild<RunFont>()?.Val,
|
||||
Vertical = vertical
|
||||
};
|
||||
return fmt;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
методы для извлечения OpenXmlElement или других более удобных типов
|
||||
|
||||
Reference in New Issue
Block a user