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