using Aspose.Words; using Aspose.Words.Tables; using ComponentsLibrary.entities; using System.ComponentModel; namespace ComponentsLibrary { public partial class ComponentTable : Component { public ComponentTable() { InitializeComponent(); } public ComponentTable(IContainer container) { container.Add(this); InitializeComponent(); } public void CreateTable(DocumentTable tableWord) where T : class { // Проверка наличия данных и определений столбцов if (tableWord.Items == null || tableWord.Items.Count == 0 || tableWord.ColumnParameters == null || tableWord.ColumnParameters.Count == 0) { throw new ArgumentException("Не все данные заполнены"); } // Проверка, что все ячейки шапки заполнены и для каждого столбца определено свойство/поле класса foreach (var columnParameters in tableWord.ColumnParameters) { if (string.IsNullOrEmpty(columnParameters.PropertyName)) { throw new ArgumentException($"Incomplete column definition: {columnParameters.FirstRowHeader}"); } } // Создание документа Document document = new Document(); DocumentBuilder builder = new DocumentBuilder(document); // Установка стиля заголовка Style titleStyle = builder.Document.Styles.Add(StyleType.Paragraph, "Title"); titleStyle.Font.Size = 16; titleStyle.Font.Bold = true; // Установка заголовка документа builder.ParagraphFormat.Style = titleStyle; builder.Writeln(tableWord.Title); // Создание таблицы Table table = builder.StartTable(); // Установка стиля для шапки таблицы Style headerStyle = builder.Document.Styles.Add(StyleType.Paragraph, "HeaderStyle"); headerStyle.Font.Size = 14; headerStyle.Font.Bold = true; // Создание первой строки (шапка) foreach (var columnParameters in tableWord.ColumnParameters) { builder.InsertCell(); builder.ParagraphFormat.Style = headerStyle; builder.CellFormat.PreferredWidth = PreferredWidth.FromPoints(columnParameters.Width); builder.Write(columnParameters.FirstRowHeader); } builder.EndRow(); // Создание второй строки (шапка) foreach (var columnParameters in tableWord.ColumnParameters) { builder.InsertCell(); builder.ParagraphFormat.Style = headerStyle; builder.CellFormat.PreferredWidth = PreferredWidth.FromPoints(columnParameters.Width); builder.Write(columnParameters.SecondRowHeader); } builder.EndRow(); int startCellIndex = -1; int endCellIndex = -1; // Создаем набор для хранения индексов ячеек, которые уже объединены по горизонтали HashSet horizontallyMergedCells = new(); // Объединение ячеек в первой строке шапки таблицы (если необходимо) foreach (var mergedColumn in tableWord.MergedColumns) { startCellIndex = mergedColumn[0]; endCellIndex = mergedColumn[^1]; for (int i = startCellIndex; i <= endCellIndex; i++) { // Устанавливаем горизонтальное объединение table.Rows[0].Cells[i].CellFormat.HorizontalMerge = i == startCellIndex ? CellMerge.First : CellMerge.Previous; horizontallyMergedCells.Add(i); // Сохраняем индекс ячейки, которая объединена по горизонтали // Устанавливаем выравнивание по центру if (i == startCellIndex) { // Центрируем текст внутри ячейки table.Rows[0].Cells[i].Paragraphs[0].ParagraphFormat.Alignment = ParagraphAlignment.Center; } } } // Установка вертикального объединения заголовков for (int columnIndex = 0; columnIndex < tableWord.ColumnParameters.Count; columnIndex++) { // Пропускаем столбцы, которые уже объединены по горизонтали if (horizontallyMergedCells.Contains(columnIndex)) continue; table.Rows[0].Cells[columnIndex].CellFormat.VerticalMerge = CellMerge.First; table.Rows[1].Cells[columnIndex].CellFormat.VerticalMerge = CellMerge.Previous; } // Установка стиля для данных таблицы Style dataStyle = builder.Document.Styles.Add(StyleType.Paragraph, "DataStyle"); dataStyle.Font.Size = 12; dataStyle.Font.Bold = false; // Вставка данных в таблицу foreach (var item in tableWord.Items) { foreach (var сolumnParameters in tableWord.ColumnParameters) { builder.InsertCell(); builder.ParagraphFormat.Style = dataStyle; // Получение значения свойства/поля объекта по заданному имени var propertyValue = item.GetType().GetProperty(сolumnParameters.PropertyName)?.GetValue(item)?.ToString(); builder.Write(propertyValue ?? string.Empty); } builder.EndRow(); } builder.EndTable(); // Сохранение документа в файл document.Save(tableWord.FileUrl); } } }