diff --git a/ComponentProgramming/ComponentProgramming/LargeTextComponent.Designer.cs b/ComponentProgramming/ComponentProgramming/Components/LargeTextComponent.Designer.cs
similarity index 100%
rename from ComponentProgramming/ComponentProgramming/LargeTextComponent.Designer.cs
rename to ComponentProgramming/ComponentProgramming/Components/LargeTextComponent.Designer.cs
diff --git a/ComponentProgramming/ComponentProgramming/LargeTextComponent.cs b/ComponentProgramming/ComponentProgramming/Components/LargeTextComponent.cs
similarity index 100%
rename from ComponentProgramming/ComponentProgramming/LargeTextComponent.cs
rename to ComponentProgramming/ComponentProgramming/Components/LargeTextComponent.cs
diff --git a/ComponentProgramming/ComponentProgramming/Components/Models/ColumnInfo.cs b/ComponentProgramming/ComponentProgramming/Components/Models/ColumnInfo.cs
new file mode 100644
index 0000000..b7cdf72
--- /dev/null
+++ b/ComponentProgramming/ComponentProgramming/Components/Models/ColumnInfo.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ComponentProgramming.Components.Models
+{
+ public class ColumnInfo
+ {
+ public string PropertyName;
+ public string Header;
+ public int Width;
+
+ public ColumnInfo(string propertyName, string header, int width)
+ {
+ PropertyName = propertyName;
+ Header = header;
+ Width = width;
+ }
+ }
+}
diff --git a/ComponentProgramming/ComponentProgramming/Components/Models/MergeCells.cs b/ComponentProgramming/ComponentProgramming/Components/Models/MergeCells.cs
new file mode 100644
index 0000000..44e6774
--- /dev/null
+++ b/ComponentProgramming/ComponentProgramming/Components/Models/MergeCells.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ComponentProgramming.Components.Models
+{
+ public class MergeCells
+ {
+ public string Header;
+ public int[] Indexes;
+
+ public MergeCells(string header, int[] indexes)
+ {
+ Header = header;
+ Indexes = indexes;
+ }
+ }
+}
diff --git a/ComponentProgramming/ComponentProgramming/Components/TableComponent.Designer.cs b/ComponentProgramming/ComponentProgramming/Components/TableComponent.Designer.cs
new file mode 100644
index 0000000..6d00d51
--- /dev/null
+++ b/ComponentProgramming/ComponentProgramming/Components/TableComponent.Designer.cs
@@ -0,0 +1,36 @@
+namespace ComponentProgramming.Components
+{
+ partial class TableComponent
+ {
+ ///
+ /// Обязательная переменная конструктора.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Освободить все используемые ресурсы.
+ ///
+ /// истинно, если управляемый ресурс должен быть удален; иначе ложно.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Код, автоматически созданный конструктором компонентов
+
+ ///
+ /// Требуемый метод для поддержки конструктора — не изменяйте
+ /// содержимое этого метода с помощью редактора кода.
+ ///
+ private void InitializeComponent()
+ {
+ components = new System.ComponentModel.Container();
+ }
+
+ #endregion
+ }
+}
diff --git a/ComponentProgramming/ComponentProgramming/Components/TableComponent.cs b/ComponentProgramming/ComponentProgramming/Components/TableComponent.cs
new file mode 100644
index 0000000..6bceb44
--- /dev/null
+++ b/ComponentProgramming/ComponentProgramming/Components/TableComponent.cs
@@ -0,0 +1,146 @@
+using ComponentProgramming.Components.Models;
+using MigraDoc.DocumentObjectModel;
+using MigraDoc.Rendering;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ComponentProgramming.Components
+{
+ public partial class TableComponent : Component
+ {
+ private Document? _document;
+
+ private Section? _section;
+
+ public TableComponent()
+ {
+ InitializeComponent();
+ }
+
+ public TableComponent(IContainer container)
+ {
+ container.Add(this);
+
+ InitializeComponent();
+ }
+
+ public void CreateTable(string docPath, string title, List? mergeCells, List colInfo, List 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 = new Document();
+ var style = _document.Styles["Normal"];
+ style.Font.Name = "Times New Roman";
+ style.Font.Size = 14;
+
+ _section = _document.AddSection();
+
+ //Заголовок
+ var paragraph = _section.AddParagraph(title);
+ paragraph.Format.SpaceAfter = "0.3cm";
+
+ //Создание таблицы
+ 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 MergeColls = new List();
+
+ //Объединение ячеек в строке
+ if(mergeCells != null)
+ {
+ foreach (var cell in mergeCells)
+ {
+ MergeColls.AddRange(cell.Indexes[1..]);
+ table.Rows[cell.Indexes[0]].Cells[cell.Indexes[1] - 1].MergeRight = cell.Indexes[2..].Length;
+ table.Rows[cell.Indexes[0]].Cells[cell.Indexes[1] - 1].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+1))
+ {
+ 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("Кол-во полей объекта не совпадает с кол-вом колонок");
+ }
+
+ for(int i = 0; i < properties.Count(); i++)
+ {
+ var property = properties[i];
+ var propValue = property.GetValue(item);
+ if (propValue == null) throw new Exception("Пустое поле");
+ if(property.Name == colInfo[i].PropertyName)
+ {
+ if (table.Rows.Count <= rowData) table.AddRow();
+ table.Rows[rowData].Cells[i].AddParagraph(propValue.ToString()!);
+ continue;
+ }
+ }
+ rowData++;
+ }
+
+ var renderer = new PdfDocumentRenderer(true);
+ renderer.Document = _document;
+ renderer.RenderDocument();
+ renderer.PdfDocument.Save(docPath);
+ }
+ }
+}
diff --git a/ComponentProgramming/Forms/Form.Designer.cs b/ComponentProgramming/Forms/Form.Designer.cs
index 4c974aa..6a773cf 100644
--- a/ComponentProgramming/Forms/Form.Designer.cs
+++ b/ComponentProgramming/Forms/Form.Designer.cs
@@ -34,7 +34,7 @@
buttonGetObj = new Button();
buttonEnter = new Button();
controlListBox = new ComponentProgramming.ControlListBox();
- largeTextComponent = new ComponentProgramming.Components.LargeTextComponent(components);
+ tableComponent = new ComponentProgramming.Components.TableComponent(components);
SuspendLayout();
//
// controlComboBox
@@ -108,6 +108,6 @@
private Button buttonGetObj;
private Button buttonEnter;
private ComponentProgramming.ControlListBox controlListBox;
- private ComponentProgramming.Components.LargeTextComponent largeTextComponent;
+ private ComponentProgramming.Components.TableComponent tableComponent;
}
}
diff --git a/ComponentProgramming/Forms/Form.cs b/ComponentProgramming/Forms/Form.cs
index f212d5e..d79094a 100644
--- a/ComponentProgramming/Forms/Form.cs
+++ b/ComponentProgramming/Forms/Form.cs
@@ -1,3 +1,5 @@
+using ComponentProgramming.Components.Models;
+
namespace Forms
{
public partial class Form : System.Windows.Forms.Form
@@ -9,7 +11,28 @@ namespace Forms
FillTextBox();
FillList();
string[] strings = new string[] { " , ( )", " ( ) ( )" };
- largeTextComponent.CreateDocument("C:\\Users\\shotb\\source\\repos\\KOP\\ComponentProgramming\\Forms\\text.pdf", "", strings);
+ //largeTextComponent.CreateDocument("C:\\Users\\shotb\\source\\repos\\KOP\\ComponentProgramming\\Forms\\text.pdf", "", strings);
+ List colInfos = new List()
+ {
+ new ColumnInfo("Name","",50),
+ new ColumnInfo("Surname","",100),
+ new ColumnInfo("Phone","",100),
+ new ColumnInfo("Email","",200),
+ new ColumnInfo("Password","",50),
+ };
+ List mergeCells = new List()
+ {
+ new MergeCells("", new int[] {0,3,4})
+ };
+ List workers = new List()
+ {
+ new Worker("", "", "+88005553535", "mail@gmail.ru", "pass123"),
+ new Worker("", "", "+88005553535", "mail@gmail.ru", "pass123"),
+ new Worker("", "", "+88005553535", "mail@gmail.ru", "pass123"),
+ new Worker("", "", "+88005553535", "mail@gmail.ru", "pass123"),
+ };
+ tableComponent.CreateTable("C:\\Users\\shotb\\source\\repos\\KOP\\ComponentProgramming\\Forms\\table.pdf", "", mergeCells, colInfos, workers);
+
}
private void FillBox()
diff --git a/ComponentProgramming/Forms/Form.resx b/ComponentProgramming/Forms/Form.resx
index d491498..3062234 100644
--- a/ComponentProgramming/Forms/Form.resx
+++ b/ComponentProgramming/Forms/Form.resx
@@ -117,7 +117,7 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
+
17, 17
\ No newline at end of file
diff --git a/ComponentProgramming/Forms/Worker.cs b/ComponentProgramming/Forms/Worker.cs
new file mode 100644
index 0000000..f2975d7
--- /dev/null
+++ b/ComponentProgramming/Forms/Worker.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Forms
+{
+ public class Worker
+ {
+ public string Name { get; set; } = string.Empty;
+
+ public string Surname { get; set; } = string.Empty;
+
+ public string Phone { get; set; } = string.Empty;
+
+ public string Email { get; set; } = string.Empty;
+
+ public string Password { get; set; } = string.Empty;
+
+ public Worker() { }
+
+ public Worker(string name, string surname, string phone, string email, string password)
+ {
+ Name = name;
+ Surname = surname;
+ Phone = phone;
+ Email = email;
+ Password = password;
+ }
+ }
+}
diff --git a/ComponentProgramming/Forms/table.pdf b/ComponentProgramming/Forms/table.pdf
new file mode 100644
index 0000000..4bc42c1
Binary files /dev/null and b/ComponentProgramming/Forms/table.pdf differ