Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.25;
Скачать: CL | DM;

Вниз

Экспорт данных в Excel   Найти похожие ветки 

 
Max_   (2003-09-04 12:45) [0]

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


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

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


 
MsGuns ©   (2003-09-04 12:52) [2]

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

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) [3]

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


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

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


 
Zacho ©   (2003-09-04 13:03) [5]


> Max_ (04.09.03 13:01) [4]

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


 
Vlad ©   (2003-09-04 13:04) [6]

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


 
HSolo ©   (2003-09-04 13:18) [7]

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

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


 
MsGuns ©   (2003-09-04 13:25) [8]

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

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

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


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

> 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 ?


 
Sandman25 ©   (2003-09-04 15:31) [10]

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


 
MsGuns ©   (2003-09-04 15:52) [11]

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

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

If the dataset is the master of 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;

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2003.09.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.027 c
14-82387
pasha_676
2003-09-05 13:37
2003.09.25
А что с Mirgames.ru


3-82163
Centurion
2003-09-03 11:50
2003.09.25
Реиндексация парадоксовской БД


3-82162
Hooch
2003-09-03 12:22
2003.09.25
был ли модифицирован DataSet ?


14-82439
Некрофил-затейник__
2003-09-08 09:01
2003.09.25
Человеки помогите найти!


3-82151
Рома
2003-09-03 16:39
2003.09.25
Подскажите как можно IB таблицв в DBF импортнуть?