Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.81/64: Рейтинг темы: голосов - 64, средняя оценка - 4.81
 Аватар для RedBull
3 / 3 / 0
Регистрация: 01.07.2010
Сообщений: 53

Отображение данных из Excel в TStringGrid.

05.11.2010, 08:22. Показов 13965. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
подскажите пожалуйста как отобразить таблицу Excel-я в DBGrid!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.11.2010, 08:22
Ответы с готовыми решениями:

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

Импорт из MS Excel в TStringGrid
Здравствуйте. Не получается импортировать данные из Excel. На Builder 6 работает нормально, но не получется с использованием компилятора...

C++ XE7 -Чтение файла с FTP устройством на Android и отображение его в TStringGrid
Добрый день! На FTP лежит файл report.txt. Его надо считать и отобразить в TStringGrid. Компилятор - Embarcadero C++ XE7 Платформа...

40
 Аватар для RedBull
3 / 3 / 0
Регистрация: 01.07.2010
Сообщений: 53
28.12.2010, 08:23  [ТС]
Студворк — интернет-сервис помощи студентам
нет,мне нужно загружать также таблице только на других ормах!И не в один StringGrid!Нужно что бы это всё можно было делать на нескольких формах!на каждой форме и кнопка загрузки и сама таблица(сразу скажу что таблицы разные),и таких копий оч много,нужно чтоб на каждую форму по таблице загрузить!а там уже я сам,прогсто вылазеет ошибка:
ExApp := CreateOleObject('Excel.Application');- на этой строке
ошибка такая: Undeclared identifier:'CreateOleObject'
что делать не знаю=()а прогу на сегодня нужно доделать=(((
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
28.12.2010, 11:07
Цитата Сообщение от RedBull Посмотреть сообщение
ExApp := CreateOleObject('Excel.Application');- на этой строке
ошибка такая: Undeclared identifier:'CreateOleObject'
Потому что функция CreateOleObject() объявлена в модуле ComObj, а этот модуль видимо не подключен.
Т. е., в том модуле, который вызвает CreateOleObject() должно быть написано:
Delphi
1
2
uses
  ComObj;
Цитата Сообщение от RedBull Посмотреть сообщение
мне нужно загружать также таблице только на других ормах!И не в один StringGrid!Нужно что бы это всё можно было делать на нескольких формах!на каждой форме и кнопка загрузки и сама таблица(сразу скажу что таблицы разные),и таких копий оч много,нужно чтоб на каждую форму по таблице загрузить!
Так я же говорил на этот счёт - тот код, который загружает данные из Excel в таблицу надо офомить в виде отдельной процедуры. Заголовок этой процедуры должен быть таким:
Delphi
1
2
3
4
5
6
7
8
9
10
11
uses
  ComObj;
 
procedure LoadFromExcel(const aExFileName : String; aSg : TStringGrid);
var
  ExApp : Variant;
...
begin
  ExApp := CreateOleObject('Excel.Application');
...
end;
Т. е. эта процедура должна открывать в Excel файл с именем aExFileName. Затем эта процедура грузит данные с листа Excel в таблицу aSg.
Эту процедуру можно использовать на всех формах для различных таблиц типа TStringGrid.
Предположим, что процедура описана в модуле Unit1. Пример вызова:
Delphi
1
2
3
4
5
6
7
8
9
10
uses
  Unit1; //В этом модуле определена процедура LoadFromExcel().
 
//Вызов из внешнего по отношению к TForm3 кода:
LoadFromExcel('D:\Книга1.xls', Form3.StringGrid1);
...
//Вызов из какого-нибудь метода TForm3:
LoadFromExcel('D:\Книга1.xls', StringGrid1);
//или:
//LoadFromExcel('D:\Книга1.xls', Self.StringGrid1);
Только надо не забывать прописывать подключение модуля ComObj в том модуле, где лежит реализация функции LoadFromExcel(). А также не забывать подключать модуль с реализацией LoadFromExcel() к тем модулям проекта, где эта функция вызывается.
1
 Аватар для RedBull
3 / 3 / 0
Регистрация: 01.07.2010
Сообщений: 53
14.01.2011, 11:57  [ТС]
здравствуйте ещё раз!дайте совет пожалуйста по более сложному вопросу=\
я вообще не знаю как это вообще возможно сделать!
При нажатии на кнопку открывается opengialog в котором выбираем не один файл а сразу много,ну например!20 или 30!не важно сколько!!для моей программы нужно 300 таблиц загружать одновременно,т,е раньше я делал по нажатию кнопки на каждой форме загружать свою таблицу,но когда я стал загружать 10 и более таблиц,я задумался=\для каждой формы загружать свою таблицу это оч мучительно,а мремени раймёт минимум минут 40!
вобщем мне нужно загружать много таблиц одновременно на разные формы,и ещё,!!!будут таблицы с названием 1,2,3,4....итд!то есть таблица под названием 1 для первой формы,файл под названием
2 для второй формы таблицы
т.е какая цифра на ту форму в StringGrid и загружать!если возьмём две таблицы 1 и 5-значит загружаться должно в первую и пятую!
как это вообще сделать возможно???и возможно ли?=\
подскажие если не сложно хотябы чуть чуть!
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
14.01.2011, 23:18
А может не нужна для каждой загрузки отдельная форма? Действия, наверное, однотипные? Возможно, для обработки даже таблица не нужна. Вернее - саму обработку можно делать на массиве.
Предлагаю рассмотреть такую архитектуру:
Написать базовую процедуру, которая должна работать так:
- Загрузка данных из таблицы Excel в массив.
- Обработка массива.
- Выгрузка выходных данных.
Далее, пишется вызывающий код, на вход которого поступает массив Excel-файлов. Этот код с помощью базовой процедуры последовательно обрабатывает все файлы из входного массива.
Можно вести обработку файлов в многопоточном режиме. Выделить, на это, скажем, 3-5 потоков (с учётом того, что загрузка идёт через OLE-механизм).
---
RedBull, на сколько такой вариант приемлем?
0
 Аватар для RedBull
3 / 3 / 0
Регистрация: 01.07.2010
Сообщений: 53
16.01.2011, 14:03  [ТС]
ммм,я вообще нифига не монял что ты написал=)))
но мне кажется это всё равно лучше=)
но я вообще не представляю как это=\
не,для меня легче будет сделать так=)
разные формы и загрузка таблиц на все формы одним кликом=)тольк я не знаю как это сделать=\
с учётом какая цифра в имени на такую форму и загружать!
с чего лучше всего начать?:cofee2:
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
17.01.2011, 12:27
RedBull, предлагаю сделать в виде MDI приложения. Проект приложен к этому сообщению.
Работает так:
- Для открытия можно выбирать отдельный файл, группы файлов или целые папки.
- Ведётся список открытых файлов.
- Для загрузки создаётся только один экземпляр Excel.
- Загрузка выполняется в основном потоке. В дальнейшем загрузку можно реализовать в отдельном потоке.
Миниатюры
Отображение данных из Excel в TStringGrid.  
Вложения
Тип файла: rar ReadFromExcel.rar (217.2 Кб, 68 просмотров)
1
 Аватар для RedBull
3 / 3 / 0
Регистрация: 01.07.2010
Сообщений: 53
02.02.2011, 14:36  [ТС]
большое спасибо за такую программу!очень удобная!с такими ни разу в жизни не работал
теперь возник вопрос: как задать в поиск строки во втором столбце всех таблиц!причём каждая таблица за свой Shape на другой форме!имеется интервал который вводит пользователь!
К примеру: пользователь вводит интервал I)-0,15 II)1,3!вводит ещё №строки в edit!идёт поиск этой строки во всех таблицах во 2 столбце!когда находит,смотрит если это число в этой строке больше интервала то Shape красный,если это число в строке между интервалом значит желтый,и если меньше тогда зелёный!причём каждая таблица имеет свой Shape!и только в нем она должна менять цвет!ещё оч круто было бы если:название таблицы(число) соответствовало своему Shape!т.е если таблица под названием 16 то она и будет менять цвет только в Shape16!и так далее!
вот есть готовый код из старой программы но для этой нужно делать что то новое,с такими программами я ещё не сталкивался!так что я лол
________________________________________ ________
var i:Integer; k:real;
begin
i := strtoint(form2.edit1.text); берёт значение из интервала
form4.label3.Caption:=form1.stringgrid1. cells[0,i]; //показывает число от первой строки

bitbtn1.Caption:=form1.stringgrid1.cells[1,i];
k:=strtofloat(bitbtn1.Caption);
form4.label4.Caption:=floattostr(k); //показывает число от второй строки
if (k<=1) then begin form3.shape1.brush.color:=clLime end ; // определяет число больше или меньше,присваивается свой цвет Shape
if (k>1) and (k<=2)then begin form3.shape1.brush.color:=clYellow end;
if (k>2) then begin form3.shape1.brush.color:=clred end;
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
02.02.2011, 21:25
RedBull, я в субботу этой темой займусь.
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
10.03.2011, 16:29
Выкладываю вариант решения.
Миниатюры
Отображение данных из Excel в TStringGrid.  
Вложения
Тип файла: rar ReadFromExcel.rar (223.9 Кб, 68 просмотров)
1
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
10.03.2011, 16:52
Ради тривиального импорта данных из XLS(X)-контейнера нет никакой нужды городить огород с Excel. Вполне достаточно воспользоваться компонентом Axolot XLSReadWriteII 4 - он прекрасно работает с контейнером напрямую, исключительно удобен в программном его использовании и не требует присутствия в системе установленного Excel.
0
Фрилансер
 Аватар для Mad_Dog
452 / 433 / 117
Регистрация: 01.06.2010
Сообщений: 1,314
10.03.2011, 17:12
mss, и сколько же зелени нужно заплатить за сей шедевр??? В Гугл можешь не посылать, уже был там... Ты для всех цены озвучь, плиз!!!
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
10.03.2011, 17:22
> сколько же зелени нужно заплатить за сей шедевр?

А что, Офис дешевле ?)
Или в нашем царстве-государстве всякий юзер исправно пользует искл-но лицензионный Офис ?)
Или что-то мешает пользовать НЕлицензионный TXLSReadWrite ?)

Вот то-то и оно)
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
10.03.2011, 17:31
Цитата Сообщение от mss Посмотреть сообщение
Вполне достаточно воспользоваться компонентом Axolot XLSReadWriteII 4
Здесь, как я понял, по заданию требуется работать через OLE-связывание. А так, для практических задач - да, может быть, надёжнее какой-нибудь компонент использовать.
Цитата Сообщение от Mad_Dog Посмотреть сообщение
mss, и сколько же зелени нужно заплатить за сей шедевр??? В Гугл можешь не посылать, уже был там... Ты для всех цены озвучь, плиз!!!
А, он дорогой, значит?
Цитата Сообщение от mss Посмотреть сообщение
А что, Офис дешевле ?)
Ну Офис, по крайней мере - им и так рабочие места комплектуют, стандартный набор - MS Word, Excel. А вот компонент покупать - это уже дополнительные траты.
0
Фрилансер
 Аватар для Mad_Dog
452 / 433 / 117
Регистрация: 01.06.2010
Сообщений: 1,314
10.03.2011, 17:34
mss!
Что-то я сомневаюсь, что ты для своих нужд платил за этот опус свои кровные... В лучшем случае платила фирма где ты работаешь... Или я не прав???
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
10.03.2011, 17:46
Зачем платить-то ?)
Продукт шароварный)
Не нравится демо-ограничения ? Ковырнул пару байт - вот тебе и полнофункциональный.
Ответственность наступит только в случае коммерч.применения, о котором в задании, равно как и об именно олей-доступе, нет ни слова.
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
03.04.2011, 00:20
RedBull, по результатам переписки в ЛС выкладываю проект с формой индикаторов. Набор индикаторов реализован на основе TStringGrid. Особенностью является то, что на самом деле, эта таблица не содержит данных. Её ячейки используются только для индикации - их содержимое, цвет, текст, прорисовываются на основе внешних данных, взятых из FormMain.ListBox1. FormMain.ListBox1 - это основной элемент, связывающий данные. Размер таблицы индикаторов подбирается автоматически, в зависимости от количества прочитанных файлов. В инспекторе объектов можно менять количество столбцов таблицы. Количество строк подбирается автоматически во время работы программы.
Форма индикаторов запускается в модальном режиме. Можно сделать её не модальной - если это удобнее.
Миниатюры
Отображение данных из Excel в TStringGrid.  
Вложения
Тип файла: rar Project03.rar (227.6 Кб, 30 просмотров)
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
10.04.2011, 17:04
И ещё проект с сортировкой списка файлов. Определены 4 процедуры сортировки - по убыванию и возрастанию, по целочисленным значениям, записанных в строках и по строковым значениям:
SortListNumAsc(), SortListNumDesc(), SortListStrAsc(), SortListStrDesc().
Вложения
Тип файла: rar Project03.rar (226.6 Кб, 38 просмотров)
1
0 / 0 / 0
Регистрация: 03.01.2012
Сообщений: 57
03.01.2012, 16:09
Mawrat
А как прикрутить поиск одновременно со всех открытых файлов(форм) по тексту введенному в Edit на главной форме, и все найденные результаты поместить в отдельный грид?
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
04.01.2012, 02:16
Поиск текста на листе книги MS 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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
uses
  ComObj;
 
procedure TForm1.Button1Click(Sender: TObject);
const
  //Группа констант XlFindLookIn.
  //Искать только в комментариях, прикреплённых к ячейкам.
  xlComments = -4144;
  //Искать только в тексте формул.
  xlFormulas = -4123;
  //Искать только в значениях ячеек.
  xlValues = -4163;
 
  //Группа констант XlLookAt.
  //Искомый текст может быть частью строки или всей строкой.
  xlPart = 2;
  //Искомый текст может быть только всей строкой.
  xlWhole = 1;
var
  exApp, exBook, exSheet, exRng, exCell : Variant;
  sTemplate, sAddress : String;
  i : Integer;
  Od : TOpenDialog;
begin
  Od := OpenDialog1;
  if Od.InitialDir = '' then
    Od.InitialDir := ExtractFilePath( Application.exeName )
  ;
  if not Od.Execute then Exit;
  if not FileExists(Od.FileName) then begin
    MessageBox(
      0
      ,PChar('Файл с указанным именем не найден. Действие отменено.')
      ,PChar('Предупреждение')
      ,MB_OK + MB_ICONWARNING + MB_APPLMODAL
    );
    Exit;
  end;
 
  sTemplate := Edit1.Text;
  if STemplate = '' then begin
    ShowMessage('Не задан искомый текст. Действие отменено.');
    Exit;
  end;
  Memo1.lines.Add('Искомый текст: "' + sTemplate + '".');
 
  exApp := CreateOleObject('Excel.Application');
  exApp.Visible := True;
  exBook := exApp.WorkBooks.Open(FileName:=Od.FileName);
  //Первый лист в рабочей книге.
  exSheet := exBook.WorkSheets[1];
  //Используемый на листе диапазон.
  exRng := exSheet.UsedRange;
 
  //Поиск ячееек.
  i := 0;
  exCell := Unassigned;
  //LookIn:=xlValues - ищем только в значениях ячеек.
  //LookAt:=xlPart - искомый тект может быть частью строки или всей строкой.
  //MatchCase:=False - поиск не зависит от регистра букв.
  exCell := exRng.Find(What:=STemplate, LookIn:=xlValues, LookAt:=xlPart, MatchCase:=False);
  if TVarData(exCell).VDispatch <> nil then begin
    sAddress := exCell.Address;
    repeat
      inc(i);
      Memo1.lines.Add(
        'Соответствие найдено: Cell[' + IntToStr(exCell.Row) + ';' + IntToStr(exCell.Column)
        + '].Text = "' + exCell.Text + '".'
      );
      exCell := exRng.FindNext(After:=exCell);
    until exCell.Address = sAddress;
  end;
 
  if i = 0 then
    Memo1.lines.Add('Ни одного соответствия не найдено.')
  else
    Memo1.lines.Add('Найдено соответствий: ' + IntToStr(i))
  ;
  Memo1.lines.Add('--------------------------------------------------');
 
  //Если требуется, закрываем рабочую книгу.
  //exBook.Close;
 
  //...
 
  //Выход из Excel.
  //exApp.Quit;
end;
Здесь на форму надо положить компоненты: TOpenDialog, TButton, TEdit, TMemo. Для кнопки Button1 создать обработчик события OnClick.
Программа работает так: в Edit1 надо ввести искомый текст, затем нажать кнопку - запустится диалог выбора файла. Выбрать файл *.xls или *.xlsx. Программа запустит Excel, откроет в Excel выбранную рабочую книгу и выполнит поиск заданного текста на первом листе книги. Сведения обо всех обнаруженных совпадениях будут распечатаны в Мемо1.
---
Для того, чтобы запрограммировать поиск в нескольких книгах достаточно взять этот код в качестве основы и добавить перебор книг. Каждую книгу открывать и обрабатывать так, как показано в коде. Если надо добавить обработку всех листов рабочей книги, для этого следует добавить цикл перебора листов:
Delphi
1
2
3
4
5
6
7
8
9
10
var
  j, ... : Integer;
...
begin
...
  for j := 1 to exBook.WorkSheets.Count do begin
    //Очередной лист в рабочей книге.
    exSheet := exBook.WorkSheets[j];
    ...
  end;
1
0 / 0 / 0
Регистрация: 03.01.2012
Сообщений: 57
04.01.2012, 12:19
Mawrat
Спасибо, но хотелось бы искать не из книги Exel, а уже из загруженных книг из Exel в StringGrid. Все, как у вас выше в программе + одновременный поиск во всех открытых гридах и занесения всех строк(в которых поле соответсвует условию поиска) в отдельный грид.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.01.2012, 12:19

Неправильное отображение даты при импорте данных из Excel в DataGridView
Привет Импортирую данные из Excel в DataGridView: private void button1_Click(object sender, EventArgs e) { ...

Ввод данных в TStringGrid
Подскажите как осуществлять ввод данных в ячейки TStringGrid , чтобы потом переносить, после ввода в каждую ячейку, эти данные в другой...

Расчет данных в Tstringgrid по формуле
Здравствуйте! Тема такая, пишу программу для расчета данных по формуле, введенной в компонент Tedit, суть в том, что допустим в эдит...

Импорт данных из Tstringgrid в Word
Ребят, прошу вашей помощи, я физически не успеваю этого сделать, так как на мне висит еще две процедуры, суть в том, чтоб подстроить этот...

Загрузка данных из файла .txt в TStringGrid
Доброго времени суток, уважаемые форумчане! Подскажите пожалуйста, как загрузить данные из txt файла в stringgrid? Гуглил, гуглил, но...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru