KOP-PIbd-32-Katysheva-N-E/ComponentsLibrary/ComponentTable.cs
2024-10-28 20:23:38 +04:00

145 lines
5.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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