Удаление строк из Excel

soprano

Client
Регистрация
25.08.2011
Сообщения
823
Благодарностей
883
Баллы
93
Есть код
C#:
    var package = new ExcelPackage(new FileInfo(project.Directory+ "/data.xlsx"));
    ExcelWorksheet Table = package.Workbook.Worksheets[1];

    .............................................
    

    for (int i = Table.Dimension.Rows - 1; i <= 1; i--)
{
  Table.DeleteRow(i);
  package.Save();
}
В таблице 2 столбца, в одном логин, в другом пароль,
должно последовательно браться, вставляться в поля, затем строка с логином и паролем удаляться.
Но почему-то берется всегда только последняя строка (логин и пароль).
И ничего не удаляется. Подскажите, как сделать правильно.
 

TwistDanceR

Активный пользователь
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Есть код
C#:
    var package = new ExcelPackage(new FileInfo(project.Directory+ "/data.xlsx"));
    ExcelWorksheet Table = package.Workbook.Worksheets[1];

    .............................................
 

    for (int i = Table.Dimension.Rows - 1; i <= 1; i--)
{
  Table.DeleteRow(i);
  package.Save();
}
В таблице 2 столбца, в одном логин, в другом пароль,
должно последовательно браться, вставляться в поля, затем строка с логином и паролем удаляться.
Но почему-то берется всегда только последняя строка (логин и пароль).
И ничего не удаляется. Подскажите, как сделать правильно.
У тебя цикл начинается с последнего айтема таблицы:
чтобы с первого надо - for(int i = 0; i<=Table.Dimemsion.Rows - 1; i++).

Насчет удаления - удалять надо не i-тый айтем, а нулевой (первый). Количество строк то уменьшается все время.
 

Metrix

Client
Регистрация
03.01.2014
Сообщения
343
Благодарностей
272
Баллы
63
Нужно условие развернуть в обратную сторону, с конца тут цикл не просто так, если с удалением, так делать корректнее.
 

soprano

Client
Регистрация
25.08.2011
Сообщения
823
Благодарностей
883
Баллы
93
То есть вот так надо
C#:
    for ( int i = 0; i <= Table.Dimension.Rows - 1; i++)
    {
      Table.DeleteRow(0);
      package.Save();
    }
Тогда пишет ошибку
Код:
Выполнение действия CSharp OwnCode: test table. id: 4d95be45-e194-4904-9936-998192817021 группы действий id: 5790f6fd-56cb-4c37-9eca-9e7f40c09bde Row out of range. Spans from 1 to 1048576
Сбойное действие: test table id: 4d95be45-e194-4904-9936-998192817021 группы действий id:
Перерываю весь форум на 2-х языках, но конкретно как последовательно удалять строки из Excel после взятия - ничего нет.
 

Metrix

Client
Регистрация
03.01.2014
Сообщения
343
Благодарностей
272
Баллы
63

soprano

Client
Регистрация
25.08.2011
Сообщения
823
Благодарностей
883
Баллы
93
Все равно та же ошибка - Row out of range. Spans from 1 to 1048576. Вот весь код:
C#:
Tab Active = instance.ActiveTab;
int a = 0;
string LoginMail = string.Empty;
string Pass = string.Empty;
string TempStr = string.Empty;

List<string> MailList = new List<string>();
List<string> PassList = new List<string>();

    var package = new ExcelPackage(new FileInfo(project.Directory+ "/data.xlsx"));
    ExcelWorksheet Table = package.Workbook.Worksheets[1];

for (a = 1; a <= Table.Dimension.Rows; a++)
{
    LoginMail = Convert.ToString(Table.GetValue(a, 1));
    if (LoginMail == string.Empty) continue;
    MailList.Add(LoginMail);
}

for (a = 1; a <= Table.Dimension.Rows; a++)
{
    Pass = Convert.ToString(Table.GetValue(a, 2));
    if (Pass == string.Empty) continue;
    PassList.Add(Pass);
}
  
    Active.Navigate("http://site/form/");
    Active.WaitDownloading();


    // email
    Active.FindElementByXPath("//input[@name='email']", 0).SetValue(LoginMail, "Full");
    // email
    
    // pass
    Active.FindElementByXPath("//input[@name='pass']", 0).SetValue(Pass, "Full");
    // pass

for (int i = Table.Dimension.Rows - 1; i >= 1; i--)
{
  Table.DeleteRow(0);
  package.Save();
}
В файле data.xlsx 2 столбца - в первом email, во втором - pass

Как сделать правильно? Очень прошу помочь.
 

Manfred

Client
Регистрация
06.08.2019
Сообщения
37
Благодарностей
17
Баллы
8
C#:
for (int z = Table.Dimension.Rows; z >= 1;z--)
{
  Table.DeleteRow(z);     
}
package.Save();
 

soprano

Client
Регистрация
25.08.2011
Сообщения
823
Благодарностей
883
Баллы
93
C#:
for (int z = Table.Dimension.Rows; z >= 1;z--)
{
  Table.DeleteRow(z); 
}
package.Save();
Выполняется ок, но таблица полностью очищается, т.е. после взятия одного значения удалились все.
Ставлю так
C#:
for (int z = Table.Dimension.Rows-1; z >= 1;z--)
{
  Table.DeleteRow(z);  
}
package.Save();
Сохраняется то, которое вводится, а остальное удаляется.
 

Manfred

Client
Регистрация
06.08.2019
Сообщения
37
Благодарностей
17
Баллы
8
А зачем тебе их вообще удалять по одной из экселя? Что это дает?

Я бы делал так:

В экселе 4 столбца:
  • логин
  • пароль
  • статус
  • токен

Идем в цикле по экселю:
Берем строку.
Из строки получаем логин и пароль.
Ставим статус: В работе. ( в 4 столбец записываем)

Пробуем получить токен на сайте применив логин и пароль.
Если получилось, то сохранили в столбец статус что Токен получен и в столбец Токен значение токена.
Если не получилось, то прописали в статус какая проблема возникла.

В итоге у тебя в экселе будет типа таког:

[email protected] 123456 Токен получен GF454593489FA
 
  • Спасибо
Реакции: soprano

soprano

Client
Регистрация
25.08.2011
Сообщения
823
Благодарностей
883
Баллы
93
Хорошо, пусть без удаления. А как сделать, чтобы каждый раз брало разные данные,
т.е. 1-ю строку, закончило, 2-ю и т.д.
В 1 поток.
 

Manfred

Client
Регистрация
06.08.2019
Сообщения
37
Благодарностей
17
Баллы
8
C#:
Tab Active = instance.ActiveTab; // активная вкладка
var package = new ExcelPackage(new FileInfo(project.Directory+ "/data.xlsx"));
    ExcelWorksheet Table = package.Workbook.Worksheets[1];
   
string LoginMail = string.Empty;
string Pass = string.Empty;
int a = 0; // счетчик для разных целей

try
{
    for (a = 1; a <= Table.Dimension.Rows; a++)
    {
        LoginMail = Convert.ToString(Table.GetValue(a, 1));      
        if (LoginMail.Trim()=="")
        {
          throw new Exception("Логин не найден");
        }
       
        Pass = Convert.ToString(Table.GetValue(a, 2));  
        if (Pass.Trim()=="")
        {
          throw new Exception("Пароль не найден");
        }
       
        // здесь что-то делаем регаемся, получаем токен


        Table.SetValue(a, 3,"статус");// сохраняем статус  
        Table.SetValue(a, 4,"токен");// сохраняем токен          
    }
}
finally
{
  package.Save();
}
 
Последнее редактирование:
  • Спасибо
Реакции: soprano

soprano

Client
Регистрация
25.08.2011
Сообщения
823
Благодарностей
883
Баллы
93
Что-то все равно не получается. Все время из таблицы берется последнее значение. При каждом цикле.
Может кто знает, как после каждого завершения проекта удалять последнюю строку в таблице?
Вот работает такой код с удалением
C#:
IZennoTable table = project.Tables["Table"];
string str = project.Variables["login"].Value;
string row;
for (int i = 0; i < table.RowCount; i++) {
    row = string.Join("", table.GetRow(i));
    if (row.Contains(str)) {
        table.DeleteRow(i); i--; // раскомментировать, если строку нужно брать с удалением
        return i;
    }
}
НО!! он берет последнюю строку логина и пароля, а удаляет первую.
Как сделать, чтобы удалялась та же строка, что и берется. Не важно с какого конца таблицы.
 
Последнее редактирование:

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
C#:
IZennoTable table = project.Tables["Table"];
string str = project.Variables["login"].Value;
string row;
for (int i = table.RowCount - 1; i >= 0; i--) {
    row = string.Join("", table.GetRow(i));
    if (row.Contains(str)) {
        table.DeleteRow(i);
        return row;
    }
}
 
  • Спасибо
Реакции: soprano

soprano

Client
Регистрация
25.08.2011
Сообщения
823
Благодарностей
883
Баллы
93
Это работает!!! Спасибо!
 
  • Спасибо
Реакции: SergSh

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