Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] перекинуть данные из Excel в прогу на Delphi

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

Пользователь


Сообщения: 121
Благодарности: 7

Профиль | Отправить PM | Цитировать


Изменения
Автор: anatoly_neo
Дата: 18-04-2011
Изображения
Тип файла: jpg проект.jpg
(187.8 Kb, 17 просмотров)
Вложения
Тип файла: xls Пример.xls
(15.5 Kb, 20 просмотров)
Привет всем.
Помогите решить задачку. Есть файл эксель, содержит в себе данные в трёх столбцах (пример приложен) и примерно 25 строчках, на одном листе. Надо из него подгрузить эти данные в программу на Delphi в модуль StringGrid.
На скрине зафиксировал то чего уже удалось добиться в графическом виде, с кодом пока значительно сложнее, посему и прошу вашей помощи. Хотелось бы чтобы поподробнее объяснили, что к чему, зачем и почему.
Спасибо.

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

Отправлено: 16:56, 18-04-2011

 

В Поисках Истины


Сообщения: 802
Благодарности: 135

Профиль | Отправить PM | Цитировать


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:
хотелось бы сразу добавить небольшое усложнение задачи »
Сначала тащите из excel ячейку с датой, выполняйте все операции необходимые для проверки, проверяйте, и если true выводите!

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

Код: Выделить весь код
uses ComObj

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}

Это сообщение посчитали полезным следующие участники:

Отправлено: 07:49, 19-04-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 121
Благодарности: 7

Профиль | Отправить PM | Цитировать


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

Отправлено: 10:16, 20-04-2011 | #3


В Поисках Истины


Сообщения: 802
Благодарности: 135

Профиль | Отправить PM | Цитировать


Цитата anatoly_neo:
как прочитать оттуда ячейки и закинуть их в StringGrid »
Циклом пройтись по документу!
Например по представленному вами файлу 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;

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}

Это сообщение посчитали полезным следующие участники:

Отправлено: 10:37, 20-04-2011 | #4


Пользователь


Сообщения: 121
Благодарности: 7

Профиль | Отправить PM | Цитировать


что-то не хочет работать такая вот комбинация:

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' "....

Отправлено: 11:32, 21-04-2011 | #5


В Поисках Истины


Сообщения: 802
Благодарности: 135

Профиль | Отправить PM | Цитировать


В коде у меня тоже подчеркивается красным, и та же ситуация Undeclarated identifier 'Value', но при этом все компилируется и работает отлично! Что делает строка
Код: Выделить весь код
n := OpenFile();
?
И где инициирование переменной excel?
Тут было все довольно конкретно описано!

Последний раз редактировалось LilLoco, 21-04-2011 в 13:03.


Отправлено: 12:58, 21-04-2011 | #6


Аватара для Хоф

Пользователь


Сообщения: 105
Благодарности: 10

Профиль | Отправить PM | Цитировать


LilLoco,
вопрос в догонку так сказать для собственного просвещения.
Цитата LilLoco:
любая_прога := CreateOleObject('название этой проги') »
Создает объектную переменную размером с саму программу?

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

-------
коллекционирую выдвижные столики..... для кофе.


Отправлено: 14:07, 21-04-2011 | #7


Пользователь


Сообщения: 121
Благодарности: 7

Профиль | Отправить PM | Цитировать


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 - это строка... но по вашему примеру он мне строки в столбцы выводил, а так как написано у меня, он выводит строки в строчку, как мне и хотелось... в чём же загадка?

Последний раз редактировалось anatoly_neo, 21-04-2011 в 14:15.


Отправлено: 14:09, 21-04-2011 | #8


В Поисках Истины


Сообщения: 802
Благодарности: 135

Профиль | Отправить PM | Цитировать


Цитата anatoly_neo:
вроде бы в sg1.cells[i , j] , i - это столбец, а j - это строка... »
Да, моя ошибка извиняюсь, сначала идет столбец, а потом строка! У меня же в примере, наоборот

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

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:35, 21-04-2011 | #9


Пользователь


Сообщения: 121
Благодарности: 7

Профиль | Отправить PM | Цитировать


состряпал такой вот кодик:
Код: Выделить весь код
 for i := 1 to RowsCount do
    begin
      for j := 1 to RowsCount do
        begin
          sg1.cells[i - 1, j - 1] := excel.cells[j, i].Value;
так он заполняет табличку, но не с самой верхней строки, а со второй, подскажите куда рыть?

Отправлено: 14:37, 21-04-2011 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] перекинуть данные из Excel в прогу на Delphi

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
как перекинуть все данные с одного компа на другой Pavelasd Хочу все знать 9 27-06-2011 06:32
CMD/BAT - [решено] Как внести данные в реестр из батника без подтверждения запроса и запустить прогу? Nun-Nun Скриптовые языки администрирования Windows 3 11-05-2011 11:41
Как из сим карты перекинуть данные старые в новый телефон? micro8 Мобильные ОС, смартфоны и планшеты 4 27-09-2010 18:48
2007 - Excel | Не отображаются данные devilless Microsoft Office (Word, Excel, Outlook и т.д.) 0 08-07-2010 09:49
Delphi - Delphi: как закрыть чужую прогу pvr30 Программирование и базы данных 13 06-08-2003 19:15




 
Переход