Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2017, 08:25   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос Взаимодейтствие с Excel из Delphi

Добрый день!
Остался один вопрос, который я пока не могу решить.
Алгоритм такой:
1. Имеем список XLS файлов, откуда берем в цикле файл XLS и читаем из конкретных ячеек данные и заносим во временные строковые переменные (это я сделал);
2. Открываем в самом начале файл шаблона XLS файла (это я сделал);
3. Затем добавляем значения в шаблон файла и затем сохраняем его (с этим нужна помощь).
Я сделал такой код:
Код:
...
  //заполняться будет со второй строки, т.к. первая - шапка в шаблоне Excel 
  row:=1;

  //Открываю заранее шаблон файла
  SIT:=CreateOleObject('Excel.Application');
  SIT.Workbooks.Open[ExtractFilePath(Application.ExeName) + 'СИТ.xls'];
  SIT.ActiveWorkBook.Sheets.Item[1].Activate;

  //в цикле открываю последовательно нужные файлы (цикл рабочий, проверял)
  for i := 0 to Form_Main.LB_Files.Items.Count - 1 do
    begin
     Excel:=CreateOleObject('Excel.Application');
     Excel.Workbooks.Open[Form_Main.L_Path.Caption +
                                                   Form_Main.LB_Files.Items[i]];
     Excel.DisplayAlerts:=False;
     Excel.Visible:=False;
     Excel.Application.EnableEvents:=False;
     Excel.ScreenUpdating:=False;

     Excel.ActiveWorkBook.Sheets.Item[3].Activate;
       Cell_C4:=Excel.Range['C4'];
       Cell_C6:=Excel.Range['C6'];
     Application.ProcessMessages;

     Excel.ActiveWorkBook.Sheets.Item[1].Activate;
       Cell_B50:=Excel.Range['B50'];
       Cell_B53:=Excel.Range['B53'];
       Cell_F50:=Excel.Range['F50'];
       Cell_F51:=Excel.Range['F51'];
     Application.ProcessMessages;
     Excel.ActiveWorkbook.Close;
     Excel.Application.Quit;

      //вот тут я добавляю (пытаюсь) значения в ячейки шаблона файла
      SIT.Cells[row + 1,1]:='''' + IntToStr(row);
      SIT.Cells[row + 1,2]:='''' + Cell_C4;
      SIT.Cells[row + 1,3]:='''' + Cell_C6;
      SIT.Cells[row + 1,4]:='''' + Cell_B50;
      SIT.Cells[row + 1,5]:='''' + Cell_B53;
      SIT.Cells[row + 1,6]:='''' + Cell_F50;
      SIT.Cells[row + 1,7]:='''' + Cell_F51;
     Application.ProcessMessages;

    end;

  SIT.Columns.AutoFit;
....
Ну, а далее там закрытие Excel файла, удаление из памяти и т.п.
Проблема в том, что у меня в итоговый файл, добавляется только значения из последнего в списке файла, а мне нужно, чтобы в цикле каждый раз взятые значения последовательно добавлялись в шаблон. С этим прошу помочь. Это все, что мне осталось доделать.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 27.11.2017, 08:59   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А в шаблоне как - для каждого файла свои ячейки или конкатенация из нескольких файлов в одну ячейку ? В твоем коде все в одно место - последующее затирает предыдущее
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.11.2017, 09:03   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А в шаблоне как - для каждого файла свои ячейки или конкатенация из нескольких файлов в одну ячейку ? В твоем коде все в одно место - последующее затирает предыдущее
Поясню на примере одного из файла, который в списке.
Каждый такой файл имеет четкую структуру. Нужные данные хранятся в известных ячейках на разных листах, с которых эти данные "дергаются" и в итоге расставляются в соответствующие ячейки определенных столбцов файла-шаблона.
Причем каждая новая строка в файле-шаблоне - это полученные данные из файлов в списке.
Все. Да, проблема в том, что все данные лепятся в одну строку, затирая. Вот, с этим и прошу помощи. Все остальное сделал уже
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 27.11.2017, 09:11   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Дык не знаю как в шаблоне данные размещать нужно. Если подготовлены строки заранее, то явно индекс строки увеличивать, row тот. Если нет, то вставить новую строчку нужно, что-то вроде SIT.Cells.Rows[индекс].Insert
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.11.2017, 09:15   #5
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Дык не знаю как в шаблоне данные размещать нужно. Если подготовлены строки заранее, то явно индекс строки увеличивать, row тот. Если нет, то вставить новую строчку нужно, что-то вроде SIT.Cells.Rows[индекс].Insert
В шаблоне 7 столбцов. Я же сказал, что данные берутся из файлов и в виде строки заносятся в шаблон. Что непонятного-то...Я предполагаю, что загвоздка здесь у меня:
Код:
//вот тут я добавляю (пытаюсь) значения в ячейки шаблона файла
      SIT.Cells[row + 1,1]:='''' + IntToStr(row);
      SIT.Cells[row + 1,2]:='''' + Cell_C4;
      SIT.Cells[row + 1,3]:='''' + Cell_C6;
      SIT.Cells[row + 1,4]:='''' + Cell_B50;
      SIT.Cells[row + 1,5]:='''' + Cell_B53;
      SIT.Cells[row + 1,6]:='''' + Cell_F50;
      SIT.Cells[row + 1,7]:='''' + Cell_F51;
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 27.11.2017, 09:19   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
Я предполагаю, что загвоздка здесь у меня:
нет.

загвоздка в
Цитата:
Сообщение от Аватар Посмотреть сообщение
то явно индекс строки увеличивать, row тот.
Где у Вас в цикле
Код:
Inc(row)
?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.11.2017, 09:21   #7
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
нет.

загвоздка в

Где у Вас в цикле
Код:
Inc(row)
?
Сергей, привет!
А куда его пихнуть? После занесения в файл-шаблон?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 27.11.2017, 09:25   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Или до, или после. Зависит от начального значения row )) Посмотри что получится для того и другого. И '''' + не понятно для чего

ps ой, вспомнил для чего кавычка ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 27.11.2017 в 09:31.
Аватар вне форума Ответить с цитированием
Старый 27.11.2017, 09:29   #9
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Или до, или после. Зависит от начального значения row )) Посмотри что получится для того и другого
Ну, логичнее же поставить так?)
Код:
//вот тут я добавляю (пытаюсь) значения в ячейки шаблона файла
      SIT.Cells[row + 1,1]:='''' + IntToStr(row);
      SIT.Cells[row + 1,2]:='''' + Cell_C4;
      SIT.Cells[row + 1,3]:='''' + Cell_C6;
      SIT.Cells[row + 1,4]:='''' + Cell_B50;
      SIT.Cells[row + 1,5]:='''' + Cell_B53;
      SIT.Cells[row + 1,6]:='''' + Cell_F50;
      SIT.Cells[row + 1,7]:='''' + Cell_F51;
     Application.ProcessMessages;

   Inc(row);
Перед запуском цикла обработки файлов начальное значение row=1, т.к. в шаблоне 1 строка - это заголовок, а заполнение начинается со второй строки, поэтому в моем коде:
Код:
 SIT.Cells[row + 1,1]
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 27.11.2017 в 09:32.
artemavd вне форума Ответить с цитированием
Старый 27.11.2017, 09:32   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Логично
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi и Excel SPD Общие вопросы Delphi 2 18.01.2012 16:51
Excel Delphi MAZADA Общие вопросы Delphi 3 07.11.2010 17:27
Delphi Excel (сохранение записи в Excel) Кас Алина Общие вопросы Delphi 4 28.05.2010 09:17
как при импорте из Excel в delphi узнать сколько заполненных строк в книге Excel?чтобы организовать цикл betirsolt БД в Delphi 1 17.01.2010 18:51
Delphi ->Excel->График по таблице->Delphi Avalonix БД в Delphi 2 30.10.2008 14:04