858 lines
53 KiB
C#
858 lines
53 KiB
C#
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>Возвращает диапазон ячеек по начальным и конечным индексам строк и столбцов.</summary>
|
||
bool TryMergeByIndexes(uint startRow, uint startCol, uint endRow, uint endCol);
|
||
|
||
/// <summary>Возвращает диапазон ячеек по начальным и конечным координатам с буквенным обозначением столбцов.</summary>
|
||
bool TryMergeByIndexes(uint startRow, string startCol, uint endRow, string endCol);
|
||
|
||
/// <summary>Возвращает диапазон, начиная с указанной ячейки, заданной размером (строки x столбцы).</summary>
|
||
bool TryMergeByLength(uint startRow, uint startCol, uint rows, uint cols);
|
||
|
||
/// <summary>Возвращает диапазон по начальной ячейке и размеру с буквенным обозначением столбца.</summary>
|
||
bool TryMergeByLength(uint startRow, string startCol, uint rows, uint cols);
|
||
|
||
/// <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 Set(NumberFormatPattern format);
|
||
|
||
/// <summary>Устанавливает выравнивание для всех ячеек диапазона.</summary>
|
||
IRow Set(CellAlign format);
|
||
|
||
/// <summary>Устанавливает границы для всех ячеек диапазона.</summary>
|
||
IRow Set(CellBorder format);
|
||
|
||
/// <summary>Устанавливает заливку для всех ячеек диапазона.</summary>
|
||
IRow Set(CellFill format);
|
||
|
||
/// <summary>Устанавливает шрифт для всех ячеек диапазона.</summary>
|
||
IRow Set(CellFont format);
|
||
|
||
/// <summary>Устанавливает шрифт ячейки.</summary>
|
||
IRow Set(CellStyle font);
|
||
|
||
/// <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 Set(NumberFormatPattern format);
|
||
|
||
/// <summary>Устанавливает выравнивание для всех ячеек диапазона.</summary>
|
||
IColumn Set(CellAlign format);
|
||
|
||
/// <summary>Устанавливает границы для всех ячеек диапазона.</summary>
|
||
IColumn Set(CellBorder format);
|
||
|
||
/// <summary>Устанавливает заливку для всех ячеек диапазона.</summary>
|
||
IColumn Set(CellFill format);
|
||
|
||
/// <summary>Устанавливает шрифт для всех ячеек диапазона.</summary>
|
||
IColumn Set(CellFont format);
|
||
|
||
/// <summary>Устанавливает шрифт ячейки.</summary>
|
||
IColumn Set(CellStyle font);
|
||
|
||
/// <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 Set(NumberFormatPattern format);
|
||
|
||
/// <summary>Устанавливает выравнивание для всех ячеек диапазона.</summary>
|
||
IRange Set(CellAlign format);
|
||
|
||
/// <summary>Устанавливает границы для всех ячеек диапазона.</summary>
|
||
IRange Set(CellBorder format);
|
||
|
||
/// <summary>Устанавливает заливку для всех ячеек диапазона.</summary>
|
||
IRange Set(CellFill format);
|
||
|
||
/// <summary>Устанавливает шрифт для всех ячеек диапазона.</summary>
|
||
IRange Set(CellFont format);
|
||
|
||
/// <summary>Устанавливает шрифт ячейки.</summary>
|
||
IRange Set(CellStyle font);
|
||
|
||
/// <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>Количество фрагментов (Run) в тексте.</summary>
|
||
int RunsCount { 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>
|
||
ICell Break();
|
||
|
||
/// <summary>Добавляет обычный текстовый фрагмент.</summary>
|
||
ICell Run(string text, RunFormat? format = null);
|
||
|
||
/// <summary>Добавляет фрагмент с последующим разрывом строки.</summary>
|
||
ICell RunBreak(string text, RunFormat? format = null);
|
||
|
||
/// <summary>Добавляет подстрочный фрагмент (эквивалентно AddRun с Vertical = Subscript).</summary>
|
||
ICell Sub(string text, RunFormat? format = null);
|
||
|
||
/// <summary>Добавляет надстрочный фрагмент.</summary>
|
||
ICell 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>
|
||
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>
|
||
CellStyle? GetCellStyle();
|
||
|
||
/// <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 TrySetFormula(string formula, NumberFormatPattern? format = null);
|
||
|
||
/// <summary>Устанавливает формулу (выбрасывает исключение при ошибке).</summary>
|
||
ICell SetFormula(string formula, NumberFormatPattern? format = null);
|
||
|
||
/// <summary>Устанавливает числовой формат ячейки (не меняя значение).</summary>
|
||
ICell Set(NumberFormatPattern format);
|
||
|
||
/// <summary>Устанавливает выравнивание текста ячейки.</summary>
|
||
ICell Set(CellAlign align);
|
||
|
||
/// <summary>Устанавливает границы ячейки.</summary>
|
||
ICell Set(CellBorder border);
|
||
|
||
/// <summary>Устанавливает заливку ячейки.</summary>
|
||
ICell Set(CellFill fill);
|
||
|
||
/// <summary>Устанавливает шрифт ячейки.</summary>
|
||
ICell Set(CellFont font);
|
||
|
||
/// <summary>Устанавливает стиль ячейки.</summary>
|
||
ICell Set(CellStyle style);
|
||
|
||
/// <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 IRun
|
||
{
|
||
/// <summary>Текст фрагмента.</summary>
|
||
string Text { get; set; }
|
||
|
||
/// <summary>Форматирование фрагмента (может быть null, что означает отсутствие явного форматирования).</summary>
|
||
RunFormat? Format { get; set; }
|
||
} |