Files
QWERTYkez.OpenXmlProcessors/QWERTYkez.ExcelProcessor/Editors/Interfaces.cs
melekhin eccb12b83c
All checks were successful
Publish NuGet packages / publish (push) Successful in 25s
Text() debug
2026-06-16 15:52:08 +07:00

823 lines
51 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
namespace QWERTYkez.ExcelProcessor;
/// <summary>Представляет книгу Excel</summary>
public interface IBook
{
/// <summary>Возвращает список всех листов в книге.</summary>
IReadOnlyList<ISheet> GetSheets();
/// <summary>Возвращает лист по имени или null, если лист не найден.</summary>
/// <param name="name">Имя листа (регистр учитывается).</param>
ISheet? Sheet(string name);
/// <summary>Пытается получить лист по имени.</summary>
/// <param name="name">Имя листа.</param>
/// <param name="sheet">Найденный лист или null.</param>
/// <returns>true, если лист найден, иначе false.</returns>
bool TryGetSheet(string name, out ISheet sheet);
/// <summary>Пытается добавить новый лист с указанным именем и выполняет его настройку.</summary>
/// <param name="name">Имя нового листа (должно быть уникальным в книге).</param>
/// <param name="edit">Действие для редактирования листа (может быть null).</param>
/// <returns>true, если лист успешно создан, иначе false (например, имя уже существует).</returns>
bool TryAddSheet(string name, Action<ISheet>? edit = null);
/// <summary>Удаляет лист по имени.</summary>
/// <param name="name">Имя удаляемого листа.</param>
/// <returns>true, если лист существовал и был удалён, иначе false.</returns>
bool TryRemoveSheet(string name);
/// <summary>Удаляет лист.</summary>
/// <param name="sheet">Удаляемый лист.</param>
/// <returns>true, если лист был удалён, иначе false.</returns>
bool TryRemoveSheet(ISheet sheet);
/// <summary>Возвращает список всех числовых форматов, определённых в книге (встроенные и пользовательские).</summary>
IReadOnlyList<NumberFormatPattern> GetNumberFormats();
/// <summary>Создаёт новый пользовательский числовой формат (если формат с таким кодом уже существует, может вернуть существующий).</summary>
/// <param name="format">Код формата (например, "# ##0,00").</param>
/// <returns>Объект формата, привязанный к книге.</returns>
NumberFormatPattern CreateNumberFormat(string format);
}
/// <summary>Представляет лист Excel</summary>
public interface ISheet
{
/// <summary>Индекс листа в книге (начиная с 1).</summary>
int Index { get; }
/// <summary>Имя листа (уникальное в книге).</summary>
string Name { get; }
/// <summary>Пытается изменить имя листа.</summary>
/// <param name="name">Новое имя (не должно совпадать с существующими).</param>
/// <returns>true, если переименование выполнено, иначе false.</returns>
bool TrySetName(string name);
/// <summary>Возвращает строку по её индексу (начиная с 1). Если строка отсутствует, создаёт пустую.</summary>
IRow Row(uint row);
/// <summary>Редактирует строку, применяя делегат, и возвращает текущий лист (fluent).</summary>
/// <param name="row">Индекс строки (начиная с 1).</param>
/// <param name="edit">Действие над строкой.</param>
ISheet Row(uint row, Action<IRow> edit);
/// <summary>Возвращает столбец по его индексу (начиная с 1). Если столбец отсутствует, создаёт пустой.</summary>
IColumn Col(uint col);
/// <summary>Редактирует столбец по индексу.</summary>
ISheet Col(uint col, Action<IColumn> edit);
/// <summary>Возвращает столбец по буквенному обозначению (например, "A", "AB").</summary>
IColumn Col(string col);
/// <summary>Редактирует столбец по буквенному обозначению.</summary>
ISheet Col(string col, Action<IColumn> edit);
/// <summary>Возвращает диапазон ячеек по начальным и конечным индексам строк и столбцов.</summary>
IRange RangeByIndexes(uint startRow, uint startCol, uint endRow, uint endCol);
/// <summary>Возвращает диапазон ячеек по начальным и конечным координатам с буквенным обозначением столбцов.</summary>
IRange RangeByIndexes(uint startRow, string startCol, uint endRow, string endCol);
/// <summary>Редактирует диапазон, заданный начальными и конечными индексами.</summary>
ISheet RangeByIndexes(uint startRow, uint startCol, uint endRow, uint endCol, Action<IRange> edit);
/// <summary>Редактирует диапазон, заданный начальными и конечными координатами с буквенными столбцами.</summary>
ISheet RangeByIndexes(uint startRow, string startCol, uint endRow, string endCol, Action<IRange> edit);
/// <summary>Возвращает диапазон, начиная с указанной ячейки, заданной размером (строки x столбцы).</summary>
IRange RangeByLength(uint startRow, uint startCol, uint rows, uint cols);
/// <summary>Возвращает диапазон по начальной ячейке и размеру с буквенным обозначением столбца.</summary>
IRange RangeByLength(uint startRow, string startCol, uint rows, uint cols);
/// <summary>Редактирует диапазон, заданный начальной ячейкой и размером.</summary>
ISheet RangeByLength(uint startRow, uint startCol, uint rows, uint cols, Action<IRange> edit);
/// <summary>Редактирует диапазон, заданный начальной ячейкой и размером (буква столбца).</summary>
ISheet RangeByLength(uint startRow, string startCol, uint rows, uint cols, Action<IRange> edit);
/// <summary>Возвращает ячейку по номеру строки и столбца (оба начиная с 1).</summary>
ICell Cell(uint row, uint col);
/// <summary>Редактирует ячейку по строке и столбцу.</summary>
ISheet Cell(uint row, uint col, Action<ICell> edit);
/// <summary>Устанавливает строковое значение в ячейку.</summary>
ISheet Cell(uint row, uint col, string value);
/// <summary>Устанавливает логическое значение в ячейку.</summary>
ISheet Cell(uint row, uint col, bool value);
/// <summary>Устанавливает формулу в ячейку с указанным числовым форматом.</summary>
ISheet Cell(uint row, uint col, string formula, NumberFormatPattern? format = null);
/// <summary>Устанавливает дату в ячейку с указанным числовым форматом.</summary>
ISheet Cell(uint row, uint col, DateTime value, NumberFormatPattern? format = null);
/// <summary>Устанавливает десятичное число в ячейку с указанным числовым форматом.</summary>
ISheet Cell(uint row, uint col, decimal value, NumberFormatPattern? format = null);
/// <summary>Устанавливает число двойной точности в ячейку с указанным числовым форматом.</summary>
ISheet Cell(uint row, uint col, double value, NumberFormatPattern? format = null);
/// <summary>Устанавливает число с плавающей точкой в ячейку с указанным числовым форматом.</summary>
ISheet Cell(uint row, uint col, float value, NumberFormatPattern? format = null);
/// <summary>Устанавливает целое число в ячейку с указанным числовым форматом.</summary>
ISheet Cell(uint row, uint col, int value, NumberFormatPattern? format = null);
/// <summary>Устанавливает длинное целое число в ячейку с указанным числовым форматом.</summary>
ISheet Cell(uint row, uint col, long value, NumberFormatPattern? format = null);
/// <summary>Возвращает ячейку по строке и букве столбца (например, 1, "A").</summary>
ICell Cell(uint row, string col);
/// <summary>Редактирует ячейку по строке и букве столбца.</summary>
ISheet Cell(uint row, string col, Action<ICell> edit);
/// <summary>Устанавливает строковое значение в ячейку по адресу (строка, буква столбца).</summary>
ISheet Cell(uint row, string col, string value);
/// <summary>Устанавливает логическое значение в ячейку по адресу (строка, буква столбца).</summary>
ISheet Cell(uint row, string col, bool value);
/// <summary>Устанавливает формулу в ячейку с числовым форматом по адресу (строка, буква столбца).</summary>
ISheet Cell(uint row, string col, string formula, NumberFormatPattern? format = null);
/// <summary>Устанавливает дату в ячейку по адресу (строка, буква столбца).</summary>
ISheet Cell(uint row, string col, DateTime value, NumberFormatPattern? format = null);
/// <summary>Устанавливает десятичное число в ячейку по адресу (строка, буква столбца).</summary>
ISheet Cell(uint row, string col, decimal value, NumberFormatPattern? format = null);
/// <summary>Устанавливает число двойной точности в ячейку по адресу (строка, буква столбца).</summary>
ISheet Cell(uint row, string col, double value, NumberFormatPattern? format = null);
/// <summary>Устанавливает число с плавающей точкой в ячейку по адресу (строка, буква столбца).</summary>
ISheet Cell(uint row, string col, float value, NumberFormatPattern? format = null);
/// <summary>Устанавливает целое число в ячейку по адресу (строка, буква столбца).</summary>
ISheet Cell(uint row, string col, int value, NumberFormatPattern? format = null);
/// <summary>Устанавливает длинное целое число в ячейку по адресу (строка, буква столбца).</summary>
ISheet Cell(uint row, string col, long value, NumberFormatPattern? format = null);
/// <summary>Очищает всё содержимое листа (значения, формулы, но не форматирование).</summary>
void ClearContents();
/// <summary>Очищает всё форматирование на листе (стили, шрифты, границы, но оставляет значения).</summary>
void ClearFormats();
/// <summary>Очищает и содержимое, и форматирование листа.</summary>
void Clear();
/// <summary>Удаляет лист из книги</summary>
void Remove();
}
/// <summary>Представляет строку на листе.</summary>
public interface IRow
{
/// <summary>Индекс строки (начиная с 1).</summary>
uint Index { get; }
/// <summary>
/// Копирует текущую строку в указанную позицию (как "копировать-вставить" в Excel).
/// Исходная строка остаётся без изменений.
/// </summary>
/// <param name="index">Индекс строки (начиная с 1), в которую будет вставлена копия.
/// Существующие строки, начиная с этой позиции, сдвигаются вниз.</param>
/// <param name="copiedRow">Возвращает новую строку-копию, расположенную по указанному индексу.</param>
/// <returns>Текущий объект IRow для цепочки вызовов (fluent).</returns>
IRow CopyTo(uint index, out IRow copiedRow);
/// <summary>
/// Перемещает текущую строку в новую позицию (как "вырезать-вставить" в Excel).
/// Исходная строка удаляется, а перемещённая строка сохраняет все свои данные и форматирование.
/// </summary>
/// <param name="index">Новый индекс строки (начиная с 1).
/// Другие строки сдвигаются, освобождая место для перемещённой строки.</param>
/// <returns>Тот же объект IRow, но уже с новым индексом (fluent).</returns>
IRow MoveTo(uint index);
/// <summary>Высота строки</summary>
RowHeight Height { get; set; }
/// <summary>Устанавливает числовой формат для всех ячеек строки.</summary>
IRow SetNumberFormat(NumberFormatPattern format);
/// <summary>Возвращает ячейку в заданном столбце (индекс с 1).</summary>
ICell Cell(uint col);
/// <summary>Редактирует ячейку в заданном столбце.</summary>
IRow Cell(uint col, Action<ICell> edit);
/// <summary>Устанавливает строковое значение в ячейку столбца.</summary>
IRow Cell(uint col, string value);
/// <summary>Устанавливает логическое значение в ячейку столбца.</summary>
IRow Cell(uint col, bool value);
/// <summary>Устанавливает формулу в ячейку столбца с числовым форматом.</summary>
IRow Cell(uint col, string formula, NumberFormatPattern? format = null);
/// <summary>Устанавливает дату в ячейку столбца с числовым форматом.</summary>
IRow Cell(uint col, DateTime value, NumberFormatPattern? format = null);
/// <summary>Устанавливает десятичное число в ячейку столбца с числовым форматом.</summary>
IRow Cell(uint col, decimal value, NumberFormatPattern? format = null);
/// <summary>Устанавливает число двойной точности в ячейку столбца с числовым форматом.</summary>
IRow Cell(uint col, double value, NumberFormatPattern? format = null);
/// <summary>Устанавливает число с плавающей точкой в ячейку столбца с числовым форматом.</summary>
IRow Cell(uint col, float value, NumberFormatPattern? format = null);
/// <summary>Устанавливает целое число в ячейку столбца с числовым форматом.</summary>
IRow Cell(uint col, int value, NumberFormatPattern? format = null);
/// <summary>Устанавливает длинное целое число в ячейку столбца с числовым форматом.</summary>
IRow Cell(uint col, long value, NumberFormatPattern? format = null);
/// <summary>Возвращает ячейку по букве столбца.</summary>
ICell Cell(string col);
/// <summary>Редактирует ячейку по букве столбца.</summary>
IRow Cell(string col, Action<ICell> edit);
/// <summary>Устанавливает строковое значение в ячейку по букве столбца.</summary>
IRow Cell(string col, string value);
/// <summary>Устанавливает логическое значение в ячейку по букве столбца.</summary>
IRow Cell(string col, bool value);
/// <summary>Устанавливает формулу в ячейку по букве столбца с числовым форматом.</summary>
IRow Cell(string col, string formula, NumberFormatPattern? format = null);
/// <summary>Устанавливает дату в ячейку по букве столбца с числовым форматом.</summary>
IRow Cell(string col, DateTime value, NumberFormatPattern? format = null);
/// <summary>Устанавливает десятичное число в ячейку по букве столбца с числовым форматом.</summary>
IRow Cell(string col, decimal value, NumberFormatPattern? format = null);
/// <summary>Устанавливает число двойной точности в ячейку по букве столбца с числовым форматом.</summary>
IRow Cell(string col, double value, NumberFormatPattern? format = null);
/// <summary>Устанавливает число с плавающей точкой в ячейку по букве столбца с числовым форматом.</summary>
IRow Cell(string col, float value, NumberFormatPattern? format = null);
/// <summary>Устанавливает целое число в ячейку по букве столбца с числовым форматом.</summary>
IRow Cell(string col, int value, NumberFormatPattern? format = null);
/// <summary>Устанавливает длинное целое число в ячейку по букве столбца с числовым форматом.</summary>
IRow Cell(string col, long value, NumberFormatPattern? format = null);
/// <summary>Очищает содержимое всех ячеек строки (значения, формулы).</summary>
void ClearContents();
/// <summary>Очищает форматирование всех ячеек строки.</summary>
void ClearFormats();
/// <summary>Очищает содержимое и форматирование строки.</summary>
void Clear();
/// <summary>Удаляет строку с листа (сдвигая нижние строки вверх).</summary>
void Remove();
}
/// <summary>Представляет столбец на листе.</summary>
public interface IColumn
{
/// <summary>Индекс столбца (начиная с 1).</summary>
uint Index { get; }
/// <summary>Буквенное обозначение столбца (например, "A", "Z", "AA").</summary>
string IndexLetter { get; }
/// <summary>
/// Копирует текущий столбец в указанную позицию по числовому индексу (как "копировать-вставить").
/// Исходный столбец остаётся без изменений.
/// </summary>
/// <param name="index">Числовой индекс столбца (начиная с 1), куда будет вставлена копия.
/// Существующие столбцы, начиная с этой позиции, сдвигаются вправо.</param>
/// <param name="copiedColumn">Возвращает новый столбец-копию, расположенный по указанному индексу.</param>
/// <returns>Текущий объект IColumn для цепочки вызовов.</returns>
IColumn CopyTo(uint index, out IColumn copiedColumn);
/// <summary>
/// Копирует текущий столбец в указанную позицию по буквенному обозначению (как "копировать-вставить").
/// </summary>
/// <param name="index">Буквенное обозначение столбца (например, "D", "AA"), куда будет вставлена копия.</param>
/// <param name="copiedColumn">Возвращает новый столбец-копию.</param>
/// <returns>Текущий объект IColumn.</returns>
IColumn CopyTo(string index, out IColumn copiedColumn);
/// <summary>
/// Перемещает текущий столбец в новую позицию по числовому индексу (как "вырезать-вставить").
/// Исходный столбец удаляется, а перемещённый столбец сохраняет свои данные и форматирование.
/// </summary>
/// <param name="index">Новый числовой индекс столбца (начиная с 1).</param>
/// <returns>Тот же объект IColumn с новым индексом (fluent).</returns>
IColumn MoveTo(uint index);
/// <summary>
/// Перемещает текущий столбец в новую позицию по буквенному обозначению (как "вырезать-вставить").
/// </summary>
/// <param name="index">Новое буквенное обозначение столбца (например, "E").</param>
/// <returns>Тот же объект IColumn с новым индексом.</returns>
IColumn MoveTo(string index);
/// <summary>Ширина столбца (чтение и запись).</summary>
ColumnWidth Width { get; set; }
/// <summary>Устанавливает числовой формат для всех ячеек столбца.</summary>
IColumn SetNumberFormat(NumberFormatPattern format);
/// <summary>Возвращает ячейку в заданной строке (индекс с 1).</summary>
ICell Cell(uint row);
/// <summary>Редактирует ячейку в заданной строке.</summary>
IColumn Cell(uint row, Action<ICell> edit);
/// <summary>Устанавливает строковое значение в ячейку строки.</summary>
IColumn Cell(uint row, string value);
/// <summary>Устанавливает логическое значение в ячейку строки.</summary>
IColumn Cell(uint row, bool value);
/// <summary>Устанавливает формулу в ячейку строки с числовым форматом.</summary>
IColumn Cell(uint row, string formula, NumberFormatPattern? format = null);
/// <summary>Устанавливает дату в ячейку строки с числовым форматом.</summary>
IColumn Cell(uint row, DateTime value, NumberFormatPattern? format = null);
/// <summary>Устанавливает десятичное число в ячейку строки с числовым форматом.</summary>
IColumn Cell(uint row, decimal value, NumberFormatPattern? format = null);
/// <summary>Устанавливает число двойной точности в ячейку строки с числовым форматом.</summary>
IColumn Cell(uint row, double value, NumberFormatPattern? format = null);
/// <summary>Устанавливает число с плавающей точкой в ячейку строки с числовым форматом.</summary>
IColumn Cell(uint row, float value, NumberFormatPattern? format = null);
/// <summary>Устанавливает целое число в ячейку строки с числовым форматом.</summary>
IColumn Cell(uint row, int value, NumberFormatPattern? format = null);
/// <summary>Устанавливает длинное целое число в ячейку строки с числовым форматом.</summary>
IColumn Cell(uint row, long value, NumberFormatPattern? format = null);
/// <summary>Очищает содержимое всех ячеек столбца.</summary>
void ClearContents();
/// <summary>Очищает форматирование всех ячеек столбца.</summary>
void ClearFormats();
/// <summary>Очищает содержимое и форматирование столбца.</summary>
void Clear();
/// <summary>Удаляет столбец с листа (сдвигая правые столбцы влево).</summary>
void Remove();
}
/// <summary>Представляет прямоугольный диапазон ячеек на листе.</summary>
public interface IRange
{
/// <summary>Объединяет ячейки диапазона в одну (содержимое левой верхней ячейки сохраняется).</summary>
/// <returns>true, если объединение выполнено (диапазон не был объединён ранее).</returns>
bool TryMerge();
/// <summary>Разъединяет ранее объединённый диапазон (восстанавливает исходные ячейки, содержимое остаётся в левой верхней).</summary>
void Unmerge();
/// <summary>Проверяет, объединён ли диапазон (как единое целое).</summary>
bool IsMerged { get; }
/// <summary>Возвращает диапазон, представляющий объединённую область, если текущий диапазон является частью объединения.</summary>
IRange? GetMergedRange();
/// <summary>Пытается получить объединённый диапазон, содержащий текущий.</summary>
bool TryGetMergedRange(IRange range);
/// <summary>Номер начальной строки диапазона (1-based).</summary>
uint RowStart { get; }
/// <summary>Номер конечной строки.</summary>
uint RowEnd { get; }
/// <summary>Номер начального столбца.</summary>
uint ColStart { get; }
/// <summary>Номер конечного столбца.</summary>
uint ColEnd { get; }
/// <summary>Буквенное обозначение начального столбца.</summary>
string ColStartLetter { get; }
/// <summary>Буквенное обозначение конечного столбца.</summary>
string ColEndLetter { get; }
/// <summary>Количество строк в диапазоне.</summary>
uint Rows { get; }
/// <summary>Количество столбцов в диапазоне.</summary>
uint Cols { get; }
/// <summary>
/// Копирует текущий диапазон в новую позицию (верхний левый угол) как "копировать-вставить".
/// Исходный диапазон остаётся неизменным.
/// </summary>
/// <param name="rowIndex">Номер строки (начиная с 1) для верхнего левого угла вставляемого диапазона.</param>
/// <param name="colIndex">Номер столбца (начиная с 1) для верхнего левого угла.</param>
/// <param name="copiedRange">Возвращает новый диапазон-копию, расположенный по указанным координатам.</param>
/// <returns>Текущий объект IRange (fluent).</returns>
IRange CopyTo(uint rowIndex, uint colIndex, out IRange copiedRange);
/// <summary>
/// Копирует текущий диапазон в новую позицию (верхний левый угол) с указанием столбца буквой как "копировать-вставить".
/// Исходный диапазон остаётся неизменным.
/// </summary>
/// <param name="rowIndex">Номер строки (начиная с 1).</param>
/// <param name="colIndex">Буквенное обозначение столбца (например, "C").</param>
/// <param name="copiedRange">Возвращает новый диапазон-копию.</param>
/// <returns>Текущий объект IRange.</returns>
IRange CopyTo(uint rowIndex, string colIndex, out IRange copiedRange);
/// <summary>
/// Перемещает текущий диапазон в новую позицию (верхний левый угол) как "вырезать-вставить".
/// Исходный диапазон очищается, а текущий объект IRange перемещается на новое место.
/// </summary>
/// <param name="rowIndex">Номер строки для нового положения верхнего левого угла.</param>
/// <param name="colIndex">Номер столбца для нового положения.</param>
/// <returns>Тот же объект IRange, но уже с новыми координатами (fluent).</returns>
IRange MoveTo(uint rowIndex, uint colIndex);
/// <summary>
/// Перемещает текущий диапазон в новую позицию (верхний левый угол) с указанием столбца буквой как "вырезать-вставить".
/// Исходный диапазон очищается, а текущий объект IRange перемещается на новое место.
/// </summary>
/// <param name="rowIndex">Номер строки.</param>
/// <param name="colIndex">Буквенное обозначение столбца.</param>
/// <returns>Тот же объект IRange с новыми координатами.</returns>
IRange MoveTo(uint rowIndex, string colIndex);
/// <summary>Устанавливает числовой формат для всех ячеек диапазона.</summary>
IRange SetNumberFormat(NumberFormatPattern format);
/// <summary>Устанавливает выравнивание для всех ячеек диапазона.</summary>
IRange SetCellAlign(CellAlign format);
/// <summary>Устанавливает границы для всех ячеек диапазона.</summary>
IRange SetCellBorder(CellBorder format);
/// <summary>Устанавливает заливку для всех ячеек диапазона.</summary>
IRange SetCellFill(CellFill format);
/// <summary>Устанавливает шрифт для всех ячеек диапазона.</summary>
IRange SetCellFont(CellFont format);
/// <summary>Перечисляет все ячейки диапазона (по строкам).</summary>
IEnumerable<ICell> Cells { get; }
/// <summary>Получает ячейку внутри диапазона по относительным координатам (начиная с 1).</summary>
bool GetSubCell(uint row, uint col, out ICell cell);
/// <summary>Редактирует ячейку внутри диапазона по относительным координатам.</summary>
bool TryEditSubCell(uint row, uint col, Action<ICell> edit);
/// <summary>Устанавливает строковое значение в ячейку по относительным координатам.</summary>
bool TryEditSubCell(uint row, uint col, string value);
/// <summary>Устанавливает логическое значение в ячейку по относительным координатам.</summary>
bool TryEditSubCell(uint row, uint col, bool value);
/// <summary>Устанавливает формулу в ячейку по относительным координатам.</summary>
bool TryEditSubCell(uint row, uint col, string formula, NumberFormatPattern? format = null);
/// <summary>Устанавливает дату в ячейку по относительным координатам.</summary>
bool TryEditSubCell(uint row, uint col, DateTime value, NumberFormatPattern? format = null);
/// <summary>Устанавливает десятичное число в ячейку по относительным координатам.</summary>
bool TryEditSubCell(uint row, uint col, decimal value, NumberFormatPattern? format = null);
/// <summary>Устанавливает число двойной точности в ячейку по относительным координатам.</summary>
bool TryEditSubCell(uint row, uint col, double value, NumberFormatPattern? format = null);
/// <summary>Устанавливает число с плавающей точкой в ячейку по относительным координатам.</summary>
bool TryEditSubCell(uint row, uint col, float value, NumberFormatPattern? format = null);
/// <summary>Устанавливает целое число в ячейку по относительным координатам.</summary>
bool TryEditSubCell(uint row, uint col, int value, NumberFormatPattern? format = null);
/// <summary>Устанавливает длинное целое число в ячейку по относительным координатам.</summary>
bool TryEditSubCell(uint row, uint col, long value, NumberFormatPattern? format = null);
/// <summary>Получает ячейку по относительной строке и букве столбца.</summary>
bool GetSubCell(uint row, string col, out ICell cell);
/// <summary>Редактирует ячейку по относительной строке и букве столбца.</summary>
bool TryEditSubCell(uint row, string col, Action<ICell> edit);
/// <summary>Устанавливает строковое значение в ячейку по относительной строке и букве столбца.</summary>
bool TryEditSubCell(uint row, string col, string value);
/// <summary>Устанавливает логическое значение в ячейку по относительной строке и букве столбца.</summary>
bool TryEditSubCell(uint row, string col, bool value);
/// <summary>Устанавливает формулу в ячейку по относительной строке и букве столбца.</summary>
bool TryEditSubCell(uint row, string col, string formula, NumberFormatPattern? format = null);
/// <summary>Устанавливает дату в ячейку по относительной строке и букве столбца.</summary>
bool TryEditSubCell(uint row, string col, DateTime value, NumberFormatPattern? format = null);
/// <summary>Устанавливает десятичное число в ячейку по относительной строке и букве столбца.</summary>
bool TryEditSubCell(uint row, string col, decimal value, NumberFormatPattern? format = null);
/// <summary>Устанавливает число двойной точности в ячейку по относительной строке и букве столбца.</summary>
bool TryEditSubCell(uint row, string col, double value, NumberFormatPattern? format = null);
/// <summary>Устанавливает число с плавающей точкой в ячейку по относительной строке и букве столбца.</summary>
bool TryEditSubCell(uint row, string col, float value, NumberFormatPattern? format = null);
/// <summary>Устанавливает целое число в ячейку по относительной строке и букве столбца.</summary>
bool TryEditSubCell(uint row, string col, int value, NumberFormatPattern? format = null);
/// <summary>Устанавливает длинное целое число в ячейку по относительной строке и букве столбца.</summary>
bool TryEditSubCell(uint row, string col, long value, NumberFormatPattern? format = null);
/// <summary>Очищает содержимое всех ячеек диапазона.</summary>
void ClearContents();
/// <summary>Очищает форматирование всех ячеек диапазона.</summary>
void ClearFormats();
/// <summary>Очищает и содержимое, и форматирование.</summary>
void Clear();
}
/// <summary>Представляет одну ячейку на листе.</summary>
public interface ICell
{
/// <summary>Проверяет, входит ли ячейка в объединённый диапазон.</summary>
bool IsMerged { get; }
/// <summary>Возвращает объединённый диапазон, если ячейка объединена, иначе null.</summary>
IRange? GetMergedRange();
/// <summary>Пытается получить объединённый диапазон, содержащий эту ячейку.</summary>
bool TryGetMergedRange(IRange range);
/// <summary>Номер строки (1-based).</summary>
uint Row { get; }
/// <summary>Номер столбца (1-based).</summary>
uint Col { get; }
/// <summary>Буква столбца.</summary>
string ColLetter { get; }
/// <summary>
/// Копирует текущую ячейку в указанную позицию (как "копировать-вставить").
/// Исходная ячейка остаётся без изменений.
/// </summary>
/// <param name="rowIndex">Номер строки (начиная с 1), куда будет вставлена копия.</param>
/// <param name="colIndex">Номер столбца (начиная с 1).</param>
/// <param name="copiedCell">Возвращает новую ячейку-копию.</param>
/// <returns>Текущий объект ICell для цепочки вызовов.</returns>
ICell CopyTo(uint rowIndex, uint colIndex, out ICell copiedCell);
/// <summary>
/// Копирует текущую ячейку в указанную позицию с буквенным обозначением столбца (как "копировать-вставить").
/// Исходная ячейка остаётся без изменений.
/// </summary>
/// <param name="rowIndex">Номер строки.</param>
/// <param name="colIndex">Буквенное обозначение столбца (например, "B").</param>
/// <param name="copiedCell">Возвращает новую ячейку-копию.</param>
/// <returns>Текущий объект ICell.</returns>
ICell CopyTo(uint rowIndex, string colIndex, out ICell copiedCell);
/// <summary>
/// Перемещает текущую ячейку в новую позицию (как "вырезать-вставить").
/// Исходная ячейка очищается, а текущий объект ICell перемещается в новое место.
/// </summary>
/// <param name="rowIndex">Новый номер строки.</param>
/// <param name="colIndex">Новый номер столбца.</param>
/// <returns>Тот же объект ICell с новыми координатами (fluent).</returns>
ICell MoveTo(uint rowIndex, uint colIndex);
/// <summary>
/// Перемещает текущую ячейку в новую позицию с буквенным обозначением столбца (как "вырезать-вставить").
/// Исходная ячейка очищается, а текущий объект ICell перемещается в новое место.
/// </summary>
/// <param name="rowIndex">Новый номер строки.</param>
/// <param name="colIndex">Буквенное обозначение столбца.</param>
/// <returns>Тот же объект ICell с новыми координатами.</returns>
ICell MoveTo(uint rowIndex, string colIndex);
/// <summary>Высота строки, содержащей ячейку (чтение и запись).</summary>
RowHeight Height { get; set; }
/// <summary>Ширина столбца, содержащего ячейку.</summary>
ColumnWidth Width { get; set; }
/// <summary>Проверяет, содержит ли ячейка числовое значение (целое или с плавающей точкой).</summary>
bool IsNumber { get; }
/// <summary>Проверяет, является ли содержимое логическим (TRUE/FALSE).</summary>
bool IsBoolean { get; }
/// <summary>Проверяет, содержит ли ячейка код ошибки (например, #DIV/0!).</summary>
bool IsError { get; }
/// <summary>Проверяет, интерпретируется ли значение как дата (по числовому формату).</summary>
bool IsDate { get; }
/// <summary>Проверяет, заблокирована ли ячейка (атрибут защиты).</summary>
bool IsLocked { get; }
/// <summary>Проверяет, содержит ли ячейка формулу.</summary>
bool HasFormula { get; }
/// <summary>Возвращает текстовое представление содержимого ячейки (как оно отображается).</summary>
string GetString();
/// <summary>Возвращает числовой формат ячейки.</summary>
NumberFormatPattern? GetNumberFormat();
/// <summary>Возвращает выравнивание текста ячейки.</summary>
CellAlign GetCellAlign();
/// <summary>Возвращает границы ячейки.</summary>
CellBorder GetCellBorder();
/// <summary>Возвращает заливку ячейки.</summary>
CellFill GetCellFill();
/// <summary>Возвращает шрифт ячейки.</summary>
CellFont GetCellFont();
/// <summary>Пытается извлечь логическое значение.</summary>
bool TryGetBoolean(out bool value);
/// <summary>Возвращает логическое значение или null, если тип не соответствует.</summary>
bool? GetBoolean();
/// <summary>Пытается извлечь дату и время.</summary>
bool TryGetDate(out DateTime value);
/// <summary>Возвращает дату или null.</summary>
DateTime? TryGetDate();
/// <summary>Пытается извлечь число (double).</summary>
bool TryGetNumber(out double value);
/// <summary>Возвращает число или null.</summary>
double? TryGetNumber();
/// <summary>Пытается установить формулу (без вычисленного значения).</summary>
/// <param name="formula">Текст формулы (например, "SUM(A1:A5)").</param>
/// <param name="format">Необязательный числовой формат для результата.</param>
bool TrySet(string formula, NumberFormatPattern? format = null);
/// <summary>Устанавливает формулу (выбрасывает исключение при ошибке).</summary>
ICell Set(string formula, NumberFormatPattern? format = null);
/// <summary>Устанавливает числовой формат ячейки (не меняя значение).</summary>
ICell Set(NumberFormatPattern format);
/// <summary>Устанавливает выравнивание текста ячейки.</summary>
ICell Set(CellAlign format);
/// <summary>Устанавливает границы ячейки.</summary>
ICell Set(CellBorder format);
/// <summary>Устанавливает заливку ячейки.</summary>
ICell Set(CellFill format);
/// <summary>Устанавливает шрифт ячейки.</summary>
ICell Set(CellFont format);
/// <summary>Устанавливает богатый текст (форматированный) с помощью делегата.</summary>
ICell Text(Action<ICellText> value);
/// <summary>Возвращает объект для редактирования богатого текста ячейки (если ячейка содержит InlineString).</summary>
bool TryText(out ICellText cellText);
/// <summary>Возвращает объект для редактирования богатого текста ячейки (если ячейка содержит InlineString).</summary>
ICellText Text();
/// <summary>Устанавливает простое текстовое значение (без форматирования).</summary>
ICell Set(string value);
/// <summary>Устанавливает логическое значение.</summary>
ICell Set(bool value);
/// <summary>Устанавливает дату, опционально с числовым форматом.</summary>
ICell Set(DateTime value, NumberFormatPattern? format = null);
/// <summary>Устанавливает десятичное число (сохраняется как double).</summary>
ICell Set(decimal value, NumberFormatPattern? format = null);
/// <summary>Устанавливает число двойной точности.</summary>
ICell Set(double value, NumberFormatPattern? format = null);
/// <summary>Устанавливает число с плавающей точкой.</summary>
ICell Set(float value, NumberFormatPattern? format = null);
/// <summary>Устанавливает целое число.</summary>
ICell Set(int value, NumberFormatPattern? format = null);
/// <summary>Устанавливает длинное целое число.</summary>
ICell Set(long value, NumberFormatPattern? format = null);
/// <summary>Очищает содержимое ячейки (значение/формулу, но не форматирование).</summary>
void ClearContent();
/// <summary>Очищает форматирование ячейки (сбрасывает стиль).</summary>
void ClearFormat();
/// <summary>Очищает и содержимое, и форматирование.</summary>
void Clear();
}
/// <summary>Представляет богатый текст внутри ячейки (несколько форматированных фрагментов).</summary>
public interface ICellText
{
/// <summary>Количество фрагментов (Run) в тексте.</summary>
int Count { get; }
/// <summary>Возвращает все фрагменты.</summary>
IEnumerable<IRun> GetRuns();
/// <summary>Возвращает фрагмент по индексу или null.</summary>
IRun? GetRunAt(int index);
/// <summary>Пытается получить фрагмент по индексу.</summary>
bool TryGetRunAt(int index, out IRun run);
/// <summary>Первый фрагмент или null.</summary>
IRun? First();
/// <summary>Пытается получить первый фрагмент.</summary>
bool TryGetFirst(out IRun run);
/// <summary>Последний фрагмент или null.</summary>
IRun? Last();
/// <summary>Пытается получить последний фрагмент.</summary>
bool TryGetLast(out IRun run);
/// <summary>Пытается удалить фрагмент.</summary>
bool TryRemoveRun(IRun run);
/// <summary>Удаляет фрагмент по индексу.</summary>
bool TryRemoveRun(int index);
/// <summary>Удаляет фрагмент по индексу и возвращает удалённый.</summary>
bool TryRemoveRun(int index, out IRun? removed);
/// <summary>Добавляет разрыв строки (перенос внутри ячейки).</summary>
ICellText Break();
/// <summary>Добавляет обычный текстовый фрагмент.</summary>
ICellText Run(string text, RunFormat? format = null);
/// <summary>Добавляет фрагмент с последующим разрывом строки.</summary>
ICellText RunBreak(string text, RunFormat? format = null);
/// <summary>Добавляет подстрочный фрагмент (эквивалентно AddRun с Vertical = Subscript).</summary>
ICellText Sub(string text, RunFormat? format = null);
/// <summary>Добавляет надстрочный фрагмент.</summary>
ICellText Sup(string text, RunFormat? format = null);
/// <summary>Вставляет фрагмент по индексу.</summary>
bool TryInsertRun(int index, string text, RunFormat? format = null);
/// <summary>Вставляет фрагмент с последующим разрывом строки по индексу.</summary>
bool TryInsertRunBreak(int index, string text, RunFormat? format = null);
/// <summary>Вставляет подстрочный фрагмент по индексу.</summary>
bool TryInsertSub(int index, string text, RunFormat? format = null);
/// <summary>Вставляет надстрочный фрагмент по индексу.</summary>
bool TryInsertSup(int index, string text, RunFormat? format = null);
/// <summary>Применяет заданный формат ко всем существующим фрагментам (поверх их текущего форматирования, заменяя неуказанные свойства).</summary>
void ApplyFormatToAllRuns(RunFormat format);
/// <summary>Удаляет все фрагменты, очищая текст ячейки.</summary>
void Clear();
}
/// <summary>Представляет один форматированный фрагмент текста внутри ячейки.</summary>
public interface IRun
{
/// <summary>Текст фрагмента.</summary>
string Text { get; set; }
/// <summary>Форматирование фрагмента (может быть null, что означает отсутствие явного форматирования).</summary>
RunFormat? Format { get; set; }
}