namespace QWERTYkez.ExcelProcessor.Editors; /// /// Внутренняя реализация . /// internal sealed class ExcelSheet : ISheet { internal readonly ExcelWriter Book; internal readonly Sheet SheetElement; internal readonly Worksheet Worksheet; internal readonly uint SheetId; internal ExcelSheet(ExcelWriter book, Sheet sheetElement, uint sheetId) { Book = book; SheetElement = sheetElement; SheetId = sheetId; string partId = SheetElement.Id?.Value ?? string.Empty; if (string.IsNullOrEmpty(partId)) throw new InvalidOperationException("Sheet has no relationship ID"); if (Book._doc.WorkbookPart?.GetPartById(partId) is not WorksheetPart part) throw new InvalidOperationException("WorksheetPart not found"); if (part.Worksheet is not Worksheet worksheet) throw new InvalidOperationException("WorksheetPart not found"); Worksheet = worksheet; } public int Index => (int)SheetId; public string Name => SheetElement.Name?.Value ?? string.Empty; public bool TrySetName(string name) { if (string.IsNullOrEmpty(name)) return false; Book.ThrowIfDisposed(); SheetElement.Name = name; return true; } public IRow Row(uint row) => new ExcelRow(Book, this, row); public ISheet Row(uint row, Action edit) { edit(Row(row)); return this; } public IColumn Col(uint col) => new ExcelColumn(Book, this, col); public ISheet Col(uint col, Action edit) { edit(Col(col)); return this; } public IColumn Col(string col) => Col(CellAddressHelper.ColumnLetterToIndex(col)); public ISheet Col(string col, Action edit) { edit(Col(col)); return this; } public ICell Cell(uint row, uint col) => new ExcelCell(Book, this, row, col); public ISheet Cell(uint row, uint col, Action edit) { edit(Cell(row, col)); return this; } public ISheet Cell(uint row, uint col, string value) { Cell(row, col).Set(value); return this; } public ISheet Cell(uint row, uint col, bool value) { Cell(row, col).Set(value); return this; } public ISheet Cell(uint row, uint col, string formula, NumberFormatPattern? format = null) { Cell(row, col).Set(formula, format); return this; } public ISheet Cell(uint row, uint col, DateTime value, NumberFormatPattern? format = null) { Cell(row, col).Set(value, format); return this; } public ISheet Cell(uint row, uint col, decimal value, NumberFormatPattern? format = null) { Cell(row, col).Set(value, format); return this; } public ISheet Cell(uint row, uint col, double value, NumberFormatPattern? format = null) { Cell(row, col).Set(value, format); return this; } public ISheet Cell(uint row, uint col, float value, NumberFormatPattern? format = null) { Cell(row, col).Set(value, format); return this; } public ISheet Cell(uint row, uint col, int value, NumberFormatPattern? format = null) { Cell(row, col).Set(value, format); return this; } public ISheet Cell(uint row, uint col, long value, NumberFormatPattern? format = null) { Cell(row, col).Set(value, format); return this; } public ICell Cell(uint row, string col) => Cell(row, CellAddressHelper.ColumnLetterToIndex(col)); public ISheet Cell(uint row, string col, Action edit) { edit(Cell(row, col)); return this; } public ISheet Cell(uint row, string col, string value) { Cell(row, col).Set(value); return this; } public ISheet Cell(uint row, string col, bool value) { Cell(row, col).Set(value); return this; } public ISheet Cell(uint row, string col, string formula, NumberFormatPattern? format = null) { Cell(row, col).Set(formula, format); return this; } public ISheet Cell(uint row, string col, DateTime value, NumberFormatPattern? format = null) { Cell(row, col).Set(value, format); return this; } public ISheet Cell(uint row, string col, decimal value, NumberFormatPattern? format = null) { Cell(row, col).Set(value, format); return this; } public ISheet Cell(uint row, string col, double value, NumberFormatPattern? format = null) { Cell(row, col).Set(value, format); return this; } public ISheet Cell(uint row, string col, float value, NumberFormatPattern? format = null) { Cell(row, col).Set(value, format); return this; } public ISheet Cell(uint row, string col, int value, NumberFormatPattern? format = null) { Cell(row, col).Set(value, format); return this; } public ISheet Cell(uint row, string col, long value, NumberFormatPattern? format = null) { Cell(row, col).Set(value, format); return this; } public void ClearContents() { var sheetData = GetSheetData(); foreach (var row in sheetData.Elements().ToList()) { foreach (var cell in row.Elements().ToList()) cell.Remove(); } } public void ClearFormats() { var sheetData = GetSheetData(); foreach (var row in sheetData.Elements()) { foreach (var cell in row.Elements()) cell.StyleIndex = null; } } public void Clear() { ClearContents(); ClearFormats(); } public void Remove() => Book.TryRemoveSheet(this); // Вспомогательные методы internal SheetData GetSheetData() { var worksheet = Worksheet; var sheetData = worksheet.GetFirstChild(); if (sheetData == null) { sheetData = new SheetData(); worksheet.Append(sheetData); } return sheetData; } #region Range Operations /// public IRange RangeByIndexes(uint startRow, uint startCol, uint endRow, uint endCol) { return new ExcelRange(Book, this, startRow, startCol, endRow, endCol); } /// public IRange RangeByIndexes(uint startRow, string startCol, uint endRow, string endCol) { uint startColIdx = CellAddressHelper.ColumnLetterToIndex(startCol); uint endColIdx = CellAddressHelper.ColumnLetterToIndex(endCol); return new ExcelRange(Book, this, startRow, startColIdx, endRow, endColIdx); } /// public ISheet RangeByIndexes(uint startRow, uint startCol, uint endRow, uint endCol, Action edit) { var range = RangeByIndexes(startRow, startCol, endRow, endCol); edit(range); return this; } /// public ISheet RangeByIndexes(uint startRow, string startCol, uint endRow, string endCol, Action edit) { var range = RangeByIndexes(startRow, startCol, endRow, endCol); edit(range); return this; } /// public IRange RangeByLength(uint startRow, uint startCol, uint rows, uint cols) { if (rows == 0 || cols == 0) throw new ArgumentException("Rows and columns must be greater than 0"); uint endRow = startRow + rows - 1; uint endCol = startCol + cols - 1; return new ExcelRange(Book, this, startRow, startCol, endRow, endCol); } /// public IRange RangeByLength(uint startRow, string startCol, uint rows, uint cols) { uint startColIdx = CellAddressHelper.ColumnLetterToIndex(startCol); return RangeByLength(startRow, startColIdx, rows, cols); } /// public ISheet RangeByLength(uint startRow, uint startCol, uint rows, uint cols, Action edit) { var range = RangeByLength(startRow, startCol, rows, cols); edit(range); return this; } /// public ISheet RangeByLength(uint startRow, string startCol, uint rows, uint cols, Action edit) { var range = RangeByLength(startRow, startCol, rows, cols); edit(range); return this; } #endregion }