KOP-PIbd-32-Katysheva-N-E/ComponentsLibrary/ComponentTable.cs

112 lines
3.9 KiB
C#
Raw Normal View History

2024-09-30 23:54:03 +04:00
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<T> 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<T> 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<T> 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<T> 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);
}
}
}
}