Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.52/33: Рейтинг темы: голосов - 33, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 08.04.2011
Сообщений: 27
1

Автоматическая выборка значений переменных из Excel в Delphi 7

12.04.2011, 13:44. Показов 6551. Ответов 25
Метки нет (Все метки)

Добрый день. Помогите пожалуйста найти ошибку. Нужно осуществить автоматическую выборку значений входных переменных из Excel в Delphi 7 для использования полученных значений в последующих расчетах. Привожу фрагмент кода программы, где пытался осуществить это с использованием цикла. После ввода номера строки с кнопки Button1 должны выбираться значения из конкретной строки базы данных Excel. Значения переменных размещены по столбцам.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
k:=StrToInt(Edit1.Text);
label35.Caption:=IntToStr(k);
for i:=1 to k do
begin
Excel := CreateOleObject('Excel.Application');
Excel.Workbooks.Open['D:\База.xls'];
Excel.Visible := False;
C:=Excel. Cells[i, 1];
V:=Excel. Cells[i, 4];
Z:=Excel.Сells[i, 2];
T:=Excel.Cells[i, 3];
E:=Excel.Cells[i, 5];
O:=Excel.Cells[i, 6];
label1.Caption:=FloatToStr(C);
label3.Caption:=FloatToStr(V);
label4.Caption:=FloatToStr(Z);
label5.Caption:=FloatToStr(T);
label32.Caption:=FloatToStr(E);
label34.Caption:=FloatToStr(O);
Excel.ActiveWorkbook.Close;
end;
end;
После запуска компиляции выдается ошибка «Could not convert variant of type (Dispatch) into type (Double). Process Stopped.
Буду очень признателен если поможете разобраться в этой проблеме. Я считаю, что выборку и перенос значений базы данных Excel можно осуществить из Delphi 7. Но нужно найти ошибку. Заранее спасибо всем кто откликнется.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.04.2011, 13:44
Ответы с готовыми решениями:

Формула Excel. Выборка значений по строкам и столбцам
Помогите научить ексель понимать, Как суммировать значения в одном столбце при выполнении условия в...

Выборка значений в промежутке дат ADOQuery, TimeDataPicker, Delphi
Не получается выборка по заданному диапазону дат. Необходимо выводить записи с датами между...

Помогите построить таблицу значений функции двух переменных в Excel
Помогите построить таблицу значений функции двух переменных f(x,y) Функция: y/x-4/x2 Границы по...

Автоматическая выборка
Перевел базу данных в SQL. Клиентская часть осталась в Access 2010. Ранее в форме заполнял поле , ...

25
1262 / 705 / 62
Регистрация: 21.12.2009
Сообщений: 2,255
12.04.2011, 16:11 2
Ну, с ошибками у Вас напряга нет!
1. Для чего
Delphi
1
2
3
Excel := CreateOleObject('Excel.Application');
Excel.Workbooks.Open['D:\База.xls'];
Excel.Visible := False;
Вы всавили в тело цикла. Документ нужно создать - открыть 1 раз. Этого достаточно, и после считывания зекрыть бы не мешало.
2. Обращение к ячейкам документа некорректное. Нужно указать Sheet с нужными ячейками. Можно описать переменную
Delphi
1
var WorkSheet: variant;
Затем до цикла присвоить
Delphi
1
WorkSheet := Workbook.Sheets.Item[1]; //это, если работаете с первой страницей
Ну, и в цикле, там, где обращаетесь к ячейкам
Delphi
1
WorkSheet.Cells.Item[i, 1] // и так далее
1
0 / 0 / 0
Регистрация: 08.04.2011
Сообщений: 27
12.04.2011, 17:45  [ТС] 3
Спасибо, SAMZ. Спасибо за ответ. Все понятно, попробую. Как получится, отпишусь.
0
0 / 0 / 0
Регистрация: 08.04.2011
Сообщений: 27
12.04.2011, 21:08  [ТС] 4
Добрый вечер. Привожу фрагмент кода программы. После компиляции выскакивает ошибка "Invalid Variant Operation". Помогите найти ошибку в коде программы, может требуется подключение дополнительных модулей, так как после компиляции программы указывается ошибка в строках программы, где имеется WorkSheet (Эти строки выделил красным цветом). Заранее спасибо всем кто откликнется.
k: integer;
Excel: variant;
Workbook: variant;
WorkSheet: variant;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
k:=StrToInt(Edit1.Text);
label35.Caption:=IntToStr(k);
Excel:=CreateOleObject('Excel.Application');
Excel.Workbooks.Open['D:\?aaioa\Aae_eaeueoeyoi?_auai?ea\Aaca1.xls'];
Excel.Visible := False;
WorkSheet:=Workbook.Sheets.Item[1];
for i:=1 to k do
begin
WorkSheet.Cells.Item[i,1];
WorkSheet.Cells.Item[i,4];
WorkSheet.Cells.Item[i,2];
WorkSheet.Cells.Item[i,3];
WorkSheet.Cells.Item[i,5];
WorkSheet.Cells.Item[i,6];

C:=Excel.Cells[i,1];
V:=Excel.Cells[i,4];
Z:=Excel.Cells[i,2];
T:=Excel.Cells[i,3];
E:=Excel.Cells[i,5];
O:=Excel.Cells[i,6];
label1.Caption:=FloatToStr(C);
label3.Caption:=FloatToStr(V);
label4.Caption:=FloatToStr(Z);
label5.Caption:=FloatToStr(T);
label32.Caption:=FloatToStr(E);
label34.Caption:=FloatToStr(O);
Excel.Application.Quit;
end;
end;
0
1262 / 705 / 62
Регистрация: 21.12.2009
Сообщений: 2,255
13.04.2011, 06:02 5
Судя по коду, который Вы привели, Вы плохо передставляете себе, как это работает.
Вот эти строчки
Delphi
1
2
3
4
5
6
WorkSheet.Cells.Item[i,1];
WorkSheet.Cells.Item[i,4];
WorkSheet.Cells.Item[i,2];
WorkSheet.Cells.Item[i,3];
WorkSheet.Cells.Item[i,5];
WorkSheet.Cells.Item[i,6];
выбросить на фиг!
Вместо них
Delphi
1
2
3
4
5
6
C := WorkSheet.Cells.Item[i,1].Value;
V := WorkSheet.Cells.Item[i,4]].Value;
Z := WorkSheet.Cells.Item[i,2]].Value;
T := WorkSheet.Cells.Item[i,3]].Value;
E := WorkSheet.Cells.Item[i,5]].Value;
O := WorkSheet.Cells.Item[i,6]].Value;
Далее строки
Delphi
1
2
3
4
5
6
C:=Excel.Cells[i,1];
V:=Excel.Cells[i,4];
Z:=Excel.Cells[i,2];
T:=Excel.Cells[i,3];
E:=Excel.Cells[i,5];
O:=Excel.Cells[i,6];
тоже выбросить. Я писал, что ТАК обращаться к ячейкам документа нельзя.
1
0 / 0 / 0
Регистрация: 08.04.2011
Сообщений: 27
13.04.2011, 07:25  [ТС] 6
Спасибо, SAMZ. А строку WorkSheet:=Workbook.Sheets.Item[1]; как преобразовать, чтобы программа не ругалась. Просто после запуска компиляции и нажатии на кнопку пишет ошибку, что пропущено что-то и останавливается. Эту строку пишу перед циклом в программе после Excel.Visible := False;. Подскажите пожалуйста. Я действительно еще не сильно разбираюсь в работе с Excel через Delphi 7. Спасибо за то, что откликнулись, но нужно, чтобы выборка и перенос значений сработал. Для меня это очень актуально.
0
1262 / 705 / 62
Регистрация: 21.12.2009
Сообщений: 2,255
13.04.2011, 07:30 7
Delphi
1
WorkSheet:=Excel.Workbook.Sheets.Item[1];
1
0 / 0 / 0
Регистрация: 08.04.2011
Сообщений: 27
13.04.2011, 08:16  [ТС] 8
Сейчас уже переписал код, но все равно программа выдает ошибку после компиляции в строке WorkSheet:=Workbook.Sheets.Item[1]; Выдает после нажатия кнопки Button1 "Invalid variant operation". Что нужно исправить для корректной работы. Только в этой строке ошибка. Строки которые нужно было удалить я удалил и изменил строки с WorkSheet на то, что вы написали
C := WorkSheet.Cells.Item[i,1].Value;
V := WorkSheet.Cells.Item[i,4].Value;
Z := WorkSheet.Cells.Item[i,2].Value;
T := WorkSheet.Cells.Item[i,3].Value;
E := WorkSheet.Cells.Item[i,5].Value;
O := WorkSheet.Cells.Item[i,6].Value;
Спасибо за помощь, но нужно, чтобы выборка и перенос значений из Excel в Delphi 7 работал. Для меня это очень актуально.

Добавлено через 54 секунды
Спасибо страница обновилась. Увидел, что нужно исправить.

Добавлено через 9 минут
Программа после компиляции выдала ошибку, что метод Sheets не поддерживается. На Workbook тоже выдавалась ошибка, на писал вместо нее Workbooks:
WorkSheet:=Excel.Workbook.Sheets.Item[1];
Подскажите, что именно нужно сделать, чтобы заработало. Может помимо ComObj еще один модуль создать нужно. Спасибо за помощь.

Добавлено через 24 минуты
Привожу фрагмент кода. после нажатия на кнопку Button1 выдается ошибка Ole "Method Sheets not supported ...". Что нужно исправить? Спасибо за помощь.
Excel: variant;
WorkSheet: variant;
Sheets: variant;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
k:=StrToInt(Edit1.Text);
label35.Caption:=IntToStr(k);
Excel:=CreateOleObject('Excel.Application');
Excel.Workbooks.Open['D:\База.xls'];
Excel.Visible := False;
WorkSheet:=Excel.Workbooks.Sheets.Item[1];
for i:=1 to k do
begin
C:=WorkSheet.Cells.Item[i,1].Value;
V:=WorkSheet.Cells.Item[i,4].Value;
Z:=WorkSheet.Cells.Item[i,2].Value;
T:=WorkSheet.Cells.Item[i,3].Value;
E:=WorkSheet.Cells.Item[i,5].Value;
O:=WorkSheet.Cells.Item[i,6].Value;
label1.Caption:=FloatToStr(C);
label3.Caption:=FloatToStr(V);
label4.Caption:=FloatToStr(Z);
label5.Caption:=FloatToStr(T);
label32.Caption:=FloatToStr(E);
label34.Caption:=FloatToStr(O);
Excel.Application.Quit;
end;
end;
0
1262 / 705 / 62
Регистрация: 21.12.2009
Сообщений: 2,255
13.04.2011, 09:12 9
Excel структурирован следуюющим образом:
Exel - OLE переменная, через котрую реализуется связи приложения с Exel
WorkBooks - книги(документы) Exel
Sheets - массив разделов (страниц) книги. Доступ к странице ].Sheets.Item[<номер страницы>]
Cells - массив ячеек. Доступ к ячейке Cells.Item[i, j]; здесь i, j - строка, столбец
Таким образом:
книга
Delphi
1
WorkBook := Excel.WorkBooks.Item[1];
Раздел
Delphi
1
WorkSheet := Workbook.Sheets.Item[1];
Ячейка
Delphi
1
WorkSheet.Cells.Item[i, j];
Можно и так
Delphi
1
Excel.WorkBooks.Item[1].Sheets.Item[1].Cells.Item[i, j];
При этом у Вас присвоение будет выглядеть
Delphi
1
2
C := Excel.WorkBooks.Item[1].Sheets.Item[1].Cells.Item[i, 1].Value;
//и т.д.
Все просто, как точило!
2
0 / 0 / 0
Регистрация: 08.04.2011
Сообщений: 27
13.04.2011, 10:09  [ТС] 10
Доброе утро. Спасибо за помощь. Но уже выскакивает ошибка "Could not convert "OleStr" into type "Double"". Что я делаю неправильно. программа запускается, но при нажатии на Button1 выскакивает ошибка. Очень признателен вам за помощь, но мне очень нужно, чтобы программа работала. Привожу фрагмент кода:
k: integer;
Excel: variant;
Worksheet: variant;
Workbook: variant;
Sheets: variant;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
k:=StrToInt(Edit1.Text);
label35.Caption:=IntToStr(k);
Excel:=CreateOleObject('Excel.Application');
Excel.Workbooks.Open['D:\База.xls'];
Excel.Visible := False;
WorkBook := Excel.Workbooks.Item[1];
WorkSheet := Workbook.Sheets.Item[1];
for i:=1 to k do
begin
C:=Excel.Workbooks.Item[1].Sheets.Item[1].Cells.Item[i,1].Value;
V:=Excel.Workbooks.Item[1].Sheets.Item[1].Cells.Item[i,4].Value;
Z:=Excel.Workbooks.Item[1].Sheets.Item[1].Cells.Item[i,2].Value;
T:=Excel.Workbooks.Item[1].Sheets.Item[1].Cells.Item[i,3].Value;
E:=Excel.Workbooks.Item[1].Sheets.Item[1].Cells.Item[i,5].Value;
O:=Excel.Workbooks.Item[1].Sheets.Item[1].Cells.Item[i,6].Value;
label1.Caption:=FloatToStr(C);
label3.Caption:=FloatToStr(V);
label4.Caption:=FloatToStr(Z);
label5.Caption:=FloatToStr(T);
label32.Caption:=FloatToStr(E);
label34.Caption:=FloatToStr(O);
Excel.Application.Quit;
end;
end;
0
1262 / 705 / 62
Регистрация: 21.12.2009
Сообщений: 2,255
13.04.2011, 10:35 11
Цитата Сообщение от kolyan6100 Посмотреть сообщение
Но уже выскакивает ошибка "Could not convert "OleStr" into type "Double"".
Скорее всего в документе Excel у Вас в ячейке строка. А у переменной тип Double или Float. Попытайтесь прочитать ячейку как строку. Например
Delphi
1
label1.Caption:=Excel.Workbooks.Item[1].Sheets.Item[1].Cells.Item[i,1].Value;
В своих постах используйте теги.
1
0 / 0 / 0
Регистрация: 08.04.2011
Сообщений: 27
13.04.2011, 10:46  [ТС] 12
Доброе утро. Спасибо за помощь. В ячейках числа прописаны. Просто вставить значение конкретной ячейки у меня сразу получается, все делаю по руководству. Но когда есть возможнось с помощью кнопки выбрать номер строки и далее получить помощью цикла значения, это очень удобно и необходимо. Но нужно получить значения ячеек и использовать значения в расчетах. Может выводить на экран по другому нужно. Попробовал я прописать, что вы в предыдущем посте посоветовалитаже ошибка выскакивает. Подскажите пожалуйста что еще можно проделать, чтобы получить значения ячеек.
0
1262 / 705 / 62
Регистрация: 21.12.2009
Сообщений: 2,255
13.04.2011, 10:50 13
Если можете выложите этот Exel документ, я посмотрю! Более ничего в головы не приходит.
1
0 / 0 / 0
Регистрация: 08.04.2011
Сообщений: 27
13.04.2011, 10:55  [ТС] 14
Привожу фрагмент кода программы:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
k: integer;
  Excel: variant;
  Worksheet: variant;
  Workbook: variant;
  Sheets: variant;
  implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
k:=StrToInt(Edit1.Text);
label35.Caption:=IntToStr(k);
Excel:=CreateOleObject('Excel.Application');
Excel.Workbooks.Open['D:\Ðàáîòà\Áàë_êàëüêóëÿòîð_âûáîðêà\Áàçà2.xls'];
Excel.Visible := False;
WorkBook := Excel.Workbooks.Item[1];
WorkSheet := Workbook.Sheets.Item[1];
for i:=1 to k do
begin
C:=Excel.Workbooks.Item[1].Sheets.Item[1].Cells.Item[i,1].Value;
V:=Excel.Workbooks.Item[1].Sheets.Item[1].Cells.Item[i,4].Value;
Z:=Excel.Workbooks.Item[1].Sheets.Item[1].Cells.Item[i,2].Value;
T:=Excel.Workbooks.Item[1].Sheets.Item[1].Cells.Item[i,3].Value;
E:=Excel.Workbooks.Item[1].Sheets.Item[1].Cells.Item[i,5].Value;
O:=Excel.Workbooks.Item[1].Sheets.Item[1].Cells.Item[i,6].Value;
label1.Caption:=Excel.Workbooks.Item[1].Sheets.Item[1].Cells.Item[i,1].Value;
label3.Caption:=Excel.Workbooks.Item[1].Sheets.Item[1].Cells.Item[i,4].Value;
label4.Caption:=Excel.Workbooks.Item[1].Sheets.Item[1].Cells.Item[i,2].Value;
label5.Caption:=Excel.Workbooks.Item[1].Sheets.Item[1].Cells.Item[i,3].Value;
label32.Caption:=Excel.Workbooks.Item[1].Sheets.Item[1].Cells.Item[i,5].Value;
label34.Caption:=Excel.Workbooks.Item[1].Sheets.Item[1].Cells.Item[i,6].Value;
Excel.Application.Quit;
end;
end;
0
0 / 0 / 0
Регистрация: 08.04.2011
Сообщений: 27
13.04.2011, 11:14  [ТС] 15
A B C

2 0.96 -2 24.88
3 0.34 14 26.74
4 0.87 12 23.78
5 0.79 15 25.74
6 0.83 12 27.72
7 0.56 13 24.74

Первые три столбца базы в Excel . Остальные выглядят также. Как понимаете я не могу здесь выложить шапку таблицы и соответственно всю таблицу Excel. Числовая часть отделена от целой точкой. Для этого в настройках Языки и стандарты изменил разделитель целой части от дробной с запятой "," на точку "." В первой строке названия столбцов, так называемая шапка. Все остальные столбцы так выглядят, значения расположены строго по столбцам. Помогите пожалуйста, что еще можно проделать, чтобызначения из Excel при нажатии на кнопку переместились в Delphi 7 для использования их в расчетах. Спасибо большое за помощь, но нужно чтобы программа выполнялась и работала. Для меня, опять же повторю, очень актуально.
0
1262 / 705 / 62
Регистрация: 21.12.2009
Сообщений: 2,255
13.04.2011, 11:26 16
Цитата Сообщение от kolyan6100 Посмотреть сообщение
Как понимаете я не могу здесь выложить шапку таблицы и соответственно всю таблицу Excel
А в чем проблемы, заархивируй файл с exel документом и выложи!
1
0 / 0 / 0
Регистрация: 08.04.2011
Сообщений: 27
13.04.2011, 11:49  [ТС] 17
Я не могу выложить секретную информацию. А фрагмент того как располагается содержимое я написал, так и в базе Excel информация располагается. Число строк в таблице 21. Спасибо за помощь. Но если можете предложите вариант, как можно вытащить значения переменных из ячеек.
0
1262 / 705 / 62
Регистрация: 21.12.2009
Сообщений: 2,255
13.04.2011, 12:36 18
Цитата Сообщение от kolyan6100 Посмотреть сообщение
Я не могу выложить секретную информацию.
Да и не нужна никому Ваша информация. В любом excel документе мышкой выделяете прямоугольную область с этими вашими цифирками, копируете в клипбоард, создаете новый Exel документ вставляете теда скопированное, отслеживаете, чтобы атрибуты ячеек (целый, вещественный, строковый) обязательно совпадали с аналогичными атрибутами в Вашем документе. И все дела. Только так я смогу Вам чем-то помочь!
1
0 / 0 / 0
Регистрация: 08.04.2011
Сообщений: 27
13.04.2011, 13:46  [ТС] 19
Хорошо. Через час перекину значения из базы в другую книгу Excel и выложу в архиве, если это необходимо.
0
0 / 0 / 0
Регистрация: 08.04.2011
Сообщений: 27
13.04.2011, 15:44  [ТС] 20
Добрый день. Во вложении архив с базой в Excel без шапки (числовые значения немного изменены, но формат и разрядность та же). Помогите пожалуйста решить проблему с выборкой значений переменных из Excel в Delphi 7.
0
Вложения
Тип файла: rar База3.rar (3.9 Кб, 23 просмотров)
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.04.2011, 15:44

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Автоматическая выборка
Здравствуйте. Перейду сразу к делу. На скриншоте указаны отсортированные по критерию...

Автоматическая выборка дня рождения
Доброго времени суток как сделать php коды выводя для рождения через for() вот скрины Так че та...

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

Автоматическая инициализация переменных PHP
Подскажите какая настройка апача отвечает за автоматическую инициализацию, т.е. если встретил...

Автоматическая установка переменных среды
Доброго времени суток, господа. В общем потихоньку изучаю java и появилась необходимость закинуть...

Автоматическая циклическая отправка переменных другому файлу
Использую сессию. Надо автоматизировать передачу переменных: в передающем файле переменные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.