96 lines
3.1 KiB
C#
Raw Normal View History

2024-10-16 14:03:22 +04:00
using MigraDoc.DocumentObjectModel.Tables;
using MigraDoc.DocumentObjectModel;
using MigraDoc.Rendering;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Components.SaveToPdfHelpers;
namespace Components.NonVisual
{
public partial class HeaderedTablePDF : Component
{
public HeaderedTablePDF()
{
InitializeComponent();
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
}
public HeaderedTablePDF(IContainer container)
{
container.Add(this);
2024-10-30 14:26:40 +04:00
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
2024-10-16 14:03:22 +04:00
InitializeComponent();
}
public void GeneratePDFWithHead<T>(PDFTableSettings<T> settings)
{
if (settings == null ||
string.IsNullOrEmpty(settings.FilePath) ||
string.IsNullOrEmpty(settings.DocumentTitle) ||
2024-10-30 14:26:40 +04:00
settings.HeaderTitles == null || settings.HeaderTitles.Count == 0 ||
settings.ColumnWidths == null || settings.DataList == null ||
settings.ColumnPropertyMappings == null)
2024-10-16 14:03:22 +04:00
throw new ArgumentException("Заполнены не все необходимые данные для генерации документа.");
2024-10-30 14:26:40 +04:00
if (settings.HeaderTitles.Count != settings.ColumnWidths.Count)
throw new ArgumentException("Количество заголовков должно совпадать с количеством ширин столбцов.");
2024-10-16 14:03:22 +04:00
Document document = new Document();
Section section = document.AddSection();
section.AddParagraph(settings.DocumentTitle, "Heading1");
Table table = new Table();
table.Borders.Width = 0.75;
// столбцы
2024-10-30 14:26:40 +04:00
for (int i = 0; i < settings.ColumnWidths.Count; i++)
2024-10-16 14:03:22 +04:00
{
2024-10-30 14:26:40 +04:00
Column column = table.AddColumn(Unit.FromCentimeter(settings.ColumnWidths[i]));
2024-10-16 14:03:22 +04:00
column.Format.Alignment = ParagraphAlignment.Center;
}
// заголовки
Row headerRow = table.AddRow();
headerRow.Height = Unit.FromCentimeter(settings.HeaderRowHeight);
2024-10-30 14:26:40 +04:00
for (int i = 0; i < settings.HeaderTitles.Count; i++)
2024-10-16 14:03:22 +04:00
{
2024-10-30 14:26:40 +04:00
headerRow.Cells[i].AddParagraph(settings.HeaderTitles[i]);
headerRow.Cells[i].Format.Font.Bold = true;
headerRow.Cells[i].Format.Alignment = ParagraphAlignment.Center;
2024-10-16 14:03:22 +04:00
}
// данные
foreach (var dataItem in settings.DataList)
{
Row row = table.AddRow();
row.Height = Unit.FromCentimeter(settings.DataRowHeight);
2024-10-30 14:26:40 +04:00
foreach (var columnMapping in settings.ColumnPropertyMappings)
2024-10-16 14:03:22 +04:00
{
2024-10-30 14:26:40 +04:00
PropertyInfo propertyInfo = typeof(T).GetProperty(columnMapping.Value);
2024-10-16 14:03:22 +04:00
if (propertyInfo == null)
2024-10-30 14:26:40 +04:00
throw new ArgumentException($"Свойство {columnMapping.Value} не найдено в классе {typeof(T).Name}.");
2024-10-16 14:03:22 +04:00
object value = propertyInfo.GetValue(dataItem);
2024-10-30 14:26:40 +04:00
row.Cells[columnMapping.Key].AddParagraph(value != null ? value.ToString() : "");
2024-10-16 14:03:22 +04:00
}
}
section.Add(table);
PdfDocumentRenderer renderer = new PdfDocumentRenderer(true) { Document = document };
renderer.RenderDocument();
renderer.Save(settings.FilePath);
}
}
}