|
Вопрос # 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] оказывается не поддерживается
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|