using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; using System.ComponentModel; namespace ComponentsLibrary { public partial class ComponentTable : Component { public ComponentTable() { InitializeComponent(); } public ComponentTable(IContainer container) { container.Add(this); InitializeComponent(); } public void CreateDocument(string filePath, DocumentTable documentTable) { ValidateInput(documentTable); using (WordprocessingDocument wordDocument = WordprocessingDocument.Create(filePath, DocumentFormat.OpenXml.WordprocessingDocumentType.Document)) { MainDocumentPart mainPart = wordDocument.AddMainDocumentPart(); mainPart.Document = new Document(); Body body = new Body(); // Добавление заголовка Paragraph titleParagraph = new Paragraph(new Run(new Text(documentTable.DocumentTitle))); body.Append(titleParagraph); // Создание таблицы Table table = new Table(); CreateHeaderRows(documentTable, table); FillTableData(documentTable, table); body.Append(table); mainPart.Document.Append(body); mainPart.Document.Save(); } } private void ValidateInput(DocumentTable documentTable) { // Проводим проверки на заполненность и соответствие if (string.IsNullOrEmpty(documentTable.DocumentTitle)) throw new ArgumentException("Заголовок документа не может быть пустым."); if (documentTable.Headers == null || documentTable.Headers.Count == 0 || documentTable.PropertyMappings == null || documentTable.PropertyMappings.Count == 0) throw new ArgumentException("Заголовки и отображения свойств должны быть заполнены."); if (documentTable.Data == null || !documentTable.Data.Any()) throw new ArgumentException("Данные таблицы не могут быть пустыми."); // Проверка на некорректные столбцы объединения foreach (var column in documentTable.MergedColumns) { if (column < 0 || column >= documentTable.Headers.Count) throw new ArgumentOutOfRangeException($"Неверный номер объединяемого столбца: {column}"); } // Проверка, что все заголовки заполнены foreach (var header in documentTable.Headers) { if (string.IsNullOrEmpty(header)) throw new ArgumentException("Все заголовки должны быть заполнены."); } } private void CreateHeaderRows(DocumentTable documentTable, Table table) { // Создаем две строки заголовков for (int rowIndex = 0; rowIndex < 2; rowIndex++) { TableRow headerRow = new TableRow(); for (int colIndex = 0; colIndex < documentTable.Headers.Count; colIndex++) { TableCell cell = new TableCell(new Paragraph(new Run(new Text(documentTable.Headers[colIndex])))); if (!documentTable.MergedColumns.Contains(colIndex)) { // Объединяем ячейку по строкам cell.VerticalMerge = new TableCellVerticalMerge(); } headerRow.Append(cell); } table.Append(headerRow); } } private void FillTableData(DocumentTable documentTable, Table table) { // Заполнение данных таблицы foreach (var item in documentTable.Data) { TableRow dataRow = new TableRow(); for (int colIndex = 0; colIndex < documentTable.PropertyMappings.Count; colIndex++) { var propertyValue = typeof(T).GetProperty(documentTable.PropertyMappings[colIndex])?.GetValue(item, null); TableCell cell = new TableCell(new Paragraph(new Run(new Text(propertyValue?.ToString() ?? string.Empty)))); dataRow.Append(cell); } table.Append(dataRow); } } } }