From fef40a6aa806bfce5cd5f2af4e18de6769062284 Mon Sep 17 00:00:00 2001 From: Yourdax Date: Tue, 29 Oct 2024 06:53:52 +0400 Subject: [PATCH] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BD?= =?UTF-8?q?=D1=83=D0=B6=D0=BD=D1=8B=20=D0=BD=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D1=88=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewModels/OrderExcelViewModel.cs | 28 +++ KopLab1/Lab3Form/FormMain.Designer.cs | 12 +- KopLab1/Lab3Form/FormMain.cs | 205 +++++++++++++++++- KopLab1/Lab3Form/FormMain.resx | 6 + 4 files changed, 237 insertions(+), 14 deletions(-) create mode 100644 KopLab1/InternetShopOrdersContracts/ViewModels/OrderExcelViewModel.cs diff --git a/KopLab1/InternetShopOrdersContracts/ViewModels/OrderExcelViewModel.cs b/KopLab1/InternetShopOrdersContracts/ViewModels/OrderExcelViewModel.cs new file mode 100644 index 0000000..afaea53 --- /dev/null +++ b/KopLab1/InternetShopOrdersContracts/ViewModels/OrderExcelViewModel.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace InternetShopOrdersContracts.ViewModels +{ + public class OrderExcelViewModel + { + public OrderExcelViewModel(int id, string fullname, string destinationCityName, DateTime expectedDeliveryDate) + { + this.Id = id; + this.Fullname = fullname; + //this.DestinationCityId = destinationCityId; + this.DestinationCityName = destinationCityName; + this.ExpectedDeliveryDate = expectedDeliveryDate; + } + + public int Id; + public string Fullname; + //public int DestinationCityId; + public string DestinationCityName; + public DateTime ExpectedDeliveryDate; + } + + +} diff --git a/KopLab1/Lab3Form/FormMain.Designer.cs b/KopLab1/Lab3Form/FormMain.Designer.cs index a053cc5..dec5284 100644 --- a/KopLab1/Lab3Form/FormMain.Designer.cs +++ b/KopLab1/Lab3Form/FormMain.Designer.cs @@ -41,6 +41,8 @@ выбранныеТоварыToolStripMenuItem = new ToolStripMenuItem(); controlDataTable = new ControlsLibraryNet60.Data.ControlDataTableTable(); pdfTable1 = new FormLibrary.PDFTable(components); + excelTableComponent1 = new WinFormsLibraryVolkov.NonVisualComponents.ExcelTableComponent(components); + componentDocumentWithChartLineWord1 = new ComponentsLibraryNet60.DocumentWithChart.ComponentDocumentWithChartLineWord(components); menuStrip.SuspendLayout(); SuspendLayout(); // @@ -99,15 +101,15 @@ документToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.S; документToolStripMenuItem.Size = new Size(309, 22); документToolStripMenuItem.Text = "Документ с простой таблицей"; - документToolStripMenuItem.Click += документToolStripMenuItem_Click; + документToolStripMenuItem.Click += GeneratePdfButton_Click; // // документСТаблицейToolStripMenuItem // документСТаблицейToolStripMenuItem.Name = "документСТаблицейToolStripMenuItem"; документСТаблицейToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.T; документСТаблицейToolStripMenuItem.Size = new Size(309, 22); - документСТаблицейToolStripMenuItem.Text = "Отчет по всем заказам"; - документСТаблицейToolStripMenuItem.Click += документСТаблицейToolStripMenuItem_Click; + документСТаблицейToolStripMenuItem.Text = "Отчет по всем заказам Excel"; + документСТаблицейToolStripMenuItem.Click += buttonCreateOrderReport_Click; // // документСДиаграммойToolStripMenuItem // @@ -115,7 +117,7 @@ документСДиаграммойToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.C; документСДиаграммойToolStripMenuItem.Size = new Size(309, 22); документСДиаграммойToolStripMenuItem.Text = "Документ с линейной диаграммой"; - документСДиаграммойToolStripMenuItem.Click += документСДиаграммойToolStripMenuItem_Click; + документСДиаграммойToolStripMenuItem.Click += CreateDocumentButton_Click; // // выбранныеТоварыToolStripMenuItem // @@ -167,5 +169,7 @@ private ToolStripMenuItem документСДиаграммойToolStripMenuItem; private ControlsLibraryNet60.Data.ControlDataTableTable controlDataTable; private FormLibrary.PDFTable pdfTable1; + private WinFormsLibraryVolkov.NonVisualComponents.ExcelTableComponent excelTableComponent1; + private ComponentsLibraryNet60.DocumentWithChart.ComponentDocumentWithChartLineWord componentDocumentWithChartLineWord1; } } \ No newline at end of file diff --git a/KopLab1/Lab3Form/FormMain.cs b/KopLab1/Lab3Form/FormMain.cs index 2198f3a..eee3d68 100644 --- a/KopLab1/Lab3Form/FormMain.cs +++ b/KopLab1/Lab3Form/FormMain.cs @@ -18,6 +18,9 @@ using WinFormsLibraryVolkov.NonVisualComponents; using ComponentsLibraryNet60.Core; using ComponentsLibraryNet60.DocumentWithTable; using ComponentsLibraryNet60.Models; +using FormLibrary.HelperClasses; +using FormLibrary; +using ComponentsLibraryNet60.DocumentWithChart; namespace Lab3Form { @@ -109,25 +112,207 @@ namespace Lab3Form } } - - private void документToolStripMenuItem_Click(object sender, EventArgs e) + private void GeneratePdfButton_Click(object sender, EventArgs e) { - List orderImages = new List(); - string path = AppDomain.CurrentDomain.BaseDirectory + "Фотокарточки заказов с интернет-магазина.xlsx"; - //if (excelImagesComponent.createWithImages(new ExcelImageInfo(path, "Фотокарточки заказов", orderImages.ToArray()))) MessageBox.Show("Документ был создан"); + try + { + // Получаем заказы из логики + var orders = _logic.ReadList(null); + + // Создаем список таблиц для PDF + var orderTables = new List(); + + foreach (var order in orders) + { + // Получаем количество строк для таблицы на основе количества статусов + int rowCount = order.OrderStatusHistory.Count; + + // Создаем таблицу с числом строк, равным количеству статусов, и четырьмя колонками + // +1 строка для заголовков + string[,] orderTable = new string[rowCount+1, 4]; + + // Первая строка — заголовок + orderTable[0, 0] = "Статус"; + orderTable[0, 1] = "Идентификатор заказа"; + orderTable[0, 2] = "Город назначения"; + orderTable[0, 3] = "Дата доставки"; + + // Заполняем строки таблицы статусами и данными о заказе + for (int i = 0; i < rowCount; i++) + { + orderTable[i+1, 0] = order.OrderStatusHistory[i]; // Статус заказа + orderTable[i+1, 1] = order.Id.ToString(); // Имя заказчика + orderTable[i+1, 2] = order.DestinationCityName; // Город назначения + orderTable[i+1, 3] = order.ExpectedDeliveryDate.ToString("yyyy-MM-dd"); // Дата доставки + } + + // Добавляем таблицу заказа в список + orderTables.Add(orderTable); + } + + // Запрашиваем у пользователя путь и имя файла для сохранения + using (SaveFileDialog saveFileDialog = new SaveFileDialog()) + { + saveFileDialog.Filter = "PDF files (*.pdf)|*.pdf|All files (*.*)|*.*"; + saveFileDialog.Title = "Сохранить PDF-документ"; + saveFileDialog.FileName = "Отчет1.pdf"; // Имя по умолчанию + + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + // Создаем PDF данные с указанным пользователем путем + var pdfData = new PdfDocumentData( + saveFileDialog.FileName, // Используем выбранный путь и имя файла + "Отчет по заказам", + orderTables // Передаем список таблиц в PDF-данные + ); + + var documentGenerator = new PDFTable(); + documentGenerator.GeneratePdf(pdfData); + + MessageBox.Show("PDF-документ успешно создан!", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + } + catch (Exception ex) + { + MessageBox.Show($"Произошла ошибка: {ex.Message}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } } - private void документСТаблицейToolStripMenuItem_Click(object sender, EventArgs e) + private void buttonCreateOrderReport_Click(object sender, EventArgs e) { - string path = AppDomain.CurrentDomain.BaseDirectory + "Отчет по всем заказам.docx"; + // Получаем список заказов из логики + var orders = _logic.ReadList(null); + if (orders == null || orders.Count == 0) + { + MessageBox.Show("Нет заказов для отчета.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + // Подготовка данных для Excel + var tableData = new List(); + foreach (var order in orders) + { + if (order != null) + { + tableData.Add(new OrderExcelViewModel( + order.Id, + order.Fullname, + //order.DestinationCityId, + order.DestinationCityName, + order.ExpectedDeliveryDate + )); + } + } + + + // Определение параметров для Excel + string path = AppDomain.CurrentDomain.BaseDirectory + "OrderReport.xlsx"; + + // Определяем объединения для заголовков + List<(int, int)> merges = new List<(int, int)> + { + (0,1), + (2, 3) + }; + + // Убедитесь, что высоты соответствуют количеству строк + List heights = Enumerable.Repeat(20, 4).ToList(); + + // Заголовки шапки + List<(string, string)> headers = new List<(string, string)> + { + + ("","Данные"), + ("Id", "Идентификатор"), + ("Fullname", "ФИО заказчика"), + //("DestinationCityId","Идентификатор города"), + ("", "Заказ"), + ("DestinationCityName", "Город назначения"), + ("ExpectedDeliveryDate", "Дата получения заказа") + }; + + // Проверьте, что все списки заполнены + if (merges.Count == 0 || heights.Count == 0 || headers.Count == 0 || tableData.Count == 0) + { + MessageBox.Show("Недостаточно данных для создания отчета.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + // Вывод отладочной информации + Console.WriteLine($"Merges Count: {merges.Count}"); + Console.WriteLine($"Heights Count: {heights.Count}"); + Console.WriteLine($"Headers Count: {headers.Count}"); + Console.WriteLine($"TableData Count: {tableData.Count}"); + // Вызов метода для создания Excel файла + if (excelTableComponent1.createWithTable(path, "Отчет по заказам", merges, heights, headers, tableData)) + { + MessageBox.Show("Отчет успешно создан!"); + } + else + { + MessageBox.Show("Ошибка при создании отчета.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } } - private void документСДиаграммойToolStripMenuItem_Click(object sender, EventArgs e) - { - string path = AppDomain.CurrentDomain.BaseDirectory + "Гистограмма товаров.pdf"; + private void CreateDocumentButton_Click(object sender, EventArgs e) + { + // Извлечение заказов + var orders = _logic.ReadList(null).Cast().ToList(); + + // Подготовка данных для диаграммы + var chartData = new Dictionary>(); + + foreach (var order in orders) + { + if (!chartData.ContainsKey(order.DestinationCityName)) + { + chartData[order.DestinationCityName] = new List<(DateTime Date, int Count)>(); + } + + // Добавляем заказ в соответствующий город назначения и дату + var existingData = chartData[order.DestinationCityName] + .FirstOrDefault(d => d.Date.Date == order.ExpectedDeliveryDate.Date); + + if (existingData.Date == default) + { + chartData[order.DestinationCityName].Add((order.ExpectedDeliveryDate.Date, 1)); + } + else + { + // Увеличиваем счетчик для существующей даты + int index = chartData[order.DestinationCityName].FindIndex(d => d.Date.Date == order.ExpectedDeliveryDate.Date); + var updatedValue = chartData[order.DestinationCityName][index]; + chartData[order.DestinationCityName][index] = (updatedValue.Date, updatedValue.Count + 1); + } + } + // Создание конфигурации для документа + string filePath = "G://report.docx"; // Укажите нужное имя файла + var config = new ComponentDocumentWithChartConfig + { + ChartTitle = "Отчет по заказам", + LegendLocation = ComponentsLibraryNet60.Models.Location.Bottom, + Data = chartData.ToDictionary( + entry => entry.Key, + entry => entry.Value.Select(d => (DateTimeToInt(d.Date), (double)d.Count)).ToList()), + FilePath = filePath, // Устанавливаем путь к файлу + Header = "Заголовок отчета" // Устанавливаем заголовок + + }; + + // Создание экземпляра вашего связующего класса + var documentComponent = new ComponentDocumentWithChartLineWord(); + + // Создание документа + documentComponent.CreateDoc(config); + + MessageBox.Show("Документ создан успешно!"); } + private int DateTimeToInt(DateTime date) + { + return date.Day; + } + private void выбранныеТоварыToolStripMenuItem_Click(object sender, EventArgs e) { diff --git a/KopLab1/Lab3Form/FormMain.resx b/KopLab1/Lab3Form/FormMain.resx index 4282b87..6f2a6fb 100644 --- a/KopLab1/Lab3Form/FormMain.resx +++ b/KopLab1/Lab3Form/FormMain.resx @@ -123,6 +123,12 @@ 126, 17 + + 231, 17 + + + 409, 17 + 177