private string GetDocumentFullPath(WebParserConfig parserConfig, WebParserResult parserResult, string addinFullPath) { string downloadsFolderName = "Downloads"; string addinConfigName = parserConfig.AddinConfigName; string parserDir = Path.GetDirectoryName(addinFullPath); string dealName = parserResult.DocumentPdfFolderName; string pdfDocumentName = Path.GetFileName(parserResult.DocumentPdfUrl); return(Path.Combine(parserDir, downloadsFolderName, addinConfigName, dealName, pdfDocumentName)); }
/// <summary> /// Получить данные из kad.ru по номеру документа /// </summary> /// <param name="documentNumber"></param> /// <returns></returns> private static WebParserResult ParseDocument(WebParserConfig parserConfig, string documentNumber) { IWebPageParser webParser = new ExcelAddinWebPageParser(); WebParserParams parserParams = new WebParserParams() { DocumentNumber = documentNumber }; var parserResult = webParser.ParseWebSite(parserConfig, parserParams); return(parserResult); }
/// <summary> /// Проверка работы ExcelAddin /// </summary> /// <returns></returns> private static string CheckExcelAddin() { IWebPageParser webParser = new ExcelAddinWebPageParser(); WebParserConfig parserConfig = new WebParserConfig() { AddinConfigName = "" }; var parserResult = webParser.ParserCheck(parserConfig); return(parserResult.ParserStatus + ( string.IsNullOrEmpty(parserResult.ParserError) ? "" : ": " + parserResult.ParserError )); }
public WebParserResult ParserCheck(WebParserConfig parserConfig) { string fileNameParser = this.GetParserPath(); WebParserResult result = new WebParserResult() { ParserStatus = "Ok", ParserError = "" }; Excel.Application xlApp = null; try { Console.WriteLine("Parser test starting. Please wait..."); // Application xlApp = new Excel.Application(); // открываем Excel файл Excel.Workbook xlWb1 = xlApp.Workbooks.Open(fileNameParser); xlApp.Run(@"ParserAddinTest"); //xlWb1.Close(false); // закрываем книгу без сохранения xlApp.DisposeChildInstances(); } catch (Exception exc) { result.ParserStatus = "Error"; result.ParserError = exc.Message; } finally { if (xlApp != null) { xlApp.Quit(); //закрываем Excel xlApp.Dispose(); } } return(result); }
public WebParserResult ParseWebSite(WebParserConfig parserConfig, WebParserParams parserParam) { string fileNameAddin = this.GetParserPath(); string parserConfigName = parserConfig.AddinConfigName; WebParserResult parserResult = new WebParserResult() { ParserStatus = "Ok", ParserError = "" }; Excel.Application xlApp = null; Excel.Workbook xlWb1 = null; Excel.Workbook xlWb2 = null; Excel.Worksheet xlSht = null; try { // Запустить Application xlApp = new Excel.Application(); // Открыть надстройку xlWb1 = xlApp.Workbooks.Open(fileNameAddin); // Создать лист для ввода данных // Excel.Workbook xlWb2 = xlApp.Workbooks.Open(fileNameExcelWorkbook); xlWb2 = xlApp.Workbooks.Add(); //Excel.Worksheet xlSht = xlWb2.Sheets["Лист1"]; //имя листа в файле xlSht = xlWb2.Sheets[1] as Excel.Worksheet; //имя листа в файле //xlApp.Visible = true; //xlApp.DisplayAlerts = false; int startRowNumber = parserConfig.StartRowNumber; // Вывод заголовка if (startRowNumber > 1) { xlSht.Cells[1, parserConfig.DealNumberColumn].Value = "Номер документа"; xlSht.Cells[1, parserConfig.IsTrackColumn].Value = "Обрабатывать"; } // Заполнение исходных данных на листе xlSht.Cells[startRowNumber, parserConfig.DealNumberColumn].Value = parserParam.DocumentNumber; xlSht.Cells[startRowNumber, parserConfig.IsTrackColumn].Value = "Да"; // Запуск парсера var res = xlApp.Run(@"StartParser", parserConfigName); if (!String.IsNullOrEmpty((string)res)) { throw new Exception((string)res); } object row1 = xlSht.Cells[startRowNumber, parserConfig.ResultNumberColumn].Value; if (row1 == null) { parserResult.ParserStatus = "Not found"; } else { string col2HyperlinkAddress = xlSht.Cells[startRowNumber, parserConfig.DealNumberHyperlinkColumn].Hyperlinks[1].Address; string col3 = xlSht.Cells[startRowNumber, parserConfig.DocumentPdfFolderNameColumn].Value.ToString(); string col4 = xlSht.Cells[startRowNumber, parserConfig.DocumentPdfUrlColumn].Value.ToString(); DateTime col5 = (DateTime)xlSht.Cells[startRowNumber, parserConfig.LastDealDateColumn].Value; parserResult.CardUrl = col2HyperlinkAddress; parserResult.LastDealDate = col5; parserResult.DocumentPdfUrl = col4; parserResult.DocumentPdfFolderName = col3; parserResult.HasAttachment = string.IsNullOrEmpty(col4) ? false : true; parserResult.DocumentPfdPath = GetDocumentFullPath(parserConfig, parserResult, fileNameAddin); } } catch (Exception exc) { parserResult.ParserStatus = "Error"; parserResult.ParserError = exc.Message; } finally { if (xlWb2 != null) { xlWb2.Saved = true; } xlApp.DisposeChildInstances(); if (xlApp != null) { xlApp.Quit(); //закрываем Excel xlApp.Dispose(); } } return(parserResult); }
public static int Main(string[] args) { if (AppDomain.CurrentDomain.IsDefaultAppDomain()) { // RazorEngine cannot clean up from the default appdomain... Console.WriteLine("Switching to second AppDomain, for RazorEngine..."); AppDomainSetup adSetup = new AppDomainSetup(); adSetup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase; var current = AppDomain.CurrentDomain; // You only need to add strongnames when your appdomain is not a full trust environment. var strongNames = new StrongName[0]; var domain = AppDomain.CreateDomain( "MyMainDomain", null, current.SetupInformation, new PermissionSet(PermissionState.Unrestricted), strongNames); var exitCode = domain.ExecuteAssembly(Assembly.GetExecutingAssembly().Location); // RazorEngine will cleanup. AppDomain.Unload(domain); return(exitCode); } Console.WriteLine("-- ParserQueueRunner, ver 0.2 --"); Console.WriteLine("Starting work."); // Проверка работы Excel Addin "Parser" //string res = CheckExcelAddin(); string EXE = Assembly.GetExecutingAssembly().GetName().Name; string startupPath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName); string iniFullPath = Path.Combine(startupPath, EXE + ".ini"); ParserWebQueueParameters parserWebQueueParameters = new ParserWebQueueParameters(); EmailSenderConfig senderConfig = new EmailSenderConfig(); WebParserConfig parserConfig = new WebParserConfig(); int nElementsToProcess = 0; try { // Считывание настроек программы IniReader iniReader = new IniReader(iniFullPath); string testValue = iniReader.GetValue("test", "section", "10"); Console.WriteLine($"Read config file: {iniFullPath}"); // Program params nElementsToProcess = iniReader.GetIntValue("NumberElementsForProcessing", "Program", 0); // WebService parameters parserWebQueueParameters.WebServiceUrl = iniReader.GetValue("WebServiceUrl", "QueueWebService"); parserWebQueueParameters.Method = "Get"; parserWebQueueParameters.Timeout = iniReader.GetIntValue("Timeout", "QueueWebService", 20000); parserWebQueueParameters.ContentType = "application/json"; // Email parameters senderConfig.host = iniReader.GetValue("Host", "EmailSender"); senderConfig.port = iniReader.GetIntValue("Port", "EmailSender"); senderConfig.enableSsl = iniReader.GetBoolValue("EnableSsl", "EmailSender"); senderConfig.username = iniReader.GetValue("UserName", "EmailSender"); senderConfig.password = iniReader.GetValue("Password", "EmailSender"); senderConfig.usernameAlias = iniReader.GetValue("UserNameAlias", "EmailSender"); // Excel Addin Parser parserConfig.AddinConfigName = iniReader.GetValue("ParserConfigName", "ExcelAddinParser"); parserConfig.DealNumberColumn = iniReader.GetValue("DealNumberColumn", "ExcelAddinParser"); parserConfig.IsTrackColumn = iniReader.GetValue("IsTrackColumn", "ExcelAddinParser"); parserConfig.StartRowNumber = iniReader.GetIntValue("StartRowNumber", "ExcelAddinParser", 2); parserConfig.ResultNumberColumn = iniReader.GetValue("ResultNumberColumn", "ExcelAddinParser"); parserConfig.DealNumberHyperlinkColumn = iniReader.GetValue("DealNumberHyperlinkColumn", "ExcelAddinParser"); parserConfig.DocumentPdfFolderNameColumn = iniReader.GetValue("DocumentPdfFolderNameColumn", "ExcelAddinParser"); parserConfig.DocumentPdfUrlColumn = iniReader.GetValue("DocumentPdfUrlColumn", "ExcelAddinParser"); parserConfig.LastDealDateColumn = iniReader.GetValue("LastDealDateColumn", "ExcelAddinParser"); } catch (FileNotFoundException) { Console.WriteLine($"Can't find ini file at {iniFullPath}."); return(0); } catch (Exception ex) { Console.WriteLine($"Error readind ini file: {ex.GetType()}"); return(0); } while (nElementsToProcess-- > 0) { int cnt = processQueue(parserWebQueueParameters, senderConfig, parserConfig); if (cnt == 0) { break; } } Console.WriteLine("Work finished. Press any key."); //Console.ReadKey(); return(0); }
/// <summary> /// Обработка элемента очереди ParserQueue /// </summary> /// <returns>Кол-во обработанных элементов очереди</returns> public static int processQueue(ParserWebQueueParameters parserWebQueueParameters, EmailSenderConfig emailSenderConfig, WebParserConfig webParserConfig) { // Создание обработчика очереди IParserWebQueue parserWebQueue = new OnlineParserWebQueue(parserWebQueueParameters); ParserQueueElement elt = null; try { // Получение элемента очереди elt = parserWebQueue.GetNewElement(); if (elt == null) { Console.WriteLine("No new elements to process."); return(0); } // Пометка статусом "Взят в обработку" parserWebQueue.SetQueueElementStatus(elt.ParserQueueId, 2); // Запустить web-parser Console.WriteLine("Start parsing website for Document Number: {0}", elt.ClientDocNum); WebParserResult parserResult = ParseDocument(webParserConfig, elt.ClientDocNum); Console.WriteLine("parser result: {0}. Last date: {1}, pdf link: {2}", parserResult.ParserStatus, parserResult.LastDealDate, parserResult.CardUrl); if (parserResult.ParserStatus != "Ok") { Console.WriteLine("Error: {0}", parserResult.ParserError); } // Отправка Email string fileName = parserResult.DocumentPfdPath; string emailTo = elt.ClientEmail; string docNumber = elt.ClientDocNum; DateTime requestDate = elt.CreatedTimeUtc; sendEmailByNewInterface(emailSenderConfig, fileName, emailTo, docNumber, requestDate, parserResult); printParserQueueElement(elt); // Пометка элемента очереди как успешно обработанный parserWebQueue.SetQueueElementStatus(elt.ParserQueueId, 3); return(1); } catch (Exception exc) { Console.WriteLine("Error: {0}", exc.Message); // Установить статус "Ошибка обработки" if (elt != null) { parserWebQueue.SetQueueElementStatus(elt.ParserQueueId, 4, exc.Message); } } return(0); }