Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
52ad12538d | ||
|
f1591601e5 |
@ -1,2 +1 @@
|
||||
# PIbd-21_RazubaevSM_PlumbingRepair_Base
|
||||
|
||||
# PIbd-31_RazubaevSM_COP_10
|
@ -3,9 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.4.33110.190
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WinFormsLibrary", "WinFormsLibrary\WinFormsLibrary.csproj", "{FA2C000C-0815-44C4-BBA7-FB37C33DE121}"
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WinFormsLibraryRazubaev", "WinFormsLibrary\WinFormsLibraryRazubaev.csproj", "{FA2C000C-0815-44C4-BBA7-FB37C33DE121}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WinForms", "WinForms\WinForms.csproj", "{AA566691-FB51-4E4C-BB7B-9BA77AD20FD1}"
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WinForms", "WinForms\WinForms.csproj", "{AA566691-FB51-4E4C-BB7B-9BA77AD20FD1}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
|
68
WinForms/FormComponents.Designer.cs
generated
68
WinForms/FormComponents.Designer.cs
generated
@ -28,6 +28,7 @@
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.components = new System.ComponentModel.Container();
|
||||
this.dropDownList = new WinFormsLibrary.DropDownList();
|
||||
this.buttonAdd = new System.Windows.Forms.Button();
|
||||
this.buttonClear = new System.Windows.Forms.Button();
|
||||
@ -42,6 +43,14 @@
|
||||
this.buttonAddValues = new System.Windows.Forms.Button();
|
||||
this.buttonShowItem = new System.Windows.Forms.Button();
|
||||
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.wordDiagramComponent = new WinFormsLibrary.NonVisualComponents.WordDiagram(this.components);
|
||||
this.panel1.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// dropDownList
|
||||
@ -140,7 +149,7 @@
|
||||
this.listBoxValues.Location = new System.Drawing.Point(437, 30);
|
||||
this.listBoxValues.Name = "listBoxValues";
|
||||
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;
|
||||
//
|
||||
// buttonAddValues
|
||||
@ -172,11 +181,58 @@
|
||||
this.labelShowInput.TabIndex = 13;
|
||||
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;
|
||||
this.buttonWordDiagram.Click += new System.EventHandler(this.buttonWordDiagram_Click);
|
||||
//
|
||||
// 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
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 25F);
|
||||
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.buttonShowItem);
|
||||
this.Controls.Add(this.buttonAddValues);
|
||||
@ -193,6 +249,7 @@
|
||||
this.Controls.Add(this.dropDownList);
|
||||
this.Name = "FormComponents";
|
||||
this.Text = "Form1";
|
||||
this.panel1.ResumeLayout(false);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
@ -214,5 +271,12 @@
|
||||
private Button buttonAddValues;
|
||||
private Button buttonShowItem;
|
||||
private Label labelShowInput;
|
||||
private Panel panel1;
|
||||
private Button buttonWordDiagram;
|
||||
private Button buttonWordTable;
|
||||
private Button buttonWordText;
|
||||
private WinFormsLibrary.WordText wordTextComponent;
|
||||
private WinFormsLibrary.NonVisualComponents.WordTable wordTableComponent;
|
||||
private WinFormsLibrary.NonVisualComponents.WordDiagram wordDiagramComponent;
|
||||
}
|
||||
}
|
@ -1,5 +1,7 @@
|
||||
using System.Collections.Generic;
|
||||
using WinFormsLibrary;
|
||||
using WinFormsLibrary.NonVisualComponents.Enums;
|
||||
using WinFormsLibrary.NonVisualComponents.Helpers;
|
||||
using WinFormsLibrary.Object;
|
||||
|
||||
namespace WinForms
|
||||
@ -11,18 +13,19 @@ namespace WinForms
|
||||
public FormComponents()
|
||||
{
|
||||
list = new List<string>();
|
||||
list.AddRange(new string[] { "привет", "пока", "бб" });
|
||||
Client client1 = new Client("Сергей", "нет", "Идиот", 3);
|
||||
Client client2 = new Client("Давид", "да-11", "Гений", 1);
|
||||
Client client3 = new Client("Руслан", "Асу", "Летальный", 4);
|
||||
list.AddRange(new string[] { "Пример1", "Пример2", "Пример3" });
|
||||
Client client1 = new Client("Разубаев Сергей Михайлович", "Товар понравился", "Пользователь", 300);
|
||||
Client client2 = new Client("Макаров Давид Вячеславович", "Вместо товара пришла коробка", "Подписчик", 100);
|
||||
Client client3 = new Client("Анисин Руслан Сергеевич", "Товар не понравился", "ПОльзователь", 234);
|
||||
clients.Add(client1);
|
||||
clients.Add(client2);
|
||||
clients.Add(client3);
|
||||
InitializeComponent();
|
||||
dropDownList.LoadValues(new List<string>() { "чего", "забей", "пример" });
|
||||
dropDownList.LoadValues(new List<string>() { "пример", "пример", "пример" });
|
||||
emailTextBox.Pattern = @"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$";
|
||||
listBoxValues.SetLayout("ФИО [FIO] Обзор [Review] Статус [Status] сумма [Sum]", "[", "]");
|
||||
listBoxValues.SetLayout("ФИО [FIO] Обзор [Review] Статус [Status] сумма [Sum].", '[', ']');
|
||||
dropDownList.ValueChanged += CustomEventHandler;
|
||||
listBoxValues.AddItems<Client>(clients);
|
||||
}
|
||||
private void CustomEventHandler(object sender, EventArgs e)
|
||||
{
|
||||
@ -75,7 +78,142 @@ namespace WinForms
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void buttonWordDiagram_Click(object sender, EventArgs e)
|
||||
{
|
||||
using var dialog = new SaveFileDialog
|
||||
{
|
||||
Filter = "docx|*.docx"
|
||||
};
|
||||
if (dialog.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
try
|
||||
{
|
||||
var series = new List<SeriesParameters>
|
||||
{
|
||||
new() {
|
||||
SeriesName = "Номер 1",
|
||||
ValuesY = new List<double> { 14, 22, 13 },
|
||||
Color = Color.FromArgb(255, 165, 0)
|
||||
},
|
||||
new() {
|
||||
SeriesName = "Номер 2",
|
||||
ValuesY = new List<double> { 87, 44, 51 },
|
||||
Color = Color.FromArgb(145, 145, 145)
|
||||
},
|
||||
new() {
|
||||
SeriesName = "Номер 3",
|
||||
ValuesY = new List<double> { 29, 15, 7 },
|
||||
Color = Color.FromArgb(255, 255, 0)
|
||||
}
|
||||
};
|
||||
|
||||
wordDiagramComponent.CreateDiagramDocument(new GraphicWordInfo()
|
||||
{
|
||||
Path = dialog.FileName,
|
||||
DocumentTitle = "Диаграмма в ворде",
|
||||
DiagramTitle = "Ниже показана диаграмма об исследовании...",
|
||||
LegendLayout = LegendLayoutEnum.Bottom,
|
||||
SeriesX = new List<string> { "Пример", "Пример", "Пример" },
|
||||
SeriesParameters = series
|
||||
});
|
||||
|
||||
MessageBox.Show("Готово!");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show("Произошла ошибка: " + ex.Message, "А", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -57,4 +57,13 @@
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</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>
|
||||
<metadata name="wordDiagramComponent.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>392, 17</value>
|
||||
</metadata>
|
||||
</root>
|
@ -9,7 +9,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\WinFormsLibrary\WinFormsLibrary.csproj" />
|
||||
<ProjectReference Include="..\WinFormsLibrary\WinFormsLibraryRazubaev.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
@ -1,94 +0,0 @@
|
||||
using System.Text;
|
||||
|
||||
|
||||
namespace WinFormsLibrary
|
||||
{
|
||||
public partial class ListBoxValues : UserControl
|
||||
{
|
||||
private string _layout;
|
||||
private string _endSymbol;
|
||||
private string _startSymbol;
|
||||
public ListBoxValues()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
public void SetLayout(string layout, string startSymbol, string endSymbol)
|
||||
{
|
||||
if (layout == null || startSymbol == null || endSymbol == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
_layout = layout;
|
||||
_endSymbol = endSymbol;
|
||||
_startSymbol = startSymbol;
|
||||
}
|
||||
public int SelectedIndex
|
||||
{
|
||||
get
|
||||
{
|
||||
if (listBoxObjects.SelectedIndex == -1)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
return listBoxObjects.SelectedIndex;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (listBoxObjects.SelectedItems.Count != 0)
|
||||
{
|
||||
listBoxObjects.SelectedIndex = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
public T GetObjectFromStr<T>() where T : class, new()
|
||||
{
|
||||
string selectedString = "";
|
||||
if (listBoxObjects.SelectedIndex != -1)
|
||||
{
|
||||
selectedString = listBoxObjects.SelectedItem.ToString();
|
||||
}
|
||||
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)
|
||||
{
|
||||
if (_layout == null || _startSymbol == null || _endSymbol == null)
|
||||
{
|
||||
MessageBox.Show("заполните информацию о макетной строке");
|
||||
return;
|
||||
}
|
||||
if (!_layout.Contains(_startSymbol) || !_layout.Contains(_endSymbol))
|
||||
{
|
||||
MessageBox.Show("Макетная строка не содержит нужные элементы");
|
||||
return;
|
||||
}
|
||||
foreach (var item in values)
|
||||
{
|
||||
string str = _layout;
|
||||
foreach (var prop in item.GetType().GetProperties())
|
||||
{
|
||||
string str1 = $"{_startSymbol}" + $"{prop.Name}" + $"{_endSymbol}";
|
||||
str = str.Replace(str1, $"{_startSymbol}" + prop.GetValue(item).ToString() + $"{_endSymbol}");
|
||||
}
|
||||
listBoxObjects.Items.Add(str);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
namespace WinFormsLibrary.NonVisualComponents.Enums
|
||||
{
|
||||
public enum LegendLayoutEnum
|
||||
{
|
||||
None,
|
||||
|
||||
Left,
|
||||
|
||||
Top,
|
||||
|
||||
Right,
|
||||
|
||||
Bottom
|
||||
|
||||
}
|
||||
}
|
14
WinFormsLibrary/NonVisualComponents/Helpers/ColumnInfo.cs
Normal file
14
WinFormsLibrary/NonVisualComponents/Helpers/ColumnInfo.cs
Normal 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; }
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
using WinFormsLibrary.NonVisualComponents.Enums;
|
||||
|
||||
namespace WinFormsLibrary.NonVisualComponents.Helpers
|
||||
{
|
||||
public class GraphicWordInfo
|
||||
{
|
||||
public string Path { get; set; } = string.Empty;
|
||||
|
||||
public string DocumentTitle { get; set; } = string.Empty;
|
||||
public string DiagramTitle { get; set; } = string.Empty;
|
||||
public LegendLayoutEnum LegendLayout { get; set; }
|
||||
public List<string> SeriesX { get; set; }
|
||||
public List<SeriesParameters> SeriesParameters { get; set; } = new();
|
||||
|
||||
}
|
||||
}
|
11
WinFormsLibrary/NonVisualComponents/Helpers/LongWordInfo.cs
Normal file
11
WinFormsLibrary/NonVisualComponents/Helpers/LongWordInfo.cs
Normal 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>();
|
||||
}
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
namespace WinFormsLibrary.NonVisualComponents.Helpers
|
||||
{
|
||||
public class SeriesParameters
|
||||
{
|
||||
public string SeriesName { get; set; } = string.Empty;
|
||||
|
||||
public List<double> ValuesY { get; set; } = new();
|
||||
|
||||
public Color Color { get; set; }
|
||||
|
||||
}
|
||||
}
|
14
WinFormsLibrary/NonVisualComponents/Helpers/WordTableInfo.cs
Normal file
14
WinFormsLibrary/NonVisualComponents/Helpers/WordTableInfo.cs
Normal 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();
|
||||
|
||||
}
|
||||
}
|
36
WinFormsLibrary/NonVisualComponents/WordDiagram.Designer.cs
generated
Normal file
36
WinFormsLibrary/NonVisualComponents/WordDiagram.Designer.cs
generated
Normal file
@ -0,0 +1,36 @@
|
||||
namespace WinFormsLibrary.NonVisualComponents
|
||||
{
|
||||
partial class WordDiagram
|
||||
{
|
||||
/// <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
|
||||
}
|
||||
}
|
123
WinFormsLibrary/NonVisualComponents/WordDiagram.cs
Normal file
123
WinFormsLibrary/NonVisualComponents/WordDiagram.cs
Normal file
@ -0,0 +1,123 @@
|
||||
using System.ComponentModel;
|
||||
using Word = Microsoft.Office.Interop.Word;
|
||||
using Excel = Microsoft.Office.Interop.Excel;
|
||||
using WinFormsLibrary.NonVisualComponents.Helpers;
|
||||
using WinFormsLibrary.NonVisualComponents.Enums;
|
||||
|
||||
namespace WinFormsLibrary.NonVisualComponents
|
||||
{
|
||||
public partial class WordDiagram : Component
|
||||
{
|
||||
public WordDiagram()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
public WordDiagram(IContainer container)
|
||||
{
|
||||
container.Add(this);
|
||||
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
public void CreateDiagramDocument(GraphicWordInfo diagramInfo)
|
||||
{
|
||||
ValidateDiagramInfo(diagramInfo);
|
||||
|
||||
var wordApp = new Word.Application();
|
||||
var document = wordApp.Documents.Add();
|
||||
|
||||
var paragraph = document.Paragraphs.Add();
|
||||
paragraph.Range.Text = diagramInfo.DocumentTitle;
|
||||
paragraph.Range.Font.Size = 24;
|
||||
paragraph.Range.Font.Bold = 1;
|
||||
paragraph.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;
|
||||
paragraph.Range.InsertParagraphAfter();
|
||||
|
||||
AddChart(document, diagramInfo);
|
||||
|
||||
document.SaveAs2(diagramInfo.Path);
|
||||
wordApp.Quit();
|
||||
}
|
||||
private void AddChart(Word.Document document, GraphicWordInfo diagramInfo)
|
||||
{
|
||||
var paragraph = document.Paragraphs.Add();
|
||||
var chartShape = document.InlineShapes.AddChart2(-1, (Microsoft.Office.Core.XlChartType)Excel.XlChartType.xlLine, paragraph.Range);
|
||||
var chart = chartShape.Chart;
|
||||
|
||||
chart.HasTitle = true;
|
||||
chart.ChartTitle.Text = diagramInfo.DiagramTitle;
|
||||
|
||||
var chartSeriesCollection = chart.SeriesCollection();
|
||||
for (int i = chartSeriesCollection.Count; i >= 1; i--)
|
||||
{
|
||||
chartSeriesCollection.Item(i).Delete();
|
||||
}
|
||||
|
||||
var seriesX = diagramInfo.SeriesX.ToArray();
|
||||
|
||||
for (int i = 0; i < diagramInfo.SeriesParameters.Count; i++)
|
||||
{
|
||||
var seriesInfo = diagramInfo.SeriesParameters[i];
|
||||
var series = chartSeriesCollection.NewSeries();
|
||||
|
||||
series.Name = seriesInfo.SeriesName;
|
||||
series.Values = seriesInfo.ValuesY.ToArray();
|
||||
series.XValues = seriesX;
|
||||
|
||||
SetSeriesColor(series, seriesInfo.Color);
|
||||
|
||||
series.MarkerStyle = Excel.XlMarkerStyle.xlMarkerStyleCircle;
|
||||
series.MarkerSize = 5;
|
||||
}
|
||||
|
||||
chart.HasLegend = true;
|
||||
chart.Legend.Position = diagramInfo.LegendLayout switch
|
||||
{
|
||||
LegendLayoutEnum.Left => Word.XlLegendPosition.xlLegendPositionLeft,
|
||||
LegendLayoutEnum.Top => Word.XlLegendPosition.xlLegendPositionTop,
|
||||
LegendLayoutEnum.Right => Word.XlLegendPosition.xlLegendPositionRight,
|
||||
LegendLayoutEnum.Bottom => Word.XlLegendPosition.xlLegendPositionBottom,
|
||||
_ => Word.XlLegendPosition.xlLegendPositionBottom,
|
||||
};
|
||||
|
||||
chart.ChartData.Workbook.Application.Quit();
|
||||
}
|
||||
|
||||
private void SetSeriesColor(dynamic series, Color color)
|
||||
{
|
||||
series.Format.Line.ForeColor.RGB = ColorTranslator.ToOle(color);
|
||||
series.Format.Fill.ForeColor.RGB = ColorTranslator.ToOle(color);
|
||||
}
|
||||
|
||||
private void ValidateDiagramInfo(GraphicWordInfo diagramInfo)
|
||||
{
|
||||
if (string.IsNullOrEmpty(diagramInfo.Path) || string.IsNullOrEmpty(diagramInfo.DocumentTitle) ||
|
||||
string.IsNullOrEmpty(diagramInfo.DiagramTitle) || diagramInfo.SeriesX == null ||
|
||||
diagramInfo.SeriesX.Count == 0 || diagramInfo.SeriesParameters == null ||
|
||||
diagramInfo.SeriesParameters.Count == 0)
|
||||
{
|
||||
throw new ArgumentException("Не все данные для диаграммы заполнены");
|
||||
}
|
||||
|
||||
foreach (var series in diagramInfo.SeriesParameters)
|
||||
{
|
||||
if (string.IsNullOrEmpty(series.SeriesName))
|
||||
{
|
||||
throw new ArgumentException("Название серии не может быть пустым");
|
||||
}
|
||||
|
||||
if (series.ValuesY == null || series.ValuesY.Count == 0)
|
||||
{
|
||||
throw new ArgumentException($"Список значений оси Y для серии '{series.SeriesName}' не заполнен");
|
||||
}
|
||||
|
||||
if (diagramInfo.SeriesX.Count != series.ValuesY.Count)
|
||||
{
|
||||
throw new ArgumentException($"Количество данных оси X и значений оси Y для серии '{series.SeriesName}' не совпадает");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
36
WinFormsLibrary/NonVisualComponents/WordTable.Designer.cs
generated
Normal file
36
WinFormsLibrary/NonVisualComponents/WordTable.Designer.cs
generated
Normal 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
|
||||
}
|
||||
}
|
187
WinFormsLibrary/NonVisualComponents/WordTable.cs
Normal file
187
WinFormsLibrary/NonVisualComponents/WordTable.cs
Normal 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("Объединенные ячейки пересекаются.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
36
WinFormsLibrary/NonVisualComponents/WordText.Designer.cs
generated
Normal file
36
WinFormsLibrary/NonVisualComponents/WordText.Designer.cs
generated
Normal 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
|
||||
}
|
||||
}
|
80
WinFormsLibrary/NonVisualComponents/WordText.cs
Normal file
80
WinFormsLibrary/NonVisualComponents/WordText.cs
Normal 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));
|
||||
}
|
||||
}
|
||||
}
|
33
WinFormsLibrary/Object/Example.cs
Normal file
33
WinFormsLibrary/Object/Example.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
|
||||
|
158
WinFormsLibrary/VisualComponent/ListBoxValues.cs
Normal file
158
WinFormsLibrary/VisualComponent/ListBoxValues.cs
Normal file
@ -0,0 +1,158 @@
|
||||
using System.Reflection;
|
||||
|
||||
|
||||
namespace WinFormsLibrary
|
||||
{
|
||||
public partial class ListBoxValues : UserControl
|
||||
{
|
||||
private string _layout;
|
||||
private char? _endSymbol;
|
||||
private char? _startSymbol;
|
||||
public ListBoxValues()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
public void SetLayout(string layout, char? startSymbol, char? endSymbol)
|
||||
{
|
||||
if (layout == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
_layout = layout;
|
||||
_endSymbol = endSymbol;
|
||||
_startSymbol = startSymbol;
|
||||
}
|
||||
public int SelectedIndex
|
||||
{
|
||||
get
|
||||
{
|
||||
if (listBoxObjects.SelectedIndex == -1)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
return listBoxObjects.SelectedIndex;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (listBoxObjects.SelectedItems.Count != 0)
|
||||
{
|
||||
listBoxObjects.SelectedIndex = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
public T GetObjectFromStr<T>() where T : class, new()
|
||||
{
|
||||
if (listBoxObjects.SelectedIndex == -1 || string.IsNullOrEmpty(_layout) || !_startSymbol.HasValue || !_endSymbol.HasValue)
|
||||
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)
|
||||
{
|
||||
string beginning = text[..firstWordStart];
|
||||
FillMember(_layout.Substring(1, firstWordStart - 2), curObject, beginning, members);
|
||||
}
|
||||
|
||||
int start = 0;
|
||||
|
||||
for (int i = 0; i < words.Length - 1; i++)
|
||||
{
|
||||
start = text.IndexOf(words[i], start);
|
||||
if (start == -1)
|
||||
throw new Exception("Не найден элемент шаблона");
|
||||
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;
|
||||
}
|
||||
|
||||
return (T?)curObject;
|
||||
|
||||
}
|
||||
|
||||
public void AddItems<T>(List<T> items)
|
||||
where T : class
|
||||
{
|
||||
if (string.IsNullOrEmpty(_layout) || !_startSymbol.HasValue || !_endSymbol.HasValue)
|
||||
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 result = _layout;
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,10 +0,0 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0-windows</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<UseWindowsForms>true</UseWindowsForms>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
40
WinFormsLibrary/WinFormsLibraryRazubaev.csproj
Normal file
40
WinFormsLibrary/WinFormsLibraryRazubaev.csproj
Normal file
@ -0,0 +1,40 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0-windows</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<UseWindowsForms>true</UseWindowsForms>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
</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>
|
||||
|
||||
</Project>
|
Loading…
Reference in New Issue
Block a user