Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 290

/ вопрос открыт /

Добрый день, господа!
Уже однажды получив помощь от экспертов, хочу попросить помощь по такому вопросу. Для работы загружаю данные из Excel-таблиц (аж 18 штук!) в соответствующие StringGrid'ы.
Не придумав другого, для удобства обращения в дальнейшем, пересохраняю все содержимое в многомерный массив (5-ти мерный). Как мне теперь освободиться в памяти от таблиц и можно ли убрать StringGrid'ы из программы? Заранее благодарен всем, кто откликнется в этот ранний час.

Драганов Василий Михайлович Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Драганов Василий Михайлович (статус: Посетитель)
Вопрос отправлен: 1 февраля 2007, 07:35
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Иусов Сергей Ник.

Здравствуйте, Драганов Василий Михайлович!
Непонятно как вы загружаете данные из Excel.
Я представил себе это так:
1. Создаем экземпляр Excel.
2. Открываем нужный файл
3. Перегружаем данные в StringGrid
4. Перегружаем данные в массив.

А почему бы не выбросить пункт 3 и грузить данные прямо в массив из Excel? От этого, ИХМО, не изменяется конечный результат, но от StringGrid'ов избавляемся полностью.
И добавим пару пунктиков
5. Закрываем файл в Excel
6. Уничтожаем экземпляр Excel.

Это при подходе с использованием массива. Но я бы порекоммендовал грузить данные не в массив, а в простейшую базу данных. Но это, как говорится, совсем другая история ;)

Ответ отправил: Иусов Сергей Ник. (статус: 3-ий класс)
Время отправки: 1 февраля 2007, 07:47
Оценка за ответ: 5

Комментарий к оценке: Большое спасибо!

Ответ #2. Отвечает эксперт: Вадим К

Добавлю к предыдущему ответу слудующее.
База - это класно, но если данные постоянно обновляются и меняются, то смысла писать в базу не вижу. Хотя, если человек хорошо с sql дружит, то в это случае скорость разработки программы возрастает в разы.

И второе. С Excel'я можно импортировать как поячеечно, так и сразу целым массивом (тобыш весь лист сразу в массив). Так вот, запрос одной ячейки чуточку быстрее, чем сразу всего массива. Если вы запрашиваете 10 ячеек, то запрос "массивом" будет работать с такой же скоростью, как и запрос одной ячейки, а поячеечный - в 10 раз медленее. Возможно, вы скажете, если я буду захватывать прямоугольны массив, то там будет несколько ячеек, которые я не использую - ничего, десяток лишних неиспользуемых байт в нашем случае лучше, чем медленая работа.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 1 февраля 2007, 11:47
Оценка за ответ: 4


Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 1 февраля 2007, 08:20; участников в обсуждении: 2.
Драганов Василий Михайлович

Драганов Василий Михайлович (статус: Посетитель), 1 февраля 2007, 08:04 [#1]:

Вот фрагмент загрузки из Excel-файла. Как мне грузить сразу в массив, а не в StringGrid?

// АвтоЗагрузка таблиц из Excel
procedure TForm1.FormCreate(Sender: TObject);
var
WorkBk : _WorkBook;
WorkSheet : _WorkSheet;
K, R, X, Y,z,t,f,d,h: Integer;
IIndex : OleVariant;
RangeMatrix : Variant;
NomFich : WideString;
begin
bmp:=TBitMap.Create;
bmp1:=TBitMap.Create;
bmp2:=TBitMap.Create;

// Здесь надо указать имя таблицы и место ее расположения (каталог)
NomFich := DFPath+'FS_curves.xls';
IIndex := 1;
XLApp.Connect;
// Открываем файл Excel
XLApp.WorkBooks.Open(NomFich,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,0);
WorkBk := XLApp.WorkBooks.Item[IIndex];

// 1) 100_1_1
WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;
X := 78;
Y := 11;
StringGrid1.ColCount := Y;
RangeMatrix := WorkSheet.Range['A1',WorkSheet.Cells.Item[X,Y]].Value2;
K := 1;
repeat
for R := 1 to Y do
StringGrid1.Cells[(R - 1),(K - 1)] := RangeMatrix[K,R];
Inc(K,1);
StringGrid1.RowCount := K - 1;
until K > X;
RangeMatrix := Unassigned;
StringGrid1.Visible:=False;
Драганов Василий Михайлович

Драганов Василий Михайлович (статус: Посетитель), 1 февраля 2007, 08:11 [#2]:

Вот фрагмент загрузки из Excel-файла. Как мне грузить сразу в массив, а не в StringGrid?

// АвтоЗагрузка таблиц из Excel
procedure TForm1.FormCreate(Sender: TObject);
var
WorkBk : _WorkBook;
WorkSheet : _WorkSheet;
K, R, X, Y,z,t,f,d,h: Integer;
IIndex : OleVariant;
RangeMatrix : Variant;
NomFich : WideString;
begin
bmp:=TBitMap.Create;
bmp1:=TBitMap.Create;
bmp2:=TBitMap.Create;

// Здесь надо указать имя таблицы и место ее расположения (каталог)
NomFich := DFPath+'FS_curves.xls';
IIndex := 1;
XLApp.Connect;
// Открываем файл Excel
XLApp.WorkBooks.Open(NomFich,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,0);
WorkBk := XLApp.WorkBooks.Item[IIndex];

// 1) 100_1_1
WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;
X := 78;
Y := 11;
StringGrid1.ColCount := Y;
RangeMatrix := WorkSheet.Range['A1',WorkSheet.Cells.Item[X,Y]].Value2;
K := 1;
repeat
for R := 1 to Y do
StringGrid1.Cells[(R - 1),(K - 1)] := RangeMatrix[K,R];
Inc(K,1);
StringGrid1.RowCount := K - 1;
until K > X;
RangeMatrix := Unassigned;
StringGrid1.Visible:=False;
Иусов Сергей Ник.

Иусов Сергей Ник. (статус: 3-ий класс), 1 февраля 2007, 08:19 [#3]:

а если так
[CODE]
var
Data:Variant;
....
// 1) 100_1_1
WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;
X := 78;
Y := 11;
//StringGrid1.ColCount := Y;
Data:=VarArrayCreate([1,X,1,Y],varVariant)
//RangeMatrix :=
Data:=WorkSheet.Range['A1',WorkSheet.Cells.Item[X,Y]];//.Value2;
//Вот на этот момент в массиве Data по идее
//должны лежать данные из области листа Excel,
//причем в соответствии с типами данных
{
//Ниже - лишнее :)
K := 1;
repeat
for R := 1 to Y do
StringGrid1.Cells[(R - 1),(K - 1)] := RangeMatrix[K,R];
Inc(K,1);
StringGrid1.RowCount := K - 1;
until K > X;
RangeMatrix := Unassigned;
StringGrid1.Visible:=False;}
[/CODE]

Давненько я не занимался загрузкой данных из Excel, поэтому могут быть и ошибки, не тестировал. Но, насколько мне не изменяет мой склероз, делал я именно по такому принципу.
Иусов Сергей Ник.

Иусов Сергей Ник. (статус: 3-ий класс), 1 февраля 2007, 08:20 [#4]:

хм.. тег [CODE] оказывается не поддерживается :)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:38
Выполнено за 0.03 сек.