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

145 lines
5.3 KiB
C#
Raw Normal View History

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
}