Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.011 c
3-82073
Centurion
2003-09-05 14:29
2003.09.25
Ошибка БД


7-82529
Snake7
2003-07-14 18:35
2003.09.25
Как узнать серийный номер процессора?


7-82532
Dionis
2003-07-14 16:05
2003.09.25
Опять CDROM


1-82233
MAPIIIAJL
2003-09-05 09:37
2003.09.25
Как добраться программно к версии ПО


3-82082
Tommy
2003-09-04 16:02
2003.09.25
ADO





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский