151 lines
4.9 KiB
C#
Raw Normal View History

2024-10-16 13:59:02 +03:00
using BarsukovComponents.NotVisualComponents.Configs;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using MigraDoc;
using MigraDoc.DocumentObjectModel;
using PdfSharp.Pdf;
using MigraDoc.Rendering;
using BarsukovComponents.Exceptions;
namespace BarsukovComponents.NotVisualComponents
{
public partial class PdfTable : Component
{
public PdfTable()
{
InitializeComponent();
}
public PdfTable(IContainer container)
{
container.Add(this);
InitializeComponent();
}
public void CreateTable<T>(string docPath, string title, List<MergeCells>? mergeCells, List<ColumnInfo> colInfo, List<T> data) where T : class, new()
{
if (string.IsNullOrEmpty(docPath))
{
throw new ArgumentNullException("Введите путь до файла!");
}
if (string.IsNullOrEmpty(title))
{
throw new ArgumentNullException("Введите заголовок");
}
if (colInfo == null)
{
throw new ArgumentNullException("Введите все заголовки");
}
if (data == null)
{
throw new ArgumentNullException("Нету информации для вывода");
}
Document _document = new Document();
var style = _document.Styles["Normal"];
style.Font.Name = "Times New Roman";
style.Font.Size = 14;
Section _section = _document.AddSection();
//Заголовок
var paragraph = _section.AddParagraph(title);
paragraph.Format.SpaceAfter = "0.3cm";
paragraph.Format.Font.Size = "16";
paragraph.Format.Font.Bold = true;
paragraph.Format.Alignment = ParagraphAlignment.Center;
//Создание таблицы
var table = _section.AddTable();
table.Borders.Visible = true;
//Создание колонок
for (int i = 0; i < colInfo.Count; i++)
{
table.AddColumn(colInfo[i].Width);
}
//Создание строк
if (mergeCells != null)
{
table.AddRow();
}
var row = table.AddRow();
for (int i = 0; i < colInfo.Count; i++)
{
row[i].AddParagraph(colInfo[i].Header);
}
List<int> MergeColls = new List<int>();
//Объединение ячеек в строке
if (mergeCells != null)
{
foreach (var cell in mergeCells)
{
MergeColls.AddRange(cell.Indexes[0..]);
table.Rows[0].Cells[cell.Indexes[0]].MergeRight = cell.Indexes[1..].Length;
table.Rows[0].Cells[cell.Indexes[0]].AddParagraph(cell.Header);
}
}
int cellsCount = table.Rows[1].Cells.Count;
//Объединение ячеек в столбце
if (MergeColls.Count != 0)
{
for (int i = 0; i < cellsCount; i++)
{
var cell = table.Rows[0].Cells[i];
if (!MergeColls.Contains(i))
{
cell.MergeDown = 1;
cell.AddParagraph(colInfo[i].Header);
}
}
}
//Вывод данных
int rowData = 2;
foreach (var item in data)
{
var properties = item.GetType().GetProperties();
//if (properties.Count() != cellsCount)
//{
// throw new Exception("Кол-во полей объекта не совпадает с кол-вом колонок");
//}
2024-10-16 13:59:02 +03:00
for (int i = 0; i < cellsCount; i++)
2024-10-16 13:59:02 +03:00
{
var property = properties.FirstOrDefault(p => p.Name == colInfo[i].PropertyName);
if (property != null)
2024-10-16 13:59:02 +03:00
{
var propValue = property.GetValue(item);
if (propValue == null)
{
throw new Exception("Пустое поле");
}
2024-10-16 13:59:02 +03:00
if (table.Rows.Count <= rowData)
{
table.AddRow();
}
table.Rows[rowData].Cells[i].AddParagraph(propValue.ToString());
}
}
2024-10-22 16:40:02 +04:00
rowData++;
2024-10-16 13:59:02 +03:00
}
var renderer = new PdfDocumentRenderer(true);
renderer.Document = _document;
renderer.RenderDocument();
renderer.PdfDocument.Save(docPath);
}
}
}