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