145 lines
5.3 KiB
C#
145 lines
5.3 KiB
C#
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);
|
||
}
|
||
|
||
}
|
||
}
|