lab 1+2(2 components)

This commit is contained in:
sardq 2024-10-04 11:08:55 +04:00
parent 0bae170098
commit f1591601e5
14 changed files with 714 additions and 51 deletions

View File

@ -1,2 +1 @@
# PIbd-21_RazubaevSM_PlumbingRepair_Base # PIbd-31_RazubaevSM_COP_10

View File

@ -28,6 +28,7 @@
/// </summary> /// </summary>
private void InitializeComponent() private void InitializeComponent()
{ {
this.components = new System.ComponentModel.Container();
this.dropDownList = new WinFormsLibrary.DropDownList(); this.dropDownList = new WinFormsLibrary.DropDownList();
this.buttonAdd = new System.Windows.Forms.Button(); this.buttonAdd = new System.Windows.Forms.Button();
this.buttonClear = new System.Windows.Forms.Button(); this.buttonClear = new System.Windows.Forms.Button();
@ -42,6 +43,13 @@
this.buttonAddValues = new System.Windows.Forms.Button(); this.buttonAddValues = new System.Windows.Forms.Button();
this.buttonShowItem = new System.Windows.Forms.Button(); this.buttonShowItem = new System.Windows.Forms.Button();
this.labelShowInput = new System.Windows.Forms.Label(); this.labelShowInput = new System.Windows.Forms.Label();
this.panel1 = new System.Windows.Forms.Panel();
this.buttonWordDiagram = new System.Windows.Forms.Button();
this.buttonWordTable = new System.Windows.Forms.Button();
this.buttonWordText = new System.Windows.Forms.Button();
this.wordTextComponent = new WinFormsLibrary.WordText(this.components);
this.wordTableComponent = new WinFormsLibrary.NonVisualComponents.WordTable(this.components);
this.panel1.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
// //
// dropDownList // dropDownList
@ -140,7 +148,7 @@
this.listBoxValues.Location = new System.Drawing.Point(437, 30); this.listBoxValues.Location = new System.Drawing.Point(437, 30);
this.listBoxValues.Name = "listBoxValues"; this.listBoxValues.Name = "listBoxValues";
this.listBoxValues.SelectedIndex = -1; this.listBoxValues.SelectedIndex = -1;
this.listBoxValues.Size = new System.Drawing.Size(594, 237); this.listBoxValues.Size = new System.Drawing.Size(895, 237);
this.listBoxValues.TabIndex = 10; this.listBoxValues.TabIndex = 10;
// //
// buttonAddValues // buttonAddValues
@ -172,11 +180,57 @@
this.labelShowInput.TabIndex = 13; this.labelShowInput.TabIndex = 13;
this.labelShowInput.Text = "Для проверки"; this.labelShowInput.Text = "Для проверки";
// //
// panel1
//
this.panel1.BackColor = System.Drawing.Color.White;
this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.panel1.Controls.Add(this.buttonWordDiagram);
this.panel1.Controls.Add(this.buttonWordTable);
this.panel1.Controls.Add(this.buttonWordText);
this.panel1.Location = new System.Drawing.Point(13, 404);
this.panel1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(1021, 165);
this.panel1.TabIndex = 14;
//
// buttonWordDiagram
//
this.buttonWordDiagram.Location = new System.Drawing.Point(753, 48);
this.buttonWordDiagram.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.buttonWordDiagram.Name = "buttonWordDiagram";
this.buttonWordDiagram.Size = new System.Drawing.Size(193, 57);
this.buttonWordDiagram.TabIndex = 15;
this.buttonWordDiagram.Text = "Word (диаграмма)";
this.buttonWordDiagram.UseVisualStyleBackColor = true;
//
// buttonWordTable
//
this.buttonWordTable.Location = new System.Drawing.Point(423, 48);
this.buttonWordTable.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.buttonWordTable.Name = "buttonWordTable";
this.buttonWordTable.Size = new System.Drawing.Size(193, 57);
this.buttonWordTable.TabIndex = 14;
this.buttonWordTable.Text = "Word (таблица)";
this.buttonWordTable.UseVisualStyleBackColor = true;
this.buttonWordTable.Click += new System.EventHandler(this.buttonWordTable_Click);
//
// buttonWordText
//
this.buttonWordText.Location = new System.Drawing.Point(67, 48);
this.buttonWordText.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.buttonWordText.Name = "buttonWordText";
this.buttonWordText.Size = new System.Drawing.Size(193, 57);
this.buttonWordText.TabIndex = 13;
this.buttonWordText.Text = "Word (текст)";
this.buttonWordText.UseVisualStyleBackColor = true;
this.buttonWordText.Click += new System.EventHandler(this.buttonWordText_Click);
//
// FormComponents // FormComponents
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 25F); this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 25F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1067, 450); this.ClientSize = new System.Drawing.Size(1344, 630);
this.Controls.Add(this.panel1);
this.Controls.Add(this.labelShowInput); this.Controls.Add(this.labelShowInput);
this.Controls.Add(this.buttonShowItem); this.Controls.Add(this.buttonShowItem);
this.Controls.Add(this.buttonAddValues); this.Controls.Add(this.buttonAddValues);
@ -193,6 +247,7 @@
this.Controls.Add(this.dropDownList); this.Controls.Add(this.dropDownList);
this.Name = "FormComponents"; this.Name = "FormComponents";
this.Text = "Form1"; this.Text = "Form1";
this.panel1.ResumeLayout(false);
this.ResumeLayout(false); this.ResumeLayout(false);
this.PerformLayout(); this.PerformLayout();
@ -214,5 +269,11 @@
private Button buttonAddValues; private Button buttonAddValues;
private Button buttonShowItem; private Button buttonShowItem;
private Label labelShowInput; private Label labelShowInput;
private Panel panel1;
private Button buttonWordDiagram;
private Button buttonWordTable;
private Button buttonWordText;
private WinFormsLibrary.WordText wordTextComponent;
private WinFormsLibrary.NonVisualComponents.WordTable wordTableComponent;
} }
} }

View File

@ -1,5 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using WinFormsLibrary; using WinFormsLibrary;
using WinFormsLibrary.NonVisualComponents.Helpers;
using WinFormsLibrary.Object; using WinFormsLibrary.Object;
namespace WinForms namespace WinForms
@ -11,18 +12,19 @@ namespace WinForms
public FormComponents() public FormComponents()
{ {
list = new List<string>(); list = new List<string>();
list.AddRange(new string[] { "привет", "пока", "бб" }); list.AddRange(new string[] { "Пример1", ример2", ример3" });
Client client1 = new Client("Сергей", "нет", "Идиот", 3); Client client1 = new Client("Разубаев Сергей Михайлович", "Товар понравился", "Пользователь", 300);
Client client2 = new Client("Давид", "да-11", "Гений", 1); Client client2 = new Client("Макаров Давид Вячеславович", "Вместо товара пришла коробка", "Подписчик", 100);
Client client3 = new Client("Руслан", "Асу", "Летальный", 4); Client client3 = new Client("Анисин Руслан Сергеевич", "Товар не понравился", "ПОльзователь", 234);
clients.Add(client1); clients.Add(client1);
clients.Add(client2); clients.Add(client2);
clients.Add(client3); clients.Add(client3);
InitializeComponent(); InitializeComponent();
dropDownList.LoadValues(new List<string>() { "чего", "забей", "пример" }); dropDownList.LoadValues(new List<string>() { "пример", "пример", "пример" });
emailTextBox.Pattern = @"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$"; emailTextBox.Pattern = @"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$";
listBoxValues.SetLayout("ФИО [FIO] Обзор [Review] Статус [Status] сумма [Sum]", "[", "]"); listBoxValues.SetLayout("ФИО [FIO] Обзор [Review] Статус [Status] сумма [Sum].", '[', ']');
dropDownList.ValueChanged += CustomEventHandler; dropDownList.ValueChanged += CustomEventHandler;
listBoxValues.AddItems<Client>(clients);
} }
private void CustomEventHandler(object sender, EventArgs e) private void CustomEventHandler(object sender, EventArgs e)
{ {
@ -75,7 +77,93 @@ namespace WinForms
private void buttonAddValues_Click(object sender, EventArgs e) private void buttonAddValues_Click(object sender, EventArgs e)
{ {
listBoxValues.AddInListBox<Client>(clients); listBoxValues.AddItems<Client>(clients);
}
private void buttonWordText_Click(object sender, EventArgs e)
{
using var dialog = new SaveFileDialog
{
Filter = "docx|*.docx"
};
if (dialog.ShowDialog() == DialogResult.OK)
{
try
{
wordTextComponent.CreateWordText(new LongWordInfo()
{
Path = dialog.FileName,
Title = "I. Глиняный ужас",
Paragraphs = new string[] { "По мне, неспособность человеческого разума соотнести между собою все, что только вмещает в себя наш мир, это великая милость. Мы живем на безмятежном островке неведения посреди черных морей бесконечности, и дальние плавания нам заказаны. Науки, трудясь каждая в своем направлении, до сих пор особого вреда нам не причиняли. Но в один прекрасный день разобщенные познания будут сведены воедино, и перед нами откроются такие ужасающие горизонты реальности, равно как и наше собственное страшное положение, что мы либо сойдем с ума от этого откровения, либо бежим от смертоносного света в мир и покой нового темного средневековья.",
"Теософы уже предугадали устрашающее величие космического цикла, в пределах которого и наш мир, и весь род человеческий не более чем преходящая случайность. Они намекают на странных пришельцев из тьмы веков в выражениях, от которых кровь бы застыла в жилах, когда бы не личина утешительного оптимизма. Но не от них явился тот один-единственный отблеск запретных эпох, что леденит мне кровь наяву и сводит с ума во сне. Это мимолетное впечатление, как и все страшные намеки на правду, родилось из случайной комбинации разрозненных фрагментов в данном случае, вырезки из старой газеты и записей покойного профессора. Надеюсь, никому больше не придет в голову их сопоставить; сам я, если останусь жив, ни за что не стану сознательно восполнять звенья в столь чудовищной цепи. Думается мне, что и профессор тоже намеревался сохранить в тайне известную ему часть и непременно уничтожил бы свои заметки, если бы не внезапная смерть.",
"Как наследнику и душеприказчику моего двоюродного деда ибо он умер бездетным вдовцом, мне полагалось сколь возможно тщательно просмотреть его архивы; с этой целью я перевез все его коробки и папки на свою бостонскую квартиру. Большую часть разобранных мною материалов со временем опубликует Американское археологическое общество, однако ж среди ящиков нашелся один, изрядно меня озадачивший: вот его-то мне особенно не хотелось показывать чужим. Ящик был заперт, ключа нигде не оказалось; но в конце концов я догадался осмотреть брелок, что профессор всегда носил в кармане. И действительно: открыть замок мне удалось, но тут передо мною воздвиглось препятствие еще более серьезное и непреодолимое. Что, ради всего святого, означали странный глиняный барельеф и разрозненные записи, наброски и газетные вырезки, мною обнаруженные? Или дед мой, на закате дней своих, стал жертвой самого банального надувательства? Я решил непременно разыскать эксцентричного скульптора, по всей видимости, нарушившего душевный покой старика."}
});
MessageBox.Show("Готово!");
}
catch (Exception ex)
{
MessageBox.Show("Произошла ошибка: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void buttonWordTable_Click(object sender, EventArgs e)
{
using var dialog = new SaveFileDialog
{
Filter = "docx|*.docx"
};
if (dialog.ShowDialog() == DialogResult.OK)
{
try
{
var columns = new List<ColumnInfo>
{
new() { FirstRowHeader = "Идент", PropertyName = "Id", Width = 1.3 },
new() { FirstRowHeader = "Статус", PropertyName = "Status", Width = 1.3 },
new() { FirstRowHeader = "Личные данные", SecondRowHeader = "Имя", PropertyName = "FirstName", Width = 1.7 },
new() { FirstRowHeader = "Личные данные", SecondRowHeader = "Фамилия", PropertyName = "LastName", Width = 1.7 },
new() { FirstRowHeader = "Личные данные", SecondRowHeader = "Возраст", PropertyName = "Age", Width = 1.7 },
new() { FirstRowHeader = "Дети", PropertyName = "Children", Width = 1.3 },
new() { FirstRowHeader = "Машина", PropertyName = "Car", Width = 1.7 },
new() { FirstRowHeader = "Работа", SecondRowHeader = "Подразделение", PropertyName = "Department", Width = 2.4 },
new() { FirstRowHeader = "Работа", SecondRowHeader = "Должность", PropertyName = "Position", Width = 2.4 },
new() { FirstRowHeader = "Премия", PropertyName = "Bonus", Width = 2 }
};
var employees = new List<Example>
{
new() { Id = 1, Status = "нет", FirstName = "Иван", LastName = "Иванов", Age = 34, Children = "нет", Car = "есть", Department = "Департамент 1", Position = "Инженер", Bonus = 2000.1 },
new() { Id = 2, Status = "нет", FirstName = "Петр", LastName = "Петров", Age = 44, Children = "есть", Car = "есть", Department = "Департамент 1", Position = "Инженер", Bonus = 2000.1 },
new() { Id = 3, Status = "да", FirstName = "Сергей", LastName = "Сергеев", Age = 55, Children = "нет", Car = "нет", Department = "Департамент 1", Position = "Руководитель", Bonus = 5000.5 },
new() { Id = 4, Status = "нет", FirstName = "Ольга", LastName = "Иванова", Age = 34, Children = "есть", Car = "нет", Department = "Бухгалтерия", Position = "Бухгалтер", Bonus = 2000.1 },
new() { Id = 5, Status = "да", FirstName = "Татьяна", LastName = "Петрова", Age = 44, Children = "нет", Car = "нет", Department = "Бухгалтерия", Position = "Старший бухгалтер", Bonus = 7000.6 }
};
var mergedColumns = new List<(int, int)>
{
(2, 4),
(7, 8)
};
var tableInfo = new WordTableInfo<Example>
{
Path = dialog.FileName,
Title = "Заголовок",
ColumnInfos = columns,
Items = employees,
MergedColumns = mergedColumns
};
wordTableComponent.CreateTable(tableInfo);
MessageBox.Show("Готово!");
}
catch (Exception ex)
{
MessageBox.Show("Произошла ошибка: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
} }
} }
} }

View File

@ -57,4 +57,10 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<metadata name="wordTextComponent.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="wordTableComponent.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>156, 17</value>
</metadata>
</root> </root>

View File

@ -1,4 +1,4 @@
using System.Text; using System.Reflection;
namespace WinFormsLibrary namespace WinFormsLibrary
@ -6,15 +6,15 @@ namespace WinFormsLibrary
public partial class ListBoxValues : UserControl public partial class ListBoxValues : UserControl
{ {
private string _layout; private string _layout;
private string _endSymbol; private char? _endSymbol;
private string _startSymbol; private char? _startSymbol;
public ListBoxValues() public ListBoxValues()
{ {
InitializeComponent(); InitializeComponent();
} }
public void SetLayout(string layout, string startSymbol, string endSymbol) public void SetLayout(string layout, char? startSymbol, char? endSymbol)
{ {
if (layout == null || startSymbol == null || endSymbol == null) if (layout == null)
{ {
return; return;
} }
@ -42,53 +42,117 @@ namespace WinFormsLibrary
} }
public T GetObjectFromStr<T>() where T : class, new() public T GetObjectFromStr<T>() where T : class, new()
{ {
string selectedString = ""; if (listBoxObjects.SelectedIndex == -1 || string.IsNullOrEmpty(_layout) || !_startSymbol.HasValue || !_endSymbol.HasValue)
if (listBoxObjects.SelectedIndex != -1) throw new ArgumentException("Не хватает данных");
var type = typeof(T);
var fields = type.GetFields();
var properties = type.GetProperties();
var members = fields.Cast<MemberInfo>().Concat(properties.Cast<MemberInfo>()).ToArray();
var curObject = new T();
string text = listBoxObjects.SelectedItem?.ToString() ?? "";
var words = System.Text.RegularExpressions.Regex.Split(_layout, $@"\{_startSymbol.Value}.*?\{_endSymbol.Value}");
int firstWordStart = text.IndexOf(words[0], 0);
if (firstWordStart == -1)
throw new Exception("Не найден элемент шаблона");
if (firstWordStart != 0)
{ {
selectedString = listBoxObjects.SelectedItem.ToString(); string beginning = text[..firstWordStart];
} FillMember(_layout.Substring(1, firstWordStart - 2), curObject, beginning, members);
T curObject = new T();
foreach (var pr in typeof(T).GetProperties())
{
if (!pr.CanWrite)
{
continue;
}
int borderOne = selectedString.IndexOf(_startSymbol);
StringBuilder sb = new StringBuilder(selectedString);
selectedString = sb.ToString();
int borderTwo = selectedString.IndexOf(_endSymbol);
if (borderOne == -1 || borderTwo == -1) break;
string propertyValue = selectedString.Substring(borderOne + 1, borderTwo - borderOne-1);
selectedString = selectedString.Substring(borderTwo + 1);
pr.SetValue(curObject, Convert.ChangeType(propertyValue, pr.PropertyType));
}
return curObject;
} }
public void AddInListBox<T>(List<T> values) int start = 0;
for (int i = 0; i < words.Length - 1; i++)
{ {
if (_layout == null || _startSymbol == null || _endSymbol == null) start = text.IndexOf(words[i], start);
{ if (start == -1)
MessageBox.Show("заполните информацию о макетной строке"); throw new Exception("Не найден элемент шаблона");
return; start += words[i].Length;
int nextWordIndex = text.IndexOf(words[i + 1], start);
if (nextWordIndex == -1)
throw new Exception("Не найден следующий элемент шаблона");
string valueBetween = text[start..nextWordIndex];
string layoutPart = _layout.Substring(_layout.IndexOf(words[i]) + words[i].Length);
int startCharIndex = layoutPart.IndexOf(_startSymbol.Value);
int endCharIndex = layoutPart.IndexOf(_endSymbol.Value);
string memberName = layoutPart.Substring(startCharIndex + 1, endCharIndex - startCharIndex - 1);
FillMember(memberName, curObject, valueBetween, members);
start = nextWordIndex;
} }
if (!_layout.Contains(_startSymbol) || !_layout.Contains(_endSymbol))
{ return (T?)curObject;
MessageBox.Show("Макетная строка не содержит нужные элементы");
return;
} }
foreach (var item in values)
public void AddItems<T>(List<T> items)
where T : class
{ {
string str = _layout; if (string.IsNullOrEmpty(_layout) || !_startSymbol.HasValue || !_endSymbol.HasValue)
foreach (var prop in item.GetType().GetProperties()) throw new ArgumentException("Не хватает данных");
listBoxObjects.Items.Clear();
var type = typeof(T);
var fields = type.GetFields();
var properties = type.GetProperties();
var members = fields.Cast<MemberInfo>().Concat(properties.Cast<MemberInfo>()).ToArray();
foreach (T item in items)
{ {
string str1 = $"{_startSymbol}" + $"{prop.Name}" + $"{_endSymbol}"; string result = _layout;
str = str.Replace(str1, $"{_startSymbol}" + prop.GetValue(item).ToString() + $"{_endSymbol}"); foreach (var member in members)
{
string search = _startSymbol.Value + member.Name +_endSymbol.Value;
object? value = null;
if (member is FieldInfo field)
{
value = field.GetValue(item);
} }
listBoxObjects.Items.Add(str); if (member is PropertyInfo property)
{
if (property.CanRead)
{
value = property.GetValue(item);
}
}
result = result.Replace(search, value?.ToString() ?? "");
}
listBoxObjects.Items.Add(result);
}
}
private void FillMember(string memberName, object curObject, string value, MemberInfo[]? members)
{
var member = members?.FirstOrDefault(x => x.Name == memberName)
?? throw new Exception("Ошибка с поиском элемента");
object convertedValue = Convert.ChangeType(value, GetMemberType(member));
SetMemberValue(curObject, member, convertedValue);
}
private Type GetMemberType(MemberInfo member)
{
return member is PropertyInfo property ? property.PropertyType : ((FieldInfo)member).FieldType;
}
private void SetMemberValue(object obj, MemberInfo member, object value)
{
if (member is PropertyInfo property)
{
property.SetValue(obj, value);
}
else if (member is FieldInfo field)
{
field.SetValue(obj, value);
} }
} }
} }
} }

View File

@ -0,0 +1,14 @@
namespace WinFormsLibrary.NonVisualComponents.Helpers
{
public class ColumnInfo
{
public string FirstRowHeader { get; set; } = string.Empty;
public string SecondRowHeader { get; set; } = string.Empty;
public string PropertyName { get; set; } = string.Empty;
public double Width { get; set; }
}
}

View File

@ -0,0 +1,11 @@
namespace WinFormsLibrary.NonVisualComponents.Helpers
{
public class LongWordInfo
{
public string Path { get; set; } = string.Empty;
public string Title { get; set; } = string.Empty;
public string[] Paragraphs { get; set; } = Array.Empty<string>();
}
}

View File

@ -0,0 +1,14 @@
namespace WinFormsLibrary.NonVisualComponents.Helpers
{
public class WordTableInfo<T>
{
public string Path { get; set; } = string.Empty;
public string Title { get; set; } = string.Empty;
public List<ColumnInfo> ColumnInfos { get; set; } = new();
public List<T> Items { get; set; } = new();
public List<(int, int)> MergedColumns { get; set; } = new();
}
}

View File

@ -0,0 +1,36 @@
namespace WinFormsLibrary.NonVisualComponents
{
partial class WordTable
{
/// <summary>
/// Обязательная переменная конструктора.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Освободить все используемые ресурсы.
/// </summary>
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Код, автоматически созданный конструктором компонентов
/// <summary>
/// Требуемый метод для поддержки конструктора — не изменяйте
/// содержимое этого метода с помощью редактора кода.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
}
}

View File

@ -0,0 +1,187 @@
using Word = Microsoft.Office.Interop.Word;
using WinFormsLibrary.NonVisualComponents.Helpers;
using System.ComponentModel;
namespace WinFormsLibrary.NonVisualComponents
{
public partial class WordTable : Component
{
public WordTable()
{
InitializeComponent();
}
public WordTable(IContainer container)
{
container.Add(this);
InitializeComponent();
}
public void CreateTable<T>(WordTableInfo<T> tableInfo)
{
ValidateInputData(tableInfo);
var wordApp = new Word.Application();
var document = wordApp.Documents.Add();
var range = document.Range();
var paragraph = range.Paragraphs.Add();
paragraph.Range.Text = tableInfo.Title;
paragraph.Range.Font.Name = "Times New Roman";
paragraph.Range.Font.Size = 20;
paragraph.Range.Font.Bold = 1;
paragraph.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;
paragraph.Range.ParagraphFormat.SpaceAfter = 8;
paragraph.Range.InsertParagraphAfter();
var table = document.Tables.Add(paragraph.Range, tableInfo.Items.Count + 2, tableInfo.ColumnInfos.Count);
table.Borders.Enable = 1;
table.Range.Font.Name = "Times New Roman";
table.Range.Font.Size = 11;
for (int i = 0; i < tableInfo.ColumnInfos.Count; i++)
{
table.Columns[i + 1].Width = (float)(tableInfo.ColumnInfos[i].Width * 28);
}
AddTableHeaderRow(table, tableInfo.ColumnInfos, true);
AddTableHeaderRow(table, tableInfo.ColumnInfos, false);
MergeColumns(table, tableInfo.MergedColumns);
AddTableData(table, tableInfo.Items, tableInfo.ColumnInfos);
document.SaveAs2(tableInfo.Path);
wordApp.Quit();
}
private void AddTableHeaderRow(Word.Table table, List<ColumnInfo> columnInfos, bool isFirstRow)
{
for (int i = 0; i < columnInfos.Count; i++)
{
var header = isFirstRow ? columnInfos[i].FirstRowHeader : columnInfos[i].SecondRowHeader;
if (!string.IsNullOrEmpty(header))
{
var cell = table.Cell(isFirstRow ? 1 : 2, i + 1);
cell.Range.Text = header;
cell.Range.Bold = 1;
cell.Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;
cell.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;
cell.Range.ParagraphFormat.SpaceBefore = 4;
cell.Range.ParagraphFormat.SpaceAfter = 4;
}
}
}
private void MergeColumns(Word.Table table, List<(int start, int end)> mergedColumns)
{
for (int i = 1; i <= table.Columns.Count; i++)
{
bool isMergedHorizontally = mergedColumns.Any(m => m.start <= i - 1 && m.end >= i - 1);
if (!isMergedHorizontally)
{
table.Cell(1, i).Merge(table.Cell(2, i));
}
}
int xOffset = 0;
foreach (var (start, end) in mergedColumns)
{
var cellStart = table.Cell(1, start + 1 - xOffset);
var cellEnd = table.Cell(1, end + 1 - xOffset);
string textToKeep = cellStart.Range.Text.TrimEnd('\r', '\a');
cellStart.Merge(cellEnd);
cellStart.Range.Text = textToKeep;
xOffset += end - start;
}
}
private void AddTableData<T>(Word.Table table, List<T> items, List<ColumnInfo> columnInfos)
{
for (int rowIndex = 0; rowIndex < items.Count; rowIndex++)
{
var item = items[rowIndex];
for (int colIndex = 0; colIndex < columnInfos.Count; colIndex++)
{
var property = typeof(T).GetProperty(columnInfos[colIndex].PropertyName);
var value = property?.GetValue(item)?.ToString() ?? string.Empty;
table.Cell(rowIndex + 3, colIndex + 1).Range.Text = value;
table.Cell(rowIndex + 3, colIndex + 1).Range.Bold = 0;
table.Cell(rowIndex + 3, colIndex + 1).Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;
table.Cell(rowIndex + 3, colIndex + 1).VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;
table.Cell(rowIndex + 3, colIndex + 1).Range.ParagraphFormat.SpaceBefore = 2;
table.Cell(rowIndex + 3, colIndex + 1).Range.ParagraphFormat.SpaceAfter = 2;
}
}
}
private void ValidateInputData<T>(WordTableInfo<T> wordTableInfo)
{
if (string.IsNullOrEmpty(wordTableInfo.Path) || (string.IsNullOrEmpty(wordTableInfo.Title)))
{
throw new ArgumentException("Не все данные заполнены");
}
CheckColumnInfo(wordTableInfo.ColumnInfos);
foreach (var column in wordTableInfo.ColumnInfos)
{
if (typeof(T).GetProperty(column.PropertyName) == null)
{
throw new ArgumentException($"Свойство '{column.PropertyName}' не найдено в классе {typeof(T).Name}.");
}
}
ValidateMergedColumns(wordTableInfo.MergedColumns, wordTableInfo.ColumnInfos.Count);
}
public void CheckColumnInfo(List<ColumnInfo> columns)
{
if ((columns == null) || (columns.Count == 0))
{
throw new ArgumentException("Нет информации о колонках");
}
foreach (var column in columns)
{
if (string.IsNullOrEmpty(column.FirstRowHeader) && string.IsNullOrEmpty(column.SecondRowHeader))
{
throw new ArgumentException("Заголовок не задан для одной из колонок в таблице");
}
if (column.Width <= 0)
{
throw new ArgumentException("Ширина колонки должна быть больше нуля.");
}
if (string.IsNullOrEmpty(column.PropertyName))
{
throw new ArgumentException("Свойство не задано для одной из колонок.");
}
}
}
private void ValidateMergedColumns(List<(int start, int end)> mergedColumns, int totalColumns)
{
if (mergedColumns == null || mergedColumns.Count == 0)
{
return;
}
foreach (var (start, end) in mergedColumns)
{
if (start < 0 || end >= totalColumns)
{
throw new ArgumentException("Индексы объединенных колонок вышли за пределы допустимых значений.");
}
var overlappingRanges = mergedColumns
.Where(m => m != (start, end))
.Any(m => m.start <= end && m.end >= start);
if (overlappingRanges)
{
throw new ArgumentException("Объединенные ячейки пересекаются.");
}
}
}
}
}

View File

@ -0,0 +1,36 @@
namespace WinFormsLibrary
{
partial class WordText
{
/// <summary>
/// Обязательная переменная конструктора.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Освободить все используемые ресурсы.
/// </summary>
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Код, автоматически созданный конструктором компонентов
/// <summary>
/// Требуемый метод для поддержки конструктора — не изменяйте
/// содержимое этого метода с помощью редактора кода.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
}
}

View File

@ -0,0 +1,80 @@
using Microsoft.Office.Interop.Word;
using System.ComponentModel;
using WinFormsLibrary.NonVisualComponents.Helpers;
using Application = Microsoft.Office.Interop.Word.Application;
namespace WinFormsLibrary
{
public partial class WordText : Component
{
private Application? _wordApp;
private Document? _document;
public WordText()
{
InitializeComponent();
}
public WordText(IContainer container)
{
container.Add(this);
InitializeComponent();
}
public void CreateWordText(LongWordInfo textInfo)
{
if ((string.IsNullOrEmpty(textInfo.Path)) || (string.IsNullOrEmpty(textInfo.Title) || !CheckData(textInfo.Paragraphs)))
{
throw new ArgumentException("Не все данные заполнены");
}
_wordApp = new Application();
_document = _wordApp.Documents.Add();
try
{
AddText(textInfo);
_document.SaveAs2(textInfo.Path);
}
finally
{
_document.Close();
_wordApp.Quit();
}
}
private void AddText(LongWordInfo textInfo)
{
if (_document == null)
{
return;
}
AddParagraph(textInfo.Title, fontSize: 20, isBold: true);
foreach(var paragraph in textInfo.Paragraphs)
{
AddParagraph(paragraph, fontSize: 14, isBold: false);
}
}
private void AddParagraph(string text, int fontSize, bool isBold)
{
if (_document== null)
{
return;
}
var paragraph = _document.Content.Paragraphs.Add();
var range = paragraph.Range;
range.Text = text;
range.Font.Size = fontSize;
range.Font.Name = "Times New Roman";
range.Font.Bold = isBold ? 1 : 0;
paragraph.Alignment = WdParagraphAlignment.wdAlignParagraphJustify;
range.InsertParagraphAfter();
}
public bool CheckData(string[] data)
{
return data != null && data.Any() && data.All(dt => !String.IsNullOrEmpty(dt));
}
}
}

View File

@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WinFormsLibrary.Object
{
public class Example
{
public int Id { get; set; }
public string Status { get; set; } = string.Empty;
public string FirstName { get; set; } = string.Empty;
public string LastName { get; set; } = string.Empty;
public int Age { get; set; }
public string Children { get; set; } = string.Empty;
public string Car { get; set; } = string.Empty;
public string Department { get; set; } = string.Empty;
public string Position { get; set; } = string.Empty;
public double Bonus { get; set; }
}
}

View File

@ -7,4 +7,38 @@
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<COMReference Include="Microsoft.Office.Core">
<WrapperTool>tlbimp</WrapperTool>
<VersionMinor>8</VersionMinor>
<VersionMajor>2</VersionMajor>
<Guid>2df8d04c-5bfa-101b-bde5-00aa0044de52</Guid>
<Lcid>0</Lcid>
<Isolated>false</Isolated>
<EmbedInteropTypes>true</EmbedInteropTypes>
</COMReference>
<COMReference Include="Microsoft.Office.Interop.Excel">
<WrapperTool>tlbimp</WrapperTool>
<VersionMinor>9</VersionMinor>
<VersionMajor>1</VersionMajor>
<Guid>00020813-0000-0000-c000-000000000046</Guid>
<Lcid>0</Lcid>
<Isolated>false</Isolated>
<EmbedInteropTypes>true</EmbedInteropTypes>
</COMReference>
<COMReference Include="Microsoft.Office.Interop.Word">
<WrapperTool>tlbimp</WrapperTool>
<VersionMinor>7</VersionMinor>
<VersionMajor>8</VersionMajor>
<Guid>00020905-0000-0000-c000-000000000046</Guid>
<Lcid>0</Lcid>
<Isolated>false</Isolated>
<EmbedInteropTypes>true</EmbedInteropTypes>
</COMReference>
</ItemGroup>
<ItemGroup>
<Folder Include="NonVisualComponents\Enums\" />
</ItemGroup>
</Project> </Project>