надеюсь пойдет, но мне кажется что нет...

This commit is contained in:
Алексей Тихоненков 2024-10-02 19:15:15 +04:00
parent acba0a072a
commit 580a08d48f
3 changed files with 45 additions and 13 deletions

View File

@ -9,6 +9,8 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using OxyPlot.WindowsForms; using OxyPlot.WindowsForms;
using OxyPlot.Legends;
using OxyPlot.Annotations;
namespace FormLibrary namespace FormLibrary
{ {
@ -25,9 +27,9 @@ namespace FormLibrary
InitializeComponent(); InitializeComponent();
} }
public void CreateHistogramPdf(string filePath, string documentTitle, string chartTitle, LegendPosition legendPosition, List<ChartData> chartData) public void CreateHistogramPdf(string filePath, string documentTitle, string chartTitle, LegendPositions legendPosition, List<ChartData> chartData)
{ {
// Проверка на заполненность входных данных // Проверка входных данных...
if (string.IsNullOrEmpty(filePath)) if (string.IsNullOrEmpty(filePath))
throw new ArgumentException("Путь к файлу не может быть пустым."); throw new ArgumentException("Путь к файлу не может быть пустым.");
if (string.IsNullOrEmpty(documentTitle)) if (string.IsNullOrEmpty(documentTitle))
@ -43,8 +45,9 @@ namespace FormLibrary
throw new ArgumentException($"Набор данных для серии '{data.SeriesName}' некорректен."); throw new ArgumentException($"Набор данных для серии '{data.SeriesName}' некорректен.");
} }
// Создание графика // создание графика
var plotModel = new PlotModel { Title = chartTitle }; var plotModel = new PlotModel { Title = chartTitle };
foreach (var data in chartData) foreach (var data in chartData)
{ {
var barSeries = new BarSeries { Title = data.SeriesName }; var barSeries = new BarSeries { Title = data.SeriesName };
@ -55,15 +58,18 @@ namespace FormLibrary
plotModel.Series.Add(barSeries); plotModel.Series.Add(barSeries);
} }
// Сохранение графика в изображение // Добавление легенды
var pngExporter = new PngExporter { Width = 600, Height = 400}; AddLegend(plotModel, legendPosition);
// сохранение графика в изображение
var pngExporter = new PngExporter { Width = 600, Height = 400 };
using (var stream = new MemoryStream()) using (var stream = new MemoryStream())
{ {
pngExporter.Export(plotModel, stream); pngExporter.Export(plotModel, stream);
File.WriteAllBytes("chart.png", stream.ToArray()); File.WriteAllBytes("chart.png", stream.ToArray());
} }
// Создание документа // создание документа
Document document = new Document(); Document document = new Document();
document.Info.Title = documentTitle; document.Info.Title = documentTitle;
document.Info.Subject = "Гистограмма"; document.Info.Subject = "Гистограмма";
@ -71,18 +77,43 @@ namespace FormLibrary
Section section = document.AddSection(); Section section = document.AddSection();
section.AddParagraph(chartTitle, "Heading1"); section.AddParagraph(chartTitle, "Heading1");
// Вставка изображения в PDF // вставка изображения в PDF
var image = section.AddImage("chart.png"); var image = section.AddImage("chart.png");
image.Width = Unit.FromCentimeter(15); image.Width = Unit.FromCentimeter(15);
// Сохранение документа в PDF
PdfDocumentRenderer renderer = new PdfDocumentRenderer(true) { Document = document }; PdfDocumentRenderer renderer = new PdfDocumentRenderer(true) { Document = document };
renderer.RenderDocument(); renderer.RenderDocument();
renderer.PdfDocument.Save(filePath); renderer.PdfDocument.Save(filePath);
// Удалите временное изображение, если необходимо
File.Delete("chart.png"); File.Delete("chart.png");
} }
//добавление легенды
private void AddLegend(PlotModel plotModel, LegendPositions legendPosition)
{
// Создание легенды
var legend = new OxyPlot.Legends.Legend
{
LegendPlacement = LegendPlacement.Outside,
LegendPosition = ConvertLegendPosition(legendPosition),
LegendOrientation = LegendOrientation.Vertical
};
plotModel.Legends.Add(legend);
}
// конвертация позиции легенды
private OxyPlot.Legends.LegendPosition ConvertLegendPosition(LegendPositions legendPosition)
{
return legendPosition switch
{
LegendPositions.Top => OxyPlot.Legends.LegendPosition.TopCenter,
LegendPositions.Bottom => OxyPlot.Legends.LegendPosition.BottomCenter,
LegendPositions.Left => OxyPlot.Legends.LegendPosition.LeftTop,
LegendPositions.Right => OxyPlot.Legends.LegendPosition.RightTop,
_ => OxyPlot.Legends.LegendPosition.TopCenter, // Положение по умолчанию
};
}
} }
} }

View File

@ -6,7 +6,7 @@ using System.Threading.Tasks;
namespace FormLibrary.HelperClasses namespace FormLibrary.HelperClasses
{ {
public enum LegendPosition public enum LegendPositions
{ {
Top, Top,
Bottom, Bottom,

View File

@ -200,15 +200,16 @@ namespace Forms
var chartData = new List<ChartData> var chartData = new List<ChartData>
{ {
new ChartData { SeriesName = "Серия 1", Data = new Dictionary<string, double> { { "Категория 1", 5 }, { "Категория 2", 10 } } }, new ChartData { SeriesName = "Серияd 1", Data = new Dictionary<string, double> { { "Категорияz 1", 5 }, { "Категорияx 2", 10 } } },
new ChartData { SeriesName = "Серия 2", Data = new Dictionary<string, double> { { "Категория 1", 3 }, { "Категория 2", 8 } } } new ChartData { SeriesName = "Серияs 2", Data = new Dictionary<string, double> { { "Категорияa 1", 3 }, { "Категорияs 2", 8 } } },
new ChartData { SeriesName = "Серияs 2", Data = new Dictionary<string, double> { { "Категорияa 1", 3 }, { "Категорияs 2", 8 } } }
}; };
// Укажите путь, куда хотите сохранить PDF // Укажите путь, куда хотите сохранить PDF
string filePath = "G:\\Гистограмма.pdf"; string filePath = "G:\\Гистограмма.pdf";
// Генерация PDF // Генерация PDF
histogramGenerator.CreateHistogramPdf(filePath, "Название документа", "Заголовок диаграммы", LegendPosition.Top, chartData); histogramGenerator.CreateHistogramPdf(filePath, "Название документа", "Заголовок диаграммы", LegendPositions.Bottom, chartData);
MessageBox.Show("PDF успешно сгенерирован!", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information); MessageBox.Show("PDF успешно сгенерирован!", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
} }