Добавил компонент для круговой диаграммы
This commit is contained in:
parent
976c74f4ac
commit
cbc470fe0f
36
WinFormSolution/Components/ComponentExcelWithPieDiagram.Designer.cs
generated
Normal file
36
WinFormSolution/Components/ComponentExcelWithPieDiagram.Designer.cs
generated
Normal file
@ -0,0 +1,36 @@
|
||||
namespace Components
|
||||
{
|
||||
partial class ComponentExcelWithPieDiagram
|
||||
{
|
||||
/// <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
|
||||
}
|
||||
}
|
129
WinFormSolution/Components/ComponentExcelWithPieDiagram.cs
Normal file
129
WinFormSolution/Components/ComponentExcelWithPieDiagram.cs
Normal file
@ -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<ChartData> 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user