private async void CompareSitesButton_Click_1(object sender, EventArgs e) { ExcelPackage.LicenseContext = LicenseContext.NonCommercial; try { if (int.TryParse(MaxDepthTextBox.Text, out int depth)) { _htmlParser.MaxDepth = depth; } FirstPanel.Nodes.Clear(); SecondPanel.Nodes.Clear(); var oldUrl = textBox1.Text; var newUrl = textBox2.Text; //string filePath = "user.xlsx"; //добавил // var excelReader = new ExcelUserReader(); //добавил // var users = excelReader.ReadUsersFromExcel(filePath);//добавил string rootUrl1 = oldUrl.TrimEnd('/'); string rootUrl2 = newUrl.TrimEnd('/'); var userData = new Dictionary(); foreach (var user in users) { string password = user.Item1; //добавил string username = user.Item2; _client = await _server.SendLoginRequestAsync(oldUrl, username, password, _linkComparer); // _client2= await _server.SendLoginRequestAsync(newUrl, username, password, _linkComparer); if (_client != null) { TreeNodeCollection oldSiteNodes = FirstPanel.Nodes; TreeNodeCollection newSiteNodes = SecondPanel.Nodes; await _htmlParser.ScrapeWebsiteAsync(oldUrl, oldSiteNodes, 0, new Uri(oldUrl).Host, _linkComparer, rootUrl1, _client); await _htmlParser.ScrapeWebsiteAsync(newUrl, newSiteNodes, 0, new Uri(newUrl).Host, _linkComparer, rootUrl2, _client); var oldLinks = GetAllNodeTexts(oldSiteNodes); var newLinks = GetAllNodeTexts(newSiteNodes); var result1 = await _htmlParser.CompareListLink(oldLinks, newLinks, rootUrl1, rootUrl2); var result2 = await _htmlParser.CompareListLink(newLinks, oldLinks, rootUrl2, rootUrl1); _treeNodeData.CompareData = new CompareData {New = result2.RemovedLinks, Removed = result1.RemovedLinks, Common = result1.CommonLinks}; UpdateNodeColors(oldSiteNodes, result1, Color.Red, rootUrl1); UpdateNodeColors(newSiteNodes, result2, Color.Blue, rootUrl2); // Сохраняем данные для текущего пользователя в словарь userData[username] = (oldSiteNodes, newSiteNodes); } else { MessageBox.Show($"Не удалось авторизоваться для пользователя: {username}"); } //сделать тут очищение кеша для пользователей (несколько строк) _client?.Dispose(); // _linkComparer. } var reportGenerator = new UserReportGenerator("users.xlsx"); //добавил reportGenerator.GenerateReport(userData); } catch (Exception ex) { MessageBox.Show($"Ошибка: {ex.Message}"); } } // if (_client != null) // { // // // TreeNodeCollection oldSiteNodes = FirstPanel.Nodes; // // TreeNodeCollection newSiteNodes = SecondPanel.Nodes; // // // await _htmlParser.ScrapeWebsiteAsync(oldUrl, oldSiteNodes, 0, new Uri(oldUrl).Host, _linkComparer, rootUrl1, _client); // // await _htmlParser.ScrapeWebsiteAsync(newUrl, newSiteNodes, 0, new Uri(newUrl).Host, _linkComparer, rootUrl2, _client); // // var oldLinks = GetAllNodeTexts(oldSiteNodes); // var newLinks = GetAllNodeTexts(newSiteNodes); // // var result1 = await _htmlParser.CompareListLink(oldLinks, newLinks, rootUrl1, rootUrl2); // var result2 = await _htmlParser.CompareListLink(newLinks, oldLinks, rootUrl2, rootUrl1); // // _treeNodeData.CompareData = new CompareData // {New = result2.RemovedLinks, Removed = result1.RemovedLinks, Common = result1.CommonLinks}; // // UpdateNodeColors(oldSiteNodes, result1, Color.Red, rootUrl1); // UpdateNodeColors(newSiteNodes, result2, Color.Blue, rootUrl2); // // isTreeCreated = true; // ExcelGenerator.Enabled = true; // } // else // { // // TODO // } // } // catch (Exception ex) // { // MessageBox.Show($"Error comparing sites: {ex.Message}", "Error", MessageBoxButtons.OK, // MessageBoxIcon.Error); // } using System; using System.Collections.Generic; using System.IO; using OfficeOpenXml; namespace NetFrameworkParsing { public class ExcelUserReader { public List> ReadUsersFromExcel(string filePath) { ExcelPackage.LicenseContext = LicenseContext.NonCommercial; var users = new List>(); using (var package = new OfficeOpenXml.ExcelPackage(new FileInfo(filePath))) { OfficeOpenXml.ExcelWorksheet worksheet = package.Workbook.Worksheets[0]; int rowCount = worksheet.Dimension.Rows; for (int row = 2; row <= rowCount; row++) { string password = worksheet.Cells[row, 1].Text; string login = worksheet.Cells[row, 2].Text; users.Add(new Tuple(password, login)); } } return users; } } } using System.Collections.Generic; using System.IO; using System.Windows.Forms; using OfficeOpenXml; namespace NetFrameworkParsing { public class UserReportGenerator { private string _outputFilePath; public UserReportGenerator(string outputFilePath) { _outputFilePath = outputFilePath; } public void GenerateReport(Dictionary userData) { ExcelPackage.LicenseContext = LicenseContext.NonCommercial; using (var package = new ExcelPackage()) { foreach (var user in userData) { string username = user.Key; var oldSiteNodes = user.Value.oldSiteNodes; var newSiteNodes = user.Value.newSiteNodes; var worksheet = package.Workbook.Worksheets.Add(username); worksheet.Cells[1, 1].Value = "URL"; worksheet.Cells[1, 2].Value = "Status"; int row = 2; foreach (TreeNode node in oldSiteNodes) { worksheet.Cells[row, 1].Value = node.Text; worksheet.Cells[row, 2].Value = "Old Site"; row++; } foreach (TreeNode node in newSiteNodes) { worksheet.Cells[row, 1].Value = node.Text; worksheet.Cells[row, 2].Value = "New Site"; row++; } worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns(); } FileInfo fi = new FileInfo(_outputFilePath); package.SaveAs(fi); } MessageBox.Show("Отчет для пользователей успешно создан!"); } } }