![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Экспорт в Excel [D5, Access]
BBCHa © (2006-08-16 16:47:00)Всем привет! Есть три таблицы: два, 5 и 15 полей соттветственно. Эти таблицы выгружаются на три разных листа одного эксель файла. Делаю это так:
Excel:=CreateOleObject('Excel.Application');
Excel.Visible:=False;
Excel.Workbooks.Open(ExtractFilePath(Application.ExeName)+'f.xls');
Sheets:=Excel.Workbooks[1].Sheets[1];
k:=2;
frDM.ADOQuerySpisokClient.First;
While Not frDM.ADOQuerySpisokClient.EOF Do
Begin
Sheets.Cells[k,1]:=IntToStr(k-1);
Sheets.Cells[k,3]:=frDM.ADOQuerySpisokClient.FieldByName('Name_Client').AsString ;
frDM.ADOQuerySpisokClient.Next;
Inc(k);
end;
Sheets:=Excel.Workbooks[1].Sheets[2];
k:=5;
Query:=TADOQuery.Create(nil);
Query.Connection:=ADOConnection;
Query.SQL.Text:='SELECT * FROM Front_Contacts';
Query.Open;
Query.First;
While Not Query.EOF Do
Begin
Sheets.Cells[k,1]:=Query.FieldByName('Name_User').AsString;
Sheets.Cells[k,2]:=Query.FieldByName('Name_Filial').AsString;
If FormatDateTime('dd.mm.yyyy',Query.FieldByName('Date_Last').AsDateTime)'30.12.1 899'
then
Sheets.Cells[k,3]:=FormatDateTime('dd.mm.yyyy',Query.FieldByName('Date_Last').As DateTime);
Sheets.Cells[k,7]:=Query.FieldByName('Name_Client').AsString;
Sheets.Cells[k,9]:=Query.FieldByName('Name_Otrasl').AsString;
Sheets.Cells[k,10]:=Query.FieldByName('Name_City').AsString;
Sheets.Cells[k,11]:=Query.FieldByName('Adress').AsString;
Sheets.Cells[k,12]:=Query.FieldByName('Name_Contact').AsString;
Sheets.Cells[k,14]:=Query.FieldByName('Job_Title').AsString;
Sheets.Cells[k,15]:=Query.FieldByName('Phone').AsString;
Sheets.Cells[k,16]:=Query.FieldByName('EMail').AsString;
Sheets.Cells[k,18]:=Query.FieldByName('Comment').AsString;
Query.Next;
Inc(k);
end;
Sheets:=Excel.Workbooks[1].Sheets[3];
k:=5;
Query.Close;
Query.SQL.Text:='SELECT * FROM Front_Journal';
Query.Open;
Query.First;
While Not Query.EOF Do
Begin
Sheets.Cells[k,1]:=Query.FieldByName('Name_User').AsString;
Sheets.Cells[k,2]:=Query.FieldByName('Name_Filial').AsString;
Sheets.Cells[k,3]:=Query.FieldByName('Name_Client').AsString;
Sheets.Cells[k,4]:=Query.FieldByName('Code_Product').AsString;
Sheets.Cells[k,5]:=Query.FieldByName('Name_Product').AsString;
Sheets.Cells[k,7]:=FloatToStr(StrToFloat(FloatToStrF(Query.FieldByName('Summa_Pl an').AsFloat,ffFixed,20,2)));
Sheets.Cells[k,8]:=FormatDateTime('dd.mm.yyyy',Query.FieldByName('Date_Begin').A sDateTime);
Sheets.Cells[k,9]:=FormatDateTime('dd.mm.yyyy',Query.FieldByName('Date_Reshen'). AsDateTime);
Sheets.Cells[k,10]:=Query.FieldByName('Name_Status').AsString;
Sheets.Cells[k,11]:=Query.FieldByName('Name_Otkaz').AsString;
Sheets.Cells[k,12]:=FormatDateTime('dd.mm.yyyy',Query.FieldByName('Date_Prognoz_ Cast').AsDateTime);
If Query.FieldByName('Costs').AsBoolean
Then
Sheets.Cells[k,13]:='îïë';
Sheets.Cells[k,17]:=Query.FieldByName('Comment').AsString;
Query.Next;
Inc(k);
end;
Excel.Workbooks[1].Save;
Excel.Quit;
Делается все очень, просто крайне медлено и тормознуто. Т.е. фактически при количестве записей в таблицах 450, 1000 и 250 соответсвенно процедура отрабатывается за 5-6 часов.
Подскажите, есть ли способ повысить быстродействие? Заранее спасибо.
Lexiy (2006-08-16 17:33:00) [21]да arraydata это variant ... хотя это и так понятно ... момент с датой просто опиши отдельно на иф ... у меня была похожая задача в свое время
Lexiy (2006-08-16 17:29:00) [22]мне не нравится момент вноса данных в яйчейки попробуй вот так ...
// Заполняем массив
Querys.DisableControls;
Querys.First;
While Not Querys.eof Do
Begin
For J := 1 To Querys.FieldDefs.Count Do
Begin
ArrayData[Querys.RecNo, J] :=
Querys.FieldbyName(Querys.FieldDefs.Items[j - 1].DisplayName).value;
End;
Querys.Next;
End;
Querys.EnableControls;
// Левая верхняя ячейка области, в которую будем выводить данные
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;