diff --git a/WinFormSolution/Components/ComponentExcelWithPieDiagram.Designer.cs b/WinFormSolution/Components/ComponentExcelWithPieDiagram.Designer.cs
new file mode 100644
index 0000000..920fc9b
--- /dev/null
+++ b/WinFormSolution/Components/ComponentExcelWithPieDiagram.Designer.cs
@@ -0,0 +1,36 @@
+namespace Components
+{
+ partial class ComponentExcelWithPieDiagram
+ {
+ ///
+ /// Обязательная переменная конструктора.
+ ///
+ 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/WinFormSolution/Components/ComponentExcelWithPieDiagram.cs b/WinFormSolution/Components/ComponentExcelWithPieDiagram.cs
new file mode 100644
index 0000000..a423567
--- /dev/null
+++ b/WinFormSolution/Components/ComponentExcelWithPieDiagram.cs
@@ -0,0 +1,129 @@
+using System.ComponentModel;
+using Excel = Microsoft.Office.Interop.Excel;
+
+namespace Components
+{
+ public partial class ComponentExcelWithPieDiagram : Component
+ {
+ public ComponentExcelWithPieDiagram()
+ {
+ InitializeComponent();
+ }
+
+ public ComponentExcelWithPieDiagram(IContainer container) : this()
+ {
+ container.Add(this);
+ }
+
+ // Перечисление для расположения легенды
+ public enum LegendPosition
+ {
+ Top,
+ Bottom,
+ Left,
+ Right
+ }
+
+ // Класс для хранения данных серии
+ public class ChartData
+ {
+ public string SeriesName { get; set; }
+ public double SeriesValue { get; set; }
+ }
+
+ public void CreateExcelWithPieChart(
+ string filePath,
+ string fileTitle,
+ string chartTitle,
+ LegendPosition legendPosition,
+ List data)
+ {
+ Excel.Application excelApp = new Excel.Application();
+ Excel.Workbook workbook = excelApp.Workbooks.Add();
+ Excel.Worksheet worksheet = workbook.Sheets[1];
+
+ // Устанавливаем заголовок файла
+ worksheet.Cells[1, 1] = fileTitle;
+
+ // Вставляем данные в таблицу для построения диаграммы
+ int dataStartRow = 3; // Начальная строка для данных
+ for (int i = 0; i < data.Count; i++)
+ {
+ worksheet.Cells[dataStartRow + i, 1] = data[i].SeriesName;
+ worksheet.Cells[dataStartRow + i, 2] = data[i].SeriesValue;
+ }
+
+ // Создание круговой диаграммы
+ Excel.ChartObjects chartObjects = (Excel.ChartObjects)worksheet.ChartObjects();
+ Excel.ChartObject chartObject = chartObjects.Add(300, 50, 400, 300); // Размер и позиция диаграммы
+ Excel.Chart chart = chartObject.Chart;
+
+ // Устанавливаем тип диаграммы "Круговая"
+ chart.ChartType = Excel.XlChartType.xlPie;
+
+ // Устанавливаем диапазон данных для диаграммы
+ Excel.Range chartRange = worksheet.get_Range("A3", $"B{dataStartRow + data.Count - 1}");
+ chart.SetSourceData(chartRange);
+
+ // Устанавливаем заголовок диаграммы
+ chart.HasTitle = true;
+ chart.ChartTitle.Text = chartTitle;
+
+ // Устанавливаем расположение легенды
+ SetLegendPosition(chart, legendPosition);
+
+ // Сохраняем файл
+ workbook.SaveAs(filePath);
+ workbook.Close();
+ excelApp.Quit();
+
+ ReleaseObject(worksheet);
+ ReleaseObject(workbook);
+ ReleaseObject(excelApp);
+ }
+
+ // Метод для установки позиции легенды на диаграмме
+ private void SetLegendPosition(Excel.Chart chart, LegendPosition legendPosition)
+ {
+ chart.HasLegend = true;
+
+ switch (legendPosition)
+ {
+ case LegendPosition.Top:
+ chart.Legend.Position = Excel.XlLegendPosition.xlLegendPositionTop;
+ break;
+ case LegendPosition.Bottom:
+ chart.Legend.Position = Excel.XlLegendPosition.xlLegendPositionBottom;
+ break;
+ case LegendPosition.Left:
+ chart.Legend.Position = Excel.XlLegendPosition.xlLegendPositionLeft;
+ break;
+ case LegendPosition.Right:
+ chart.Legend.Position = Excel.XlLegendPosition.xlLegendPositionRight;
+ break;
+ }
+ }
+
+ // Освобождение объектов
+ private void ReleaseObject(object obj)
+ {
+ try
+ {
+ if (obj != null)
+ {
+ System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
+ obj = null;
+ }
+ }
+ catch (Exception ex)
+ {
+ obj = null;
+ Console.WriteLine("Error releasing object: " + ex.ToString());
+ }
+ finally
+ {
+ GC.Collect();
+ }
+ }
+ }
+}