Работа с таблицами

  • Автор темы Автор темы Bullet
  • Дата начала Дата начала

Bullet

Client
Регистрация
16.12.2015
Сообщения
185
Реакции
19
Баллы
18
Всем привет!

Обрабатываю таблицу с более чем 20 полями. Таблицу, для удобства, загнал в Excel.
Как бы вытягивать значения в переменные, не прибегая к именам столбцов (A,B,C). Это крайне неудобно при большом количестве полей и если таблица "живая" и развивается - добавляются новые поля. В этом случае, их приходится добавлять только в конец, чтобы не сбить считывание переменных. При этом, логичнее некоторые поля по таблице переместить.
Можно ли как то обращаться по заголовку таблицы?
 
Предполагаю, что выход может быть таким:
1. Вводим переменные, по количеству столбцов таблицы (field_var1, field_var2..)
2. Рисуем матрицу - количество столбцов на количество переменных
3. По очереди читаем значение строки 0 по столбцам A,B,C.. и определяем экшенами if, в каком столбце лежат значения конкретной переменной
4. При нахождении нужного значения, в новые переменные пишем значение буквы столбца
5. Присваиваем основным переменным значения через экшен "Прочитать ячейку", в поле "Столбец" ставим нужную переменную field_var..

Невероятно криво и невероятно громоздко, но более элегантное решение пока в голову не лезет.
Для чего есть галка в настройках таблицы "Первая строка - заголовки", вроде бы, логичный ответ - чтобы по заголовкам обращаться к элементам.. И даже обращение по номеру столбца, а не по букве был бы значительно удобнее.

Буду завтра снова ломать мозг, если у кого то есть решение - поделитесь плс.
 
Можно через код читать ячейки первой строки, получать их заголовки и потом уже отправлять нужные данные в нужные переменные.

Опция "Первая строка - заголовки" предназначена для того, чтобы в рабочей таблице не удалялись заголовки. Чтобы программа просто пропускала эту строку и работала с остальными.
 
Вот такая тестовая таблица.




Дальше пишем код
Код:
Развернуть Свернуть Копировать
var table = project.Tables["cities"];

var names = table.GetRow(0).ToList();
table.DeleteRow(0);

var row = table.GetRow(5).ToList();

for( var i = 0; i < names.Count; i++)
{
    var name = names[i];
    var value = row[i];
  
    if(!project.Variables.Keys.Contains(name))
    {
        //хрен добавишь переменную через код
        //throw(new Exception("Не найдена переменная соотвествующая названию колонки " + name));
        project.SendErrorToLog("Не найдена переменная соотвествующая названию колонки "+ name);
        continue;
    }
  
    project.Variables[name].Value = value;
    project.SendInfoToLog(string.Format("{0} = {1}", name, value), false);
}

Что делаем, читам первую строчку, это будут заголовки.
Удаляем ее, она больше не нужна.

Дальше берем какую то строку, которая нам нужна.
Теперь в цикле проходим по именам, и проверяем, есть ли переменная с таким именем.
Если нет, то или мессага в лог или throw, чтобы шаб остановился.
Как оказалось переменную через код добавить нельзя.))

Ну а дальше получается индекс имени столбца и значения в таблице совпадают.
Поэтому по индексу берем значение из row и кладем в соответствующую переменную.

Имена столбцов в таблице должны совпадать с именами переменных.
Добавил спец. только две переменных, чтобы видно было как отрабатывает код, когда не находит переменную.
 

Вложения

  • test.zip
    test.zip
    17,5 KB · Просмотры: 212
Подскажите пожалуйста что делаю не так. В таблице эксель в ячейке пишу 20:25, экшеном беру в переменную, но в переменную падает значение вот такое 30.12.1899 20:25:00
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)