Delphi - [решено] перекинуть данные из Excel в прогу на Delphi

Аватара пользователя
anatoly_neo

Delphi - [решено] перекинуть данные из Excel в прогу на Delphi

Сообщение anatoly_neo »

Привет всем.

Помогите решить задачку. Есть файл эксель, содержит в себе данные в трёх столбцах (пример приложен) и примерно 25 строчках, на одном листе. Надо из него подгрузить эти данные в программу на Delphi в модуль StringGrid.

На скрине зафиксировал то чего уже удалось добиться в графическом виде, с кодом пока значительно сложнее, посему и прошу вашей помощи. Хотелось бы чтобы поподробнее объяснили, что к чему, зачем и почему.

Спасибо.



PS: хотелось бы сразу добавить небольшое усложнение задачи, сделать так чтобы программа в зависимости от времени суток выводила только нужные строки. То есть, в первом столбце таблицы Excel у нас будет время (в формате HH:MM), вот надо чтобы прога выводила например строки с временем с 9:00 до 15:00 именно в это время суток, следующую часть строк (с 15:00 до 21:00) она уже выводила именно с 15 до 21 часа.
Вложения

[Расширение jpg было запрещено, вложение больше недоступно.]

Аватара пользователя
anatoly_neo

Re: Delphi - [решено] перекинуть данные из Excel в прогу на Delphi

Сообщение anatoly_neo »

anatoly_neo, Здравствуйте! Вытащить данные из Excel можно следующим образом :





Код:

Код: Выделить всё

excel : Variant; // Объявляем переменную
...............
excel := CreateOleObject('Excel.Application');
excel.Workbooks.Open("excelfile.xls"); //Открываем файл excel
RowsCount := excel.ActiveSheet.UsedRange.Rows.Count; //Получаем количество использованных строк*
for i := 0 to RowsCount
begin
// выполняем операции со строками**
end
excel.ActiveWorkbook.Close;//закрываем файл excel
excel.Application.Quit;//"закрываем" excel приложение

* - Строки могут быть пустыми, но если они отформатированы, то будут считаться использованными, по вашему примеру их будет 18!



** - Обращаться к ячейкам так :



Код:

Код: Выделить всё

excel.Cells[i,j].Value

где i - строка, j - столбец




Цитата anatoly_neo:



хотелось бы сразу добавить небольшое усложнение задачи
Delphi - [решено] перекинуть данные из Excel в прогу на Delphi




Сначала тащите из excel ячейку с датой, выполняйте все операции необходимые для проверки, проверяйте, и если true выводите!



P.S.

не забыть добавить





Код:

Код: Выделить всё

uses ComObj
Аватара пользователя
anatoly_neo

Re: Delphi - [решено] перекинуть данные из Excel в прогу на Delphi

Сообщение anatoly_neo »

фух, слава богу не надо по времени вывод данных делать. за сим считаю проблему решённой. огромное спасибо LilLoco. Изображение))
Аватара пользователя
LilLoco

Re: Delphi - [решено] перекинуть данные из Excel в прогу на Delphi

Сообщение LilLoco »

Цитата anatoly_neo:



как прочитать оттуда ячейки и закинуть их в StringGrid
Delphi - [решено] перекинуть данные из Excel в прогу на Delphi




Циклом пройтись по документу!

Например по представленному вами файлу Excel :



Код:

Код: Выделить всё

for i := 2 to 4 do
begin
sg.cells[i - 1, 0] := excel.cells[i, 1].Value; // время
sg.cells[i - 1, 1] := excel.cells[i, 2].Value; // фио
sg.cells[i - 1, 2] := excel.cells[i, 3].Value; // номер

где sg - StringGrid



если количество строк неизвестно заранее то



Код:

Код: Выделить всё

RowsCount := excel.ActiveSheet.UsedRange.Rows.Count;
Аватара пользователя
anatoly_neo

Re: Delphi - [решено] перекинуть данные из Excel в прогу на Delphi

Сообщение anatoly_neo »

как открыть файлик вроде разобрался, но вот как прочитать оттуда ячейки и закинуть их в StringGrid так и не могу пока понять, подмогните плиз Изображение
Аватара пользователя
LilLoco

Re: Delphi - [решено] перекинуть данные из Excel в прогу на Delphi

Сообщение LilLoco »

В коде у меня тоже подчеркивается красным, и та же ситуация Undeclarated identifier 'Value', но при этом все компилируется и работает отлично! Что делает строка



Код:

Код: Выделить всё

n := OpenFile();

?

И где инициирование переменной excel?

Delphi - [решено] перекинуть данные из Excel в прогу на Delphi
было все довольно конкретно описано!
Аватара пользователя
anatoly_neo

Re: Delphi - [решено] перекинуть данные из Excel в прогу на Delphi

Сообщение anatoly_neo »

LilLoco,

вопрос в догонку так сказать для собственного просвещения.


Цитата LilLoco:



любая_прога := CreateOleObject('название этой проги')
Delphi - [решено] перекинуть данные из Excel в прогу на Delphi




Создает объектную переменную размером с саму программу? Изображение



и если создает то внутри кого VBA или Delphi (в применительно к условиям anatoly neo )
Аватара пользователя
LilLoco

Re: Delphi - [решено] перекинуть данные из Excel в прогу на Delphi

Сообщение LilLoco »

n := OpenFile(); - это у меня была функция сделана для открытия файла...

переделал как вы писали выше, вроде и правда заработало.



получилось как то вот так:





Код:

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
var excel : variant;
i, j, RowsCount: integer;
begin
Form1.OpenDialog1.Execute();
excel := CreateOleObject('excel.application');
excel.workbooks.open[Form1.OpenDialog1.FileName];
RowsCount := excel.ActiveSheet.UsedRange.Rows.Count;
excel.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate;
  for i := 1 to RowsCount do
    begin
      sg1.cells[i - 1, 0] := excel.cells[2, i].Value; // время
      sg1.cells[i - 1, 1] := excel.cells[3, i].Value; // фио
      sg1.cells[i - 1, 2] := excel.cells[4, i].Value; // номер
    end;
  excel.activeworkbook.close;
  excel.application.quit;
end;

осталось только допилить код чтобы он все данные без явного указания ячеек расставлял (я про такие строки sg1.cells[i - 1, 0] := excel.cells[2, i].Value; ) ...

будем думать и химичить, если не дойдёт как наверно ещё обращусь Изображение





PS: только одного не понял, вроде бы в sg1.cells[i , j] , i - это столбец, а j - это строка... но по вашему примеру он мне строки в столбцы выводил, а так как написано у меня, он выводит строки в строчку, как мне и хотелось... в чём же загадка?
Аватара пользователя
Хоф

Re: Delphi - [решено] перекинуть данные из Excel в прогу на Delphi

Сообщение Хоф »

Цитата anatoly_neo:



вроде бы в sg1.cells[i , j] , i - это столбец, а j - это строка...
Delphi - [решено] перекинуть данные из Excel в прогу на Delphi




Да, моя ошибка Изображение извиняюсь, сначала идет столбец, а потом строка! У меня же в примере, наоборот Изображение




Цитата Хоф:



Создает объектную переменную размером с саму программу?
Delphi - [решено] перекинуть данные из Excel в прогу на Delphi




Вы знаете, я затрудняюсь ответить на этот вопрос, так как не сильно разбирался когда нужно было это реализовать!

ИМХО, создается просто ссылка на объект, так как сам excel во время работы запускается в фоновом режиме, это можно отследить в процессах, а по окончании работы с документом из программы Delphi, он выгружается из памяти! Не думаю, что в программе под эту переменную выделяется много памяти!
Аватара пользователя
anatoly_neo

Re: Delphi - [решено] перекинуть данные из Excel в прогу на Delphi

Сообщение anatoly_neo »

n := OpenFile(); - это у меня была функция сделана для открытия файла...

переделал как вы писали выше, вроде и правда заработало.



получилось как то вот так:





Код:

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
var excel : variant;
i, j, RowsCount: integer;
begin
Form1.OpenDialog1.Execute();
excel := CreateOleObject('excel.application');
excel.workbooks.open[Form1.OpenDialog1.FileName];
RowsCount := excel.ActiveSheet.UsedRange.Rows.Count;
excel.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate;
  for i := 1 to RowsCount do
    begin
      sg1.cells[i - 1, 0] := excel.cells[2, i].Value; // время
      sg1.cells[i - 1, 1] := excel.cells[3, i].Value; // фио
      sg1.cells[i - 1, 2] := excel.cells[4, i].Value; // номер
    end;
  excel.activeworkbook.close;
  excel.application.quit;
end;

осталось только допилить код чтобы он все данные без явного указания ячеек расставлял (я про такие строки sg1.cells[i - 1, 0] := excel.cells[2, i].Value; ) ...

будем думать и химичить, если не дойдёт как наверно ещё обращусь Изображение





PS: только одного не понял, вроде бы в sg1.cells[i , j] , i - это столбец, а j - это строка... но по вашему примеру он мне строки в столбцы выводил, а так как написано у меня, он выводит строки в строчку, как мне и хотелось... в чём же загадка?
Ответить

Вернуться в «Программирование и базы данных»