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);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|