using System; using System.Data; using System.IO; using System.Windows.Forms; using System.Windows.Forms.DataVisualization.Charting; using OfficeOpenXml; namespace WindowsFormsApp4 { public partial class ReportForm : Form { private DataTable currentDataTable; private string currentReportType = ""; public ReportForm() { InitializeComponent(); AttachEventHandlers(); ConfigureChart(); } private void AttachEventHandlers() { btnStatistics.Click += BtnStatistics_Click; btnPerformance.Click += BtnPerformance_Click; btnExportExcel.Click += BtnExportExcel_Click; btnChart.Click += BtnChart_Click; btnBack.Click += BtnBack_Click; } private void ConfigureChart() { chartReport.BackColor = System.Drawing.Color.FromArgb(50, 56, 67); chartReport.ChartAreas[0].BackColor = System.Drawing.Color.FromArgb(50, 56, 67); chartReport.ChartAreas[0].AxisX.LabelStyle.ForeColor = System.Drawing.Color.FromArgb(203, 232, 87); chartReport.ChartAreas[0].AxisY.LabelStyle.ForeColor = System.Drawing.Color.FromArgb(203, 232, 87); chartReport.ChartAreas[0].AxisX.MajorGrid.LineColor = System.Drawing.Color.FromArgb(198, 141, 255); chartReport.ChartAreas[0].AxisY.MajorGrid.LineColor = System.Drawing.Color.FromArgb(198, 141, 255); chartReport.Legends[0].ForeColor = System.Drawing.Color.FromArgb(203, 232, 87); } private void ConfigureGrid() { if (dgvReport.Columns.Count == 0) return; dgvReport.DefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(50, 56, 67); dgvReport.DefaultCellStyle.ForeColor = System.Drawing.Color.FromArgb(203, 232, 87); dgvReport.DefaultCellStyle.SelectionBackColor = System.Drawing.Color.FromArgb(198, 141, 255); dgvReport.DefaultCellStyle.SelectionForeColor = System.Drawing.Color.FromArgb(50, 56, 67); dgvReport.ColumnHeadersDefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(198, 141, 255); dgvReport.ColumnHeadersDefaultCellStyle.ForeColor = System.Drawing.Color.FromArgb(50, 56, 67); dgvReport.EnableHeadersVisualStyles = false; dgvReport.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; } private void BtnStatistics_Click(object sender, EventArgs e) { try { currentDataTable = DatabaseHelper.GetManagerStatistics(); dgvReport.DataSource = currentDataTable; ConfigureGrid(); currentReportType = "statistics"; tabControl1.SelectedTab = tabPageTable; MessageBox.Show($"Загружено {currentDataTable.Rows.Count} записей", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { MessageBox.Show($"Ошибка: {ex.Message}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void BtnPerformance_Click(object sender, EventArgs e) { try { DateTime startDate = dtpStartDate.Value; DateTime endDate = dtpEndDate.Value; if (startDate > endDate) { MessageBox.Show("Начальная дата не может быть позже конечной", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } currentDataTable = DatabaseHelper.GetManagerPerformance(startDate, endDate); dgvReport.DataSource = currentDataTable; ConfigureGrid(); currentReportType = "performance"; tabControl1.SelectedTab = tabPageTable; MessageBox.Show($"Отчёт за период {startDate:dd.MM.yyyy} - {endDate:dd.MM.yyyy}\nЗагружено {currentDataTable.Rows.Count} записей", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { MessageBox.Show($"Ошибка: {ex.Message}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void BtnChart_Click(object sender, EventArgs e) { if (currentDataTable == null || currentDataTable.Rows.Count == 0) { MessageBox.Show("Сначала загрузите данные (Статистика или Эффективность)", "Нет данных", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } DrawChart(); tabControl1.SelectedTab = tabPageChart; } private void DrawChart() { chartReport.Series.Clear(); Series series = new Series(); series.ChartType = SeriesChartType.Column; series.Color = System.Drawing.Color.FromArgb(198, 141, 255); series.BorderWidth = 2; series.ShadowOffset = 2; if (currentReportType == "statistics") { series.Name = "Выполненные заявки"; foreach (DataRow row in currentDataTable.Rows) { string managerName = $"{row["last_name"]} {row["first_name"]}"; int completed = Convert.ToInt32(row["completed_requests"]); series.Points.AddXY(managerName, completed); } chartReport.Titles.Clear(); chartReport.Titles.Add("Статистика выполнения заявок по менеджерам"); } else if (currentReportType == "performance") { series.Name = "Выполнено заявок"; foreach (DataRow row in currentDataTable.Rows) { string managerName = $"{row["last_name"]} {row["first_name"]}"; int completed = Convert.ToInt32(row["completed_count"]); series.Points.AddXY(managerName, completed); } chartReport.Titles.Clear(); chartReport.Titles.Add($"Эффективность менеджеров за период"); } chartReport.Series.Add(series); // Настройка внешнего вида графика chartReport.ChartAreas[0].AxisX.LabelStyle.Angle = -45; chartReport.ChartAreas[0].AxisX.Interval = 1; chartReport.ChartAreas[0].AxisX.Title = "Менеджеры"; chartReport.ChartAreas[0].AxisY.Title = "Количество заявок"; chartReport.ChartAreas[0].AxisX.TitleForeColor = System.Drawing.Color.FromArgb(203, 232, 87); chartReport.ChartAreas[0].AxisY.TitleForeColor = System.Drawing.Color.FromArgb(203, 232, 87); } private void BtnExportExcel_Click(object sender, EventArgs e) { if (currentDataTable == null || currentDataTable.Rows.Count == 0) { MessageBox.Show("Нет данных для экспорта", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } try { SaveFileDialog saveDialog = new SaveFileDialog(); saveDialog.Filter = "Excel files (*.xlsx)|*.xlsx"; saveDialog.FileName = $"Отчёт_{DateTime.Now:yyyyMMdd_HHmmss}.xlsx"; if (saveDialog.ShowDialog() == DialogResult.OK) { using (var package = new ExcelPackage()) { var worksheet = package.Workbook.Worksheets.Add("Отчёт"); // Заголовки for (int i = 0; i < dgvReport.Columns.Count; i++) { worksheet.Cells[1, i + 1].Value = dgvReport.Columns[i].HeaderText; worksheet.Cells[1, i + 1].Style.Font.Bold = true; worksheet.Cells[1, i + 1].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid; worksheet.Cells[1, i + 1].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.FromArgb(198, 141, 255)); } // Данные for (int i = 0; i < dgvReport.Rows.Count; i++) { for (int j = 0; j < dgvReport.Columns.Count; j++) { worksheet.Cells[i + 2, j + 1].Value = dgvReport.Rows[i].Cells[j].Value?.ToString(); } } worksheet.Cells.AutoFitColumns(); package.SaveAs(new FileInfo(saveDialog.FileName)); } MessageBox.Show("Отчёт успешно сохранён!", "Успешно", MessageBoxButtons.OK, MessageBoxIcon.Information); } } catch (Exception ex) { MessageBox.Show($"Ошибка при экспорте: {ex.Message}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void BtnBack_Click(object sender, EventArgs e) { this.Close(); } } }