Желонкин Денис 336c947c07 Готово на прод
2025-01-23 23:41:57 +07:00

220 lines
11 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OfficeOpenXml;
using OfficeOpenXml;
namespace NoDuplicate
{
public partial class Form1 : Form
{
private DataTable emailTable; // Таблица для хранения данных
public Form1()
{
InitializeComponent();
}
private void импортToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog
{
Filter = "Excel Files|*.xlsx",
Title = "Выберите файл с email-адресами"
};
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
string filePath = openFileDialog.FileName;
try
{
// Указываем лицензионный контекст для EPPlus
OfficeOpenXml.ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;
using (var package = new ExcelPackage(new FileInfo(filePath)))
{
var worksheet = package.Workbook.Worksheets[0]; // Первый лист
int rows = worksheet.Dimension.Rows; // Количество строк
emailTable = new DataTable();
emailTable.Columns.Add("Email", typeof(string));
for (int row = 1; row <= rows; row++)
{
string email = worksheet.Cells[row, 1].Text;
if (!string.IsNullOrEmpty(email))
{
emailTable.Rows.Add(email);
}
}
dataGridView1.DataSource = emailTable;
//MessageBox.Show("Данные успешно загружены!", "Импорт");
}
}
catch (Exception ex)
{
MessageBox.Show($"Ошибка при импорте файла: {ex.Message}", "Ошибка");
}
}
}
private List<string> removedEmails = new List<string>(); // Список для хранения удалённых адресов
private string reportsDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "MyAppReports"); // Путь к папке для отчётов
private void SaveReport()
{
try
{
// Проверяем и создаём директорию, если её нет
if (!Directory.Exists(reportsDirectory))
{
Directory.CreateDirectory(reportsDirectory);
}
// Проверяем, есть ли удалённые адреса
if (removedEmails.Count == 0)
{
MessageBox.Show("Нет удалённых адресов для отчёта.", "Информация");
return;
}
// Формируем имя файла отчёта
string reportFileName = $"RemovedEmailsReport_{DateTime.Now:yyyyMMdd_HHmmss}.txt";
string reportPath = Path.Combine(reportsDirectory, reportFileName);
// Записываем данные в файл
using (StreamWriter writer = new StreamWriter(reportPath))
{
writer.WriteLine($"Отчёт о удалённых адресах ({DateTime.Now}):");
writer.WriteLine($"Всего удалено: {removedEmails.Count}");
writer.WriteLine("Список удалённых адресов:");
foreach (var email in removedEmails)
{
writer.WriteLine(email);
}
}
//MessageBox.Show($"Отчёт сохранён в папке: {reportsDirectory}", "Успех");
}
catch (Exception ex)
{
MessageBox.Show($"Ошибка при сохранении отчёта: {ex.Message}", "Ошибка");
}
}
private void btnRemoveDuplicates_Click(object sender, EventArgs e)
{
if (emailTable == null || emailTable.Rows.Count == 0)
{
lblStatus.Text = "Таблица пуста или не загружена.";
lblStatus.ForeColor = Color.Red; // Красный цвет для ошибки
return;
}
try
{
var allEmails = emailTable.AsEnumerable()
.Select(row => row.Field<string>("Email").Trim())
.ToList();
var distinctEmails = allEmails.Distinct(StringComparer.OrdinalIgnoreCase).ToList();
removedEmails = allEmails
.GroupBy(email => email, StringComparer.OrdinalIgnoreCase)
.Where(group => group.Count() > 1)
.SelectMany(group => group.Skip(1))
.ToList();
emailTable.Rows.Clear();
foreach (var email in distinctEmails)
{
emailTable.Rows.Add(email);
}
dataGridView1.DataSource = emailTable;
SaveReport();
// Обновляем сообщение на форме
lblStatus.Text = $"Удаление завершено! Удалено {removedEmails.Count} адрес(ов).";
lblStatus.ForeColor = Color.Green; // Зелёный цвет для успеха
}
catch (Exception ex)
{
lblStatus.Text = $"Ошибка: {ex.Message}";
lblStatus.ForeColor = Color.Red; // Красный цвет для ошибки
}
}
private void экспортToolStripMenuItem_Click(object sender, EventArgs e)
{
if (emailTable == null || emailTable.Rows.Count == 0)
{
MessageBox.Show("Нет данных для экспорта.", "Ошибка");
return;
}
// Открываем диалог для выбора места сохранения файла
SaveFileDialog saveFileDialog = new SaveFileDialog
{
Filter = "Excel Files|*.xlsx",
Title = "Сохранить как",
FileName = "Emails.xlsx"
};
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
string filePath = saveFileDialog.FileName;
try
{
OfficeOpenXml.ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;
using (var package = new OfficeOpenXml.ExcelPackage())
{
// Создаем новый лист
var worksheet = package.Workbook.Worksheets.Add("Emails");
// Записываем данные из DataTable в Excel
for (int i = 0; i < emailTable.Rows.Count; i++)
{
worksheet.Cells[i + 1, 1].Value = emailTable.Rows[i]["Email"]; // Первая строка без заголовка
}
// Сохраняем файл
package.SaveAs(new FileInfo(filePath));
}
//MessageBox.Show("Данные успешно экспортированы!", "Успех");
}
catch (Exception ex)
{
MessageBox.Show($"Ошибка при экспорте файла: {ex.Message}", "Ошибка");
}
}
}
private void помощьToolStripMenuItem_Click(object sender, EventArgs e)
{
MessageBox.Show("Инструкция по работе с программой\r\nПрограмма для работы с email-адресами позволяет удалять дубликаты из списка адресов и создавать отчёты об удалённых данных. Следуйте этим шагам:\r\n\r\n1. Импорт файла\r\nНажмите кнопку \"Импорт\" или выберите пункт меню \"Файл → Импорт\".\r\nВ появившемся окне выберите файл в формате .xlsx, содержащий список email-адресов.\r\nПрограмма загрузит данные и отобразит их в таблице.\r\n2. Удаление дубликатов\r\nПосле импорта нажмите кнопку \"Удалить дубликаты\".\r\nПрограмма автоматически:\r\nУдалит повторяющиеся email-адреса (с учётом регистра и пробелов).\r\nОбновит таблицу, оставив только уникальные адреса.\r\nСоздаст отчёт в папке MyAppReports в \"Моих документах\". Отчёт содержит список удалённых адресов.\r\n3. Экспорт файла\r\nЧтобы сохранить уникальные адреса, нажмите кнопку \"Экспорт\" или выберите пункт меню \"Файл → Экспорт\".\r\nВыберите место и имя для нового файла в формате .xlsx.\r\nПрограмма создаст файл с уникальными адресами.\r\n4. Папка отчётов\r\nВсе отчёты об удалённых адресах сохраняются в папке MyAppReports (расположена в \"Моих документах\").\r\nКаждый отчёт содержит:\r\nОбщее количество удалённых адресов.\r\nПолный список удалённых адресов.\r\nВы можете открыть эту папку вручную или добавить кнопку для её быстрого открытия.");
}
}
}