Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.05.2009, 14:52   #1
girz
Пользователь
 
Регистрация: 12.05.2009
Сообщений: 43
По умолчанию Перегон в Excel

Созданно приложение с доступом к базе данных MS Access по технологии ADO используются компоненты ADOConection, ADOTable, DataSource, DBgrid.
Вопрос как вывести данные из DBgrida в Excel. Помогите очень надо код желательно с поиснениями.
girz вне форума Ответить с цитированием
Старый 13.05.2009, 19:19   #2
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

Цитата:
Сообщение от girz Посмотреть сообщение
Вопрос как вывести данные из DBgrida в Excel.
DBGrid не содержит данных. Он их всего лишь отображает.
Поэтому выводить данные будем из датасета.

Ну и как вариант:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
   ExcelApp, Workbook, Range, Cell1, Cell2, ArrayData : Variant;
   StartCol, StartRow, j : integer;
   RowCount, ColCount : Integer;
   n:OleVariant;
begin
   StartCol := 1;
   StartRow := 3;

 // Размеры выводимого массива данных
   RowCount := ADODataSet1.RecordCount;
   ColCount := ADODataSet1.FieldDefs.Count;

 // Создание Excel
   ExcelApp := CreateOleObject( 'Excel.Application' );

 // Отключаем реакцию Excel на события, чтобы ускорить вывод информации
   ExcelApp.Application.EnableEvents := false;

    n := true;
 //  Создаем книгу (Workbook)
   Workbook := ExcelApp.WorkBooks.Add( n );
   ArrayData := VarArrayCreate( [ 0, RowCount, 1, ColCount ], varVariant );

     for j := 1 To ADODataSet1.FieldDefs.Count do
       begin
        ArrayData[ 0, j ] := ADODataSet1.FieldDefs.Items[ j - 1 ].DisplayName;
       end;

 // Заполняем массив
   ADODataSet1.DisableControls;
   ADODataSet1.First;
   while not ADODataSet1.Eof do
     begin
       for j := 1 To ADODataSet1.FieldDefs.Count Do begin
         ArrayData[ ADODataSet1.RecNo, j ] := ADODataSet1.FieldbyName( ADODataSet1.FieldDefs.Items[ j - 1 ].DisplayName ).value;
       end;
       ADODataSet1.Next;
   end;

   ADODataSet1.EnableControls;

//  Левая верхняя ячейка области, в которую будем выводить данные        
  Cell1 := WorkBook.WorkSheets[ 1 ].Cells[ StartRow, StartCol ];
 // Правая нижняя ячейка области, в которую будем выводить данные
   Cell2 := WorkBook.WorkSheets[ 1 ].Cells[ StartRow + RowCount, StartCol + ColCount - 1 ];

 // Область, в которую будем выводить данные
   Range := WorkBook.WorkSheets[ 1 ].Range[ Cell1, Cell2 ];

 //  Вывод данных
   ExcelApp.Application.Cells[ 1, 1 ] := form1.Caption;
   Range.Value := ArrayData;
   ExcelApp.Visible := True;
  end;
edgy вне форума Ответить с цитированием
Старый 13.05.2009, 19:24   #3
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

P.S. Да и чуть совсем не забыл, - для полной работоспособности не забудьте в uses упомянуть ComObj.
edgy вне форума Ответить с цитированием
Старый 14.05.2009, 05:33   #4
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

А могут быть проблемы с перегоном, если таблицы связаны?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 14.05.2009, 07:03   #5
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

В Excel выводится содержимое датасета. Данные естественно могут представлять собой выборку из разных таблиц. Так что не вижу здесь каких-либо проблем.
edgy вне форума Ответить с цитированием
Старый 29.05.2009, 14:35   #6
new_user
Пользователь
 
Регистрация: 07.04.2009
Сообщений: 19
По умолчанию

я немного переделал под свою задачу

Код:
procedure TMain_.export_Click(Sender: TObject);
var
XLApp,Sheet,Colum:Variant;
x, y, i,index: integer;
   ExcelApp, Workbook, Range, Cell1, Cell2, ArrayData : Variant;
   StartCol, StartRow, j : integer;
   RowCount, ColCount : Integer;
   n:OleVariant;
begin
   StartCol := 1;
   StartRow := 3;
   RowCount := module1.ADOTable4.RecordCount;
   ColCount := module1.ADOTable4.FieldDefs.Count;
    // Создание Excel
   ExcelApp := CreateOleObject( 'Excel.Application' );

 // Отключаем реакцию Excel на события, чтобы ускорить вывод информации
   ExcelApp.Application.EnableEvents := false;

    n := true;
 //  Создаем книгу (Workbook)
   Workbook := ExcelApp.WorkBooks.Add( n );
   ArrayData := VarArrayCreate( [ 0, RowCount, 1, ColCount ], varVariant );

     for j := 1 To module1.ADOTable4.FieldDefs.Count do
       begin
        ArrayData[ 0, j ] := module1.ADOTable4.FieldDefs.Items[ j - 1 ].DisplayName;
       end;

 // Заполняем массив
   module1.ADOTable4.DisableControls;
  module1.ADOTable4.First;
   while not module1.ADOTable4.Eof do
     begin
       for j := 1 To module1.ADOTable4.FieldDefs.Count Do begin
         ArrayData[ module1.ADOTable4.RecNo, j ] := module1.ADOTable4.FieldbyName( module1.ADOTable4.FieldDefs.Items[ j - 1 ].DisplayName ).value;
       end;
       module1.ADOTable4.Next;
   end;

   module1.ADOTable4.EnableControls;

//  Левая верхняя ячейка области, в которую будем выводить данные        
  Cell1 := WorkBook.WorkSheets[ 1 ].Cells[ StartRow, StartCol ];
 // Правая нижняя ячейка области, в которую будем выводить данные
   Cell2 := WorkBook.WorkSheets[ 1 ].Cells[ StartRow + RowCount, StartCol + ColCount - 1 ];

 // Область, в которую будем выводить данные
   Range := WorkBook.WorkSheets[ 1 ].Range[ Cell1, Cell2 ];

 //  Вывод данных
   ExcelApp.Application.Cells[ 1, 1 ] := groupbox1.Caption;
   Range.Value := ArrayData;
   ExcelApp.Visible := True;
  end;

 {try
    XLApp := CreateOleObject('Excel.Application'); //открываю excel, но не отображаю его
  except
    MessageDlg('Похоже, что Microsoft Excel не установлен :(', mtError, [mbok], 0);
    exit;
  end;
у меня данные отображаются в дбгриде и название столбцов у меня другое чем в самой таблице, как мне сделать чтобы название как в дбгриде и как мне задать ширину столбцов выводимых в иксель?
new_user вне форума Ответить с цитированием
Старый 29.05.2009, 14:42   #7
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

"дешевле" (в смысле кода) сделать отчет, например, в фастрепорте и заюзать фильтр экспорта в эксель
опять-таки, если контора откажется от экселя и перейдет под ОпенОфис, то останется только новый фильтр экспорта добавить вместо переписывания кучи кода
soleil@mmc вне форума Ответить с цитированием
Старый 29.05.2009, 14:50   #8
new_user
Пользователь
 
Регистрация: 07.04.2009
Сообщений: 19
По умолчанию

сейчас мне это нужно для учебы, по требованиям нужно делать экспорт в исксель
new_user вне форума Ответить с цитированием
Старый 29.05.2009, 14:57   #9
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от new_user Посмотреть сообщение
сейчас мне это нужно для учебы, по требованиям нужно делать экспорт в исксель
ну так ты уточнения способа вывода не делал
и мой вариант решения вполне соответствует заданному вопросу

З.Ы.: когда инфы по прямому экспорту в эксель не было - юзал встроенный в эксель бейсик - запускаешь макрос на запись, делаешь что тебе нужно с колонками, например, потом тормозишь макрос, открываешь на редактирование и все видно какие там используются константы, методы и т.п.
soleil@mmc вне форума Ответить с цитированием
Старый 29.05.2009, 15:05   #10
new_user
Пользователь
 
Регистрация: 07.04.2009
Сообщений: 19
По умолчанию

фастрепорта у меня нет возможности использовать, т.к в универе стоят обрезанные версии delphi и многих компонентов там нету
new_user вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Экспорт из Access в Excel, Экспорт из отчётов в таблицу Excel Kissedbythegod Microsoft Office Access 1 31.05.2008 22:15
очень громоздкие финансовые модели в Excel, а Excel не тянет Ragazza Microsoft Office Excel 7 03.10.2007 20:08
Формирование из excel в ASCII, у меня он формирует по одному клиенту а в Excel нескол Askat Общие вопросы Delphi 0 18.07.2007 06:28
Excel Toxa Компоненты Delphi 2 13.04.2007 13:24
Как вытащить данные из Excel в бд dephi, а потом (после работы с данными) сформировать новый файл excel. Геля БД в Delphi 1 10.04.2007 15:11