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