Форум: "Базы";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];
ВнизЭкспорт данных в 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.012 c