![]() |
перекинуть данные из Excel в прогу на Delphi
Вложений: 2
Привет всем.
Помогите решить задачку. Есть файл эксель, содержит в себе данные в трёх столбцах (пример приложен) и примерно 25 строчках, на одном листе. Надо из него подгрузить эти данные в программу на Delphi в модуль StringGrid. На скрине зафиксировал то чего уже удалось добиться в графическом виде, с кодом пока значительно сложнее, посему и прошу вашей помощи. Хотелось бы чтобы поподробнее объяснили, что к чему, зачем и почему. Спасибо. PS: хотелось бы сразу добавить небольшое усложнение задачи, сделать так чтобы программа в зависимости от времени суток выводила только нужные строки. То есть, в первом столбце таблицы Excel у нас будет время (в формате HH:MM), вот надо чтобы прога выводила например строки с временем с 9:00 до 15:00 именно в это время суток, следующую часть строк (с 15:00 до 21:00) она уже выводила именно с 15 до 21 часа. |
anatoly_neo, Здравствуйте! Вытащить данные из Excel можно следующим образом :
Код:
excel : Variant; // Объявляем переменную ** - Обращаться к ячейкам так : Код:
excel.Cells[i,j].Value Цитата:
P.S. не забыть добавить Код:
uses ComObj |
как открыть файлик вроде разобрался, но вот как прочитать оттуда ячейки и закинуть их в StringGrid так и не могу пока понять, подмогните плиз :)
|
Цитата:
Например по представленному вами файлу Excel : Код:
for i := 2 to 4 do если количество строк неизвестно заранее то Код:
RowsCount := excel.ActiveSheet.UsedRange.Rows.Count; |
что-то не хочет работать такая вот комбинация:
procedure TForm1.Button1Click(Sender: TObject); var excel : variant; i, j, n: integer; begin n := OpenFile(); //Caption := ExtractFileName(Form1.OpenDialog1.FileName); for i := 1 to 3 do begin sg1.cells[i - 1, 0] := excel.cells[i, 1].Value; // время sg1.cells[i - 1, 1] := excel.cells[i, 2].Value; // фио sg1.cells[i - 1, 2] := excel.cells[i, 3].Value; // номер end; end; жалуется на "Undeclarated identifier 'Value' ".... |
В коде у меня тоже подчеркивается красным, и та же ситуация Undeclarated identifier 'Value', но при этом все компилируется и работает отлично! Что делает строка
Код:
n := OpenFile(); И где инициирование переменной excel? Тут было все довольно конкретно описано! |
LilLoco,
вопрос в догонку так сказать для собственного просвещения. Цитата:
и если создает то внутри кого VBA или Delphi (в применительно к условиям anatoly neo ) |
n := OpenFile(); - это у меня была функция сделана для открытия файла...
переделал как вы писали выше, вроде и правда заработало. получилось как то вот так: Код:
procedure TForm1.Button1Click(Sender: TObject); будем думать и химичить, если не дойдёт как наверно ещё обращусь :) PS: только одного не понял, вроде бы в sg1.cells[i , j] , i - это столбец, а j - это строка... но по вашему примеру он мне строки в столбцы выводил, а так как написано у меня, он выводит строки в строчку, как мне и хотелось... в чём же загадка? |
Цитата:
Цитата:
ИМХО, создается просто ссылка на объект, так как сам excel во время работы запускается в фоновом режиме, это можно отследить в процессах, а по окончании работы с документом из программы Delphi, он выгружается из памяти! Не думаю, что в программе под эту переменную выделяется много памяти! |
состряпал такой вот кодик:
Код:
for i := 1 to RowsCount do |
Цитата:
|
если j у Вас это столбцы, то почему длина цикла такая же как и у i, до RowsCount?
Цитата:
|
|
Осталось наверно самое сложное, заставить эту прогу выводить строки соответственно времени, то есть, строки со временем 9:00 до 12:00 показывать в это время, остальные где то хранить (или в 12:00 обновляться и искать строки с 12:00 до 15:00) и выводить их в нужное время.
как бы вот с этой задачей разобраться? |
Цитата:
Тут уже Вам не обойтись тем циклом который Вы представили! Можно конечно сначала добавить все строки, потом циклом пройтись по StringGrid и удалить те, которые не соответствуют времени! Либо же, проверять это перед заполнением! И добавлять уже, только те которые нужны! Например можно так : Код:
time : string; Ну вот как нибудь так можно это реализовать! |
Цитата:
PS: еще маленький вопросик, а уже заполненную StringGrid в одной форме, можно как то передать на другую форму (либо саму табличку, либо данные из неё), которая в итоге будет результирующей? объясню для чего это, первая форма это как бы черновик, в котором мы заполняем и проверяем все данные, а вторая форма как чистовик, на которую по нажатию кнопки "поехали" (в первой форме) перебрасываются все данные и выводятся на экран. |
Цитата:
Цитата:
|
|
LilLoco,
Цитата:
Цитата:
И где про это - состыковка двух разных программ из под VBA в Exel для переброса данных - можно прочитать по подробнее? |
Так, если я правильно понял, то,
Технология OLE позволяет работать с программами разработанными Только компанией Microsoft. Соответственно, невозможно так работать с любой программой! |
Я нашел в ru.Wikipedia.org - по теме OLE. Насколько я понял это было создано Microsoft для связывания различных данных из различных программ (в тч Adobe Flash Player) в программы семейства Microsoft. Далее ссылка идет на MSDN (Через Гогль Хром все быстро переводится на русский) В общих чертах понятно. Нужно теперь нарыть русскоязычную литературу в энтом направлении.
|
Цитата:
Цитата:
Цитата:
|
что-то я не понимаю слегка, сделал такой цикл:
Код:
for i := 1 to 10 do вот еще бы хотелось понять, на что заменить в данной строке (for i := 1 to 10 do) цифру 10, чтобы таки цикл был до конца СтрингГрида (SG1)? ну и соответственно во второй строке цифру 3 (хотя ее можно не менять.) и что то мне кажется я не то пишут вот тут - sg3.cells[i - 1, j - 1] := Form4.SG1.Cells[i ,j ]; - помогите плиз понять в чём загвоздка? |
Цитата:
может быть нужно : Код:
for i := 1 to 10 do Цитата:
Код:
Form4.SG1.RowCount // Количество строк в StringGrid Цитата:
Цитата:
|
Цитата:
Код:
begin Цитата:
|
Сколько строк у Вас изначально в чистовике и черновике?
Цитата:
|
Цитата:
Цитата:
|
Вложений: 2
прикрепил два скрина для наглядности что как и куда планируется сделать, может чем то поможет :))
|
Вложений: 1
Держите, набросал, посмотрите и отредактируйте как Вас нужно! Вроде все работает!)
Скоро в интернете появится вся база номеров автомобилей и их владельцев :D :D :D |
Цитата:
не правда, это всего лишь презентация записи на обслуживание. :) пытаюсь разобраться с вашим примером, спасибо PS: подшаманил под себя то что Вы привели в примере, и... заработало :))))))))) |
фух, слава богу не надо по времени вывод данных делать. за сим считаю проблему решённой. огромное спасибо LilLoco. :)))
|
Время: 21:16. |
Время: 21:16.
© OSzone.net 2001-