using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using DocumentFormat.OpenXml; using EmployeeManagmentContracts.BusinessLogicContracts; using EmployeeManagmentContracts.ViewModels; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.IO; using Microsoft.Win32; namespace EmployeeManagmentView.Employee.Salary { /// /// Логика взаимодействия для ViewSalaryWindow.xaml /// public partial class ViewSalaryWindow : Window { private readonly ISalaryLogic _salaryLogic; private IEnumerable _allSalaries; public ViewSalaryWindow(ISalaryLogic salaryLogic) { _salaryLogic = salaryLogic; InitializeComponent(); LoadSalaries(); } private void LoadSalaries() { _allSalaries = _salaryLogic.GetFullList(); // Загрузка всех данных SalariesDataGrid.ItemsSource = _allSalaries; } private void ExportToExcelButton_Click(object sender, RoutedEventArgs e) { try { // Получаем данные о зарплатах var salaries = _salaryLogic.GetFullList(); if (salaries == null || !salaries.Any()) { MessageBox.Show("Нет данных для экспорта.", "Внимание", MessageBoxButton.OK, MessageBoxImage.Information); return; } // Открытие диалогового окна для сохранения файла SaveFileDialog saveFileDialog = new SaveFileDialog { Filter = "Excel файлы (*.xlsx)|*.xlsx", // фильтр для файлов .xlsx Title = "Сохранить отчет об зарплатах", // заголовок окна FileName = "Отчет_зарплат.xlsx" // имя по умолчанию }; // Проверка, что пользователь выбрал путь и имя файла if (saveFileDialog.ShowDialog() == true) { string filePath = saveFileDialog.FileName; // Путь и имя файла GenerateExcelReport(filePath, salaries); // Генерация отчета MessageBox.Show($"Отчет успешно сохранен: {filePath}", "Успех", MessageBoxButton.OK, MessageBoxImage.Information); } } catch (Exception ex) { MessageBox.Show($"Ошибка экспорта: {ex.Message}", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error); } } private void GenerateExcelReport(string filePath, List salaries) { using (SpreadsheetDocument document = SpreadsheetDocument.Create(filePath, SpreadsheetDocumentType.Workbook)) { // Создаем Workbook WorkbookPart workbookPart = document.AddWorkbookPart(); workbookPart.Workbook = new Workbook(); // Создаем Worksheet WorksheetPart worksheetPart = workbookPart.AddNewPart(); worksheetPart.Worksheet = new Worksheet(new SheetData()); // Добавляем лист в Workbook Sheets sheets = document.WorkbookPart.Workbook.AppendChild(new Sheets()); Sheet sheet = new Sheet() { Id = document.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Зарплаты" }; sheets.Append(sheet); // Получаем SheetData SheetData sheetData = worksheetPart.Worksheet.GetFirstChild(); // Заполняем заголовки Row headerRow = new Row(); headerRow.Append( CreateTextCell("A", "ID"), CreateTextCell("B", "Сотрудник"), CreateTextCell("C", "Часы"), CreateTextCell("D", "Ставка"), CreateTextCell("E", "Премия"), CreateTextCell("F", "Дата"), CreateTextCell("G", "Статус оплаты") // Добавлен заголовок для Passed ); sheetData.AppendChild(headerRow); // Заполняем данные foreach (var salary in salaries) { Row row = new Row(); row.Append( CreateTextCell("A", salary.Id.ToString()), CreateTextCell("B", salary.EmployeeName), CreateTextCell("C", salary.CountHours.ToString()), CreateTextCell("D", salary.PriceHour.ToString("F2")), CreateTextCell("E", salary.Premium?.ToString("F2") ?? "0"), CreateTextCell("F", salary.Date.Value.ToString("dd.MM.yyyy")), CreateTextCell("G", salary.Passed ? "Заплачено" : "Не заплачено") // Используем поле Passed ); sheetData.AppendChild(row); } workbookPart.Workbook.Save(); } } // Метод для создания текстовой ячейки private Cell CreateTextCell(string columnName, string text) { return new Cell { DataType = CellValues.String, CellReference = columnName, CellValue = new CellValue(text) }; } private void SearchTextBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e) { string query = SearchTextBox.Text.ToLower(); if (string.IsNullOrWhiteSpace(query)) { // Отображаем все записи SalariesDataGrid.ItemsSource = _allSalaries; } else { // Фильтрация по всем полям сущности var filteredList = _allSalaries.Where(sal => (sal.EmployeeName?.ToLower().Contains(query) ?? false) || sal.CountHours.ToString().Contains(query) || sal.PriceHour.ToString().Contains(query) || (sal.Premium.HasValue && sal.Premium.Value.ToString().Contains(query)) || (sal.Date.HasValue && sal.Date.Value.ToString("dd.MM.yyyy").Contains(query)) || (sal.Passed ? "заплачено" : "не заплачено").Contains(query) // Добавлен фильтр для Passed ).ToList(); SalariesDataGrid.ItemsSource = filteredList; } } } }