Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 03.11.2016
Сообщений: 7

Формирование тела письма из данных определенной строки таблицы

07.08.2019, 09:53. Показов 2007. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!

Сразу говорю, пользуюсь Zennoposter и код пишется под него (не реклама, просто есть некоторые отличия от обычного кода).
Делаю парсер с последующей отправкой полученных данных по e-mail.
Весь смысл в том, чтобы сравнить данные в списке (новые данные), с данными в таблице. Если данные списка присутствуют в таблице, то берем все ячейки каждой строки и записываем их в столбик, чтобы тело письма выглядело так:

Из первой строки:
Значение 1 - значение из первой ячейки
Значение 2 - значение из второй ячейки
Значение 3 - значение из третьей ячейки и т.д.
----------------------------------------------- (разделитель)
Из второй строки:
Значение 1 - значение из первой ячейки
Значение 2 - значение из второй ячейки
Значение 3 - значение из третьей ячейки и т.д.
-------------------------------------------------------- и т.д.

КОД ПАРСЕРА

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
lock(SyncObjects.TableSyncer) {
Tab Tab1 = instance.ActiveTab;  // переменная активной вкладки браузера
var ids_parsedList  = project.Lists["ids_parsed"]; //переменная спаршенных ссылок
IZennoTable tblMyData = project.Tables["MyData"]; // переменная таблицы проекта
 
//Объявляем коллекцию элементов и находим все нужные строки
HtmlElementCollection colRows = Tab1.FindElementsByXPath("//table[@class='es-reestr-tbl its']");
 
//перебираем каждую строку
foreach(HtmlElement elRow in colRows){
    //получаем данные нужного элемента конкретной строки
    string strCellOne = elRow.FindChildByXPath(".//span[@class='es-el-name']", 0).GetAttribute("innerHtml"); 
 
// ищем определенные слова в атрибуте нужного элемента
    if ((strCellOne.Contains("СЛОВО 1") || strCellOne.Contains("СЛОВО 2")) && (strCellOne.Contains("СЛОВО 3") || strCellOne.Contains("СЛОВО 4") || strCellOne.Contains("СЛОВО 5") || strCellOne.Contains("СЛОВО 6") || strCellOne.Contains("СЛОВО 7") || strCellOne.Contains("СЛОВО 8") || strCellOne.Contains("СЛОВО 9"))) 
{
        //Если нужные слова присутствуют в элементе строки, забираем данные из второй ячейки и по аналогии из остальных ячеек этой строки
        string strCellTwo = elRow.FindChildByXPath(".//input[@content='leaf:objectHrefTerm']", 0).GetAttribute("value");
        string strCellThree = elRow.FindChildByXPath(".//input[@content='leaf:objectHrefTerm']", 0).GetAttribute("value");
        string strCellFour = elRow.FindChildByXPath(".//span[@format='money']", 0).GetAttribute("innerHtml");
    // Записываем данные в таблицу
        tblMyData.AddRow(new String[]{strCellTwo, strCellOne, strCellFour});
        //записываем данные в список
        ids_parsedList.Add(strCellTwo);
ДАЛЕЕ ИДЕТ КОД ПОИСКА СТРОК, КОТОРЫЕ НЕБЫЛИ РАНЕЕ НАЙДЕНЫ И ОТПРАВЛЕНЫ ПО ПОЧТЕ

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
var ids_oldList     = project.Lists["ids_old"]; // переменная списка со старыми ссылками
var ids_parsedList  = project.Lists["ids_parsed"]; // переменная со спаршенными ссылками
var ids_new         = project.Lists["ids_new"]; // переменная 
var tblMyData = project.Tables["MyData"];
 
var mailBody = "";
var sendMail = false;
 
lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < ids_parsedList.Count; i++)
    {
        var newID = ids_parsedList[i]; // переменная в которую записываются все спарсенные ссылки
 
        var isIdNew = true;
        for(int j=0; j < ids_oldList.Count; j++)
        {
            var oldID = ids_oldList[j]; // переменная в которую записываются все старые ссылки
            if (oldID == newID){   // сравнение ссылок в переменных
                isIdNew = false;  
                break;
            }
        }
        
        if(isIdNew){
            ids_new.Add(newID); // если есть новые ссылки то добавляем их в список ids_new
 
 for(int k=0; k < tblMyData.RowCount; k++)
    {
        // читаем строку из таблицы (это будет массив ячеек)
        var cells = tblMyData.GetRow(k).ToArray();
        // пройдем в цикле по всем ячейкам
        for (int m=0; m < cells.Length; m++)
        {
            
// ВОТ ТУТ У МЕНЯ ПРОБЛЕМА!! Я НЕ МОГУ ПОНЯТЬ КАК СФОРМИРОВАТЬ ТЕЛО ПИСЬМА, ЧТОБЫ БРАЛАСЬ КАЖДАЯ ЯЧЕЙКА И 
// ЗАПИСЫВАЛАСЬ В ОТДЕЛЬНУЮ СТРОКУ, КАК Я НАПИСАЛ ВЫШЕ.
// СЕЙЧАС МНЕ ПРИХОДИТ ТАКОЕ ПИСЬМО
// System.String[]
//System.String[]
//System.String[]
//System.String[]
//System.String[]
//System.String[]
//System.String[]
//System.String[]
 
// проверяем содержание текста переменной newID в ячейке, если есть совпадения формируем тело письма
            if (cells[m].Contains(newID)) mailBody = mailBody + cells + Environment.NewLine;
                sendMail = true;
        }
            if(sendMail) project.Variables["mailBody"].Value = mailBody;
    }
 
}
    }
}
 
// далее идет код формирования и отправки письма, где текст письма берется из переменной mailBody
PS: Если работать через список и брать одно значение то все получается идеально, но мне нужно несколько значений.

И еще- не знаю как правильно добавить lock(SyncObjects.TableSyncer), чтобы все работало корректно.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.08.2019, 09:53
Ответы с готовыми решениями:

Формирование тела письма
Задача такая , формируется тело письма на php, в этом же файле в тегах script берем контент которые надо вставить в текст письма var...

Импорт таблицы html из тела письма Outlook
Привет всем! Возник немного нестандартный вопрос по использованию VBA outlook. Вопрос мягко говоря увеличенной сложности. В большей...

Как получить значение определённой ячейки из последней строки таблицы Базы данных
Есть таблица в базе данных Access, допустим &quot;Табл&quot;, в таблице столбец &quot;Код&quot;. Подскажите как получить значение &quot;Код&quot; последней...

5
 Аватар для Immo
692 / 509 / 238
Регистрация: 02.10.2012
Сообщений: 1,741
07.08.2019, 09:56
Цитата Сообщение от idleS Посмотреть сообщение
PS: Если работать через список и брать одно значение то все получается идеально, но мне нужно несколько значений.
вы же можете создать свою структуру/класс и помещать их в список
0
0 / 0 / 0
Регистрация: 03.11.2016
Сообщений: 7
07.08.2019, 10:35  [ТС]
Если бы я знал как это сделать, я бы не писал здесь.
0
 Аватар для Immo
692 / 509 / 238
Регистрация: 02.10.2012
Сообщений: 1,741
07.08.2019, 10:45
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct Values
{
    public string Value1;
    public string Value2;
    public string Value3;
    .....
    public string ValueN;
}
.....
List<Values> ValuesList = new List<Values>;
.....
Values valuesname;
valuesname.Value1 = somevalue;
.....
ValuesList.Add(valuesname);
0
0 / 0 / 0
Регистрация: 03.11.2016
Сообщений: 7
07.08.2019, 11:29  [ТС]
Цитата Сообщение от Immo Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct Values
{
    public string Value1;
    public string Value2;
    public string Value3;
    .....
    public string ValueN;
}
.....
List<Values> ValuesList = new List<Values>;
.....
Values valuesname;
valuesname.Value1 = somevalue;
.....
ValuesList.Add(valuesname);

Спасибо, но для меня это темный лес.
Я не понимаю где этот код применяется??
Для изначального сбора данных или уже для формирования тела письма?
Можно попросить закомментировать код??
0
07.08.2019, 11:32

Не по теме:

idleS, поставьте задачу фрилансерам, а сами занимайтесь своим делом :)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.08.2019, 11:32
Помогаю со студенческими работами здесь

Формирование отчета определенной формы с выбором определённой записи
Добрый вечер, знатоки ACCESS. Уже стандартно для новичка напишу фразу -только не материтесь и не кидайтесь тапками, а нормально...

Выбор определенной строки из таблицы
Я новичок в ADO.NET, и возможо это слишком глупый вопрос. Но как считать данные из определенной строки таблицы? У меня есть таблица ...

Поиск данных и формирование таблицы
Доброго времени суток, Дорогие Форумчане! Помогите пожалуйста с написанием небольшого, на мой взгляд, несложного кода.Пока никак не...

Вывод определенной строки из другой таблицы
Здравствуйте! Имеется два DBGrid привязанные к двум разным таблицам ОДНОЙ БД. Помогите додуматься как реализовать. В первом DBGrid...

Не работает удаление определенной строки таблицы
Доброго времени суток! есть таблица &lt;table id=&quot;table_route&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;th&gt;Направление&lt;/th&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru