112 lines
3.9 KiB
C#
112 lines
3.9 KiB
C#
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);
|
||
}
|
||
}
|
||
}
|
||
}
|