Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Экспорт данных в Excel [D6]


Max_ ©   (2003-09-04 12:45:00) 

Возможно ли организовать быстрый экспорт данных в Excel и как (через BDE) без использования While not Query1.Eof Do - это слишком медленно.


HSolo   (2003-09-04 16:00:00) [1]

Да... Что значит не иметь привычки к master/detail... :) Спасибо.


MsGuns   (2003-09-04 15:52:00) [2]

>HSolo © (04.09.03 15:00) [9]
>Но мне интересно, почему Вы так резко выступили против DisableControls / EnableControls ?

Это не я выступаю:

If the dataset is the masterof a master/detail relationship, calling DisableControls also disables the master/detail relationship. Setting BlockReadSize instead of calling DisableControls updates the detail datasets as you scroll through the dataset, but does not update data-aware controls.

Детальная таблица не реагирует в этом режиме на смену "родительской" записи в мастере. Это приводит к печальным результатам при "сканировании со скачками" (Внешний цикл по мастеру, внутренний - по детализации)

В большинстве случаев, конечно, {Disable|Enable} Controls работает, но в 151 раз выстрелит, и очень больно. Поэтому я советую настоятельно пользоваться другими, более универсальными, методами. Тем более, что с т.з.кодинга и результата это едино.
Не знаю как Вас, а меня учили, что в программировании привычка - не вторая, а первая натура ;))

>Вообще-то я в таких ситуациях предпочитаю что-то вроде:
DBGrid.DataSource := nil;
...
DBGrid.DataSource := DataSource;

Если бы Вы так и посоветовали, я бы и слова не сказал.


Sandman25   (2003-09-04 15:31:00) [3]

А еще желательно отключать Before/AfterScroll...


HSolo   (2003-09-04 15:00:00) [4]

> MsGuns © (04.09.03 13:25) [8]
Всегда неправильно, в любой ситуации? Почему?

Сейчас проверила, как это работает с детальной таблицей. 2 выборки, мастер и деталь, в таблицах 28 и 660 записей соответственно. D5, BDE, таблицы dBaseIII; 2 стандартных DBGrid-а. Тест - тупой цикл по детали:

var w1, w2: integer;
begin
w1 := GetTickCount;
with qDetail do begin
DisableControls;
first;
while not eof do begin
Application.ProcessMessages;
next;
end;
EnableControls;
w2 := GetTickCount;
showmessage(inttostr(w2-w1)+" "+Fields[1].AsString);
end;

2-й тест - то же самое, только без DisableControls / EnableControls. Разница в скорости видна.

Или Вы имеете в виду не это?

Вообще-то я в таких ситуациях предпочитаю что-то вроде:
DBGrid.DataSource := nil;
...
DBGrid.DataSource := DataSource;

Но мне интересно, почему Вы так резко выступили против DisableControls / EnableControls ?


MsGuns   (2003-09-04 13:25:00) [5]

>HSolo © (04.09.03 13:18) [7]
>ВашDataSet.DisableControls;
// тут будет вывод в Excel
ВашDataSet.EnableControls;

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

Правильно так:
dbgrid.datasource.enable := false/true


HSolo   (2003-09-04 13:18:00) [6]

> While not Query1.Eof Do - это слишком медленно.
Данные выводятся в гриде?

ВашDataSet.DisableControls;
// тут будет вывод в Excel
ВашDataSet.EnableControls;


Vlad   (2003-09-04 13:04:00) [7]

>Max_ (04.09.03 13:01) [4]
Ты ж сам сказал While not Query1.Eof Do !
Цикл по датасету.


Zacho   (2003-09-04 13:03:00) [8]


> Max_ (04.09.03 13:01) [4]

В DBGride нетникаких записей, он только работает с записями из подключенного к нему DataSet"а


Max_   (2003-09-04 13:01:00) [9]

Всё понятно, но как цикл FOR применить к записям находящимся в DBGride, ведь там нет свойства Сells или Сols, Rows?


MsGuns   (2003-09-04 12:52:00) [10]

Взято с Колевства Дельфи.

var
ExcelApp, Workbook, Range, Cell1, Cell2, ArrayData : Variant;
TemplateFile : String;
BeginCol, BeginRow, i, j : integer;
RowCount, ColCount : integer;
begin
// Координаты левого верхнего угла области, в которую будем выводить данные
BeginCol := 1;
BeginRow := 5;

// Размеры выводимого массива данных
RowCount := 100;
ColCount := 50;

// Создание Excel
ExcelApp := CreateOleObject("Excel.Application");

// Отключаем реакцию Excel на события, чтобы ускорить вывод информации
ExcelApp.Application.EnableEvents := false;

// Создаем Книгу (Workbook)
// Если заполняем шаблон, то Workbook := ExcelApp.WorkBooks.Add("C:\MyTemplate.xls");
Workbook := ExcelApp.WorkBooks.Add;

// Создаем Вариантный Массив, который заполним выходными данными
ArrayData := VarArrayCreate([1, RowCount, 1, ColCount], varVariant);

// Заполняем массив
for I := 1 to RowCount do
for J := 1 to ColCount do
ArrayData[I, J] := J * 10 + I;

// Левая верхняя ячейка области, в которую будем выводить данные
Cell1 := WorkBook.WorkSheets[1].Cells[BeginRow, BeginCol];
// Правая нижняя ячейка области, в которую будем выводить данные
Cell2 := WorkBook.WorkSheets[1].Cells[BeginRow + RowCount - 1, BeginCol +
ColCount - 1];

// Область, в которую будем выводить данные
Range := WorkBook.WorkSheets[1].Range[Cell1, Cell2];

// А вот и сам вывод данных
// Намного быстрее поячеечного присвоения
Range.Value := ArrayData;

// Делаем Excel видимым
ExcelApp.Visible := true;


Кулюкин Олег aka karaim


Vlad   (2003-09-04 12:52:00) [11]

В ексель можно вставлять целиком массив Variant,
но формировать его придется все равно через полный цикл по Query


Hooch   (2003-09-04 12:49:00) [12]

в ехель вставка производится по одной записи ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо