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

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

Экспорт в Excel [D5, Access]


Страницы:   1 2

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;


Страницы:   1 2

Наверх

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