Модераторы: MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Содержимое Table скинуть в Excel 2003, Delphi 7 (пример из фака не пашет) 
:(
    Опции темы
Jey_k
Дата 10.11.2004, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


WEB-командир
****


Профиль
Группа: Комодератор
Сообщений: 4149
Регистрация: 16.11.2003
Где: Москва

Репутация: нет
Всего: 61



Сабж. Заказчику приспичило.


--------------------
PM MAIL WWW   Вверх
Vit
Дата 10.11.2004, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Какой именно пример из FAQ?

Ты пробовал подсоединится через ADO, создать SQL запросом в Excel таблицу и перенести? Как он может не работать?


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Jey_k
Дата 10.11.2004, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


WEB-командир
****


Профиль
Группа: Комодератор
Сообщений: 4149
Регистрация: 16.11.2003
Где: Москва

Репутация: нет
Всего: 61



Vit
То что скачивал в DelphistsFAQ мне не помогло к сожалению.
Например на CreateOleObject вообще ругается.
Буду благодарен примерчику.



--------------------
PM MAIL WWW   Вверх
Satana
Дата 10.11.2004, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 564
Регистрация: 15.9.2004
Где: Ставрополь, СЗ ра йон

Репутация: нет
Всего: 5



Jey_k А ты добавлял библиотеку comobj когда использовал CreateOleObject?


--------------------
 Работай на себя 
www.abalentsev.com - Сайт портфолио.
www.pokushau.ru - Рецепты со всего мира.
PM MAIL WWW ICQ   Вверх
Jey_k
Дата 10.11.2004, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


WEB-командир
****


Профиль
Группа: Комодератор
Сообщений: 4149
Регистрация: 16.11.2003
Где: Москва

Репутация: нет
Всего: 61



Satana
Не-а.
Завтра попробую. А можно примерчик, кратко и лаконично?


--------------------
PM MAIL WWW   Вверх
Fantasist
Дата 10.11.2004, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Jey_k, так не пойдет. Скажи, конкретно, что за код ты пытался использовать и с какой ошибкой он у тебя валиться. Потому как "не пашет" слабо отражает суть происходящего.

Могу разве что еще посоветовать (кроме перечисленных в FAQ) посмотреть F1Book (обычно есть на закладке то ли ActiveX, то ли Samples). С помощью него тоже неплохо получаеться.



--------------------
Волны гасят ветер...
PM MAIL   Вверх
Jey_k
Дата 11.11.2004, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


WEB-командир
****


Профиль
Группа: Комодератор
Сообщений: 4149
Регистрация: 16.11.2003
Где: Москва

Репутация: нет
Всего: 61



Fantasist
Млин, да я вообще не знаю как это организовывается.
У меня на форме DBGrid связанный через Table с .db базой.

Вписав код из ФАКА получил кучу ошибок.


Мне нужно знать какие компоненты еще должны присутствовать, какие библиотеки нужно подключить и собственно код покороче.


Код

unit DBGridExportToExcel;  

interface  

uses  
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,  
 ExtCtrls, StdCtrls, ComCtrls, DB, IniFiles, Buttons, dbgrids, ADOX_TLB, ADODB;  


type TScrollEvents = class  
      BeforeScroll_Event: TDataSetNotifyEvent;  
      AfterScroll_Event: TDataSetNotifyEvent;  
      AutoCalcFields_Property: Boolean;  
 end;  

procedure DisableDependencies(DataSet: TDataSet; var ScrollEvents: TScrollEvents);  
procedure EnableDependencies(DataSet: TDataSet; ScrollEvents: TScrollEvents);  
procedure DBGridToExcelADO(DBGrid: TDBGrid; FileName: string; SheetName: string);  


implementation  

//Support procedures: I made that in order to increase speed in  
//the process of scanning large amounts  
//of records in a dataset  

//we make a call to the "DisableControls" procedure and then disable the "BeforeScroll" and  
//"AfterScroll" events and the "AutoCalcFields" property.  
procedure DisableDependencies(DataSet: TDataSet; var ScrollEvents: TScrollEvents);
begin
 with DataSet do
   begin
     DisableControls;
     ScrollEvents := TScrollEvents.Create();
     with ScrollEvents do
       begin
         BeforeScroll_Event := BeforeScroll;
         AfterScroll_Event := AfterScroll;
         AutoCalcFields_Property := AutoCalcFields;
         BeforeScroll := nil;
         AfterScroll := nil;
         AutoCalcFields := False;
       end;
   end;
end;

//we make a call to the "EnableControls" procedure and then restore
// the "BeforeScroll" and "AfterScroll" events and the "AutoCalcFields" property.

procedure EnableDependencies(DataSet: TDataSet; ScrollEvents: TScrollEvents);
begin
 with DataSet do
   begin
     EnableControls;
     with ScrollEvents do
       begin
         BeforeScroll := BeforeScroll_Event;
         AfterScroll := AfterScroll_Event;
         AutoCalcFields := AutoCalcFields_Property;
       end;
   end;
end;

//This is the procedure which make the work:  

procedure DBGridToExcelADO(DBGrid: TDBGrid; FileName: string; SheetName: string);  
var  
 cat: _Catalog;  
 tbl: _Table;  
 col: _Column;  
 i: integer;  
 ADOConnection: TADOConnection;  
 ADOQuery: TADOQuery;  
 ScrollEvents: TScrollEvents;  
 SavePlace: TBookmark;  
begin  
 //  
 //WorkBook creation (database)  
 cat := CoCatalog.Create;  
 cat._Set_ActiveConnection('Provider=Microsoft.Jet.OLEDB.4.0; Data Source=' + FileName + ';Extended Properties=Excel 8.0');  
 //WorkSheet creation (table)  
 tbl := CoTable.Create;  
 tbl.Set_Name(SheetName);  
 //Columns creation (fields)  
 DBGrid.DataSource.DataSet.First;  
 with DBGrid.Columns do  
   begin  
     for i := 0 to Count - 1 do  
       if Items[i].Visible then  
       begin  
         col := nil;  
         col := CoColumn.Create;  
         with col do  
           begin  
             Set_Name(Items[i].Title.Caption);  
             Set_Type_(adVarWChar);  
           end;  
         //add column to table  
         tbl.Columns.Append(col, adVarWChar, 20);  
       end;  
   end;  
 //add table to database  
 cat.Tables.Append(tbl);  

 col := nil;  
 tbl := nil;  
 cat := nil;  

 //exporting  
 ADOConnection := TADOConnection.Create(nil);  
 ADOConnection.LoginPrompt := False;  
 ADOConnection.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0; Data Source=' + FileName + ';Extended Properties=Excel 8.0';  
 ADOQuery := TADOQuery.Create(nil);  
 ADOQuery.Connection := ADOConnection;  
 ADOQuery.SQL.Text := 'Select * from [' + SheetName + '$]';  
 ADOQuery.Open;  


 DisableDependencies(DBGrid.DataSource.DataSet, ScrollEvents);  
 SavePlace := DBGrid.DataSource.DataSet.GetBookmark;  
 try  
 with DBGrid.DataSource.DataSet do  
   begin  
     First;  
     while not Eof do  
       begin  
         ADOQuery.Append;  
         with DBGrid.Columns do  
           begin  
             ADOQuery.Edit;  
             for i := 0 to Count - 1 do  
               if Items[i].Visible then  
                 begin  
                   ADOQuery.FieldByName(Items[i].Title.Caption).AsString := FieldByName(Items[i].FieldName).AsString;  
                 end;  
             ADOQuery.Post;  
           end;  
         Next;  
       end;  
   end;  

 finally  
 DBGrid.DataSource.DataSet.GotoBookmark(SavePlace);  
 DBGrid.DataSource.DataSet.FreeBookmark(SavePlace);  
 EnableDependencies(DBGrid.DataSource.DataSet, ScrollEvents);  

 ADOQuery.Close;  
 ADOConnection.Close;  

 ADOQuery.Free;  
 ADOConnection.Free;  

 end;  

end;  

end.  



Какую-то из библиотек вообще компилятор не увидел


--------------------
PM MAIL WWW   Вверх
Satana
Дата 11.11.2004, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 564
Регистрация: 15.9.2004
Где: Ставрополь, СЗ ра йон

Репутация: нет
Всего: 5



ну смотри как у меня это сделано:
Код

var
txt, Excel,WB:variant;

begin
  Excel:=CreateOleObject('Excel.Application'); //Связываем объект
  Excel.WorkBooks.Open(OpenDialog1.FileName); //Загружаем книгу
  WB:=Excel.WorkBooks[1].WorkSheets[1]; //Устанавливаем первый лист первой книги.
//Теперь мона читать и писать в эксель
WB.cells[1,1]:='чонить'; //Добавили в первую колонку первую строку значение.
//И точно так же мона читать из ячеек
txt:=WB.cells[1,1];

end;



--------------------
 Работай на себя 
www.abalentsev.com - Сайт портфолио.
www.pokushau.ru - Рецепты со всего мира.
PM MAIL WWW ICQ   Вверх
Jey_k
Дата 11.11.2004, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


WEB-командир
****


Профиль
Группа: Комодератор
Сообщений: 4149
Регистрация: 16.11.2003
Где: Москва

Репутация: нет
Всего: 61



Satana
Хорошо, при этом какие библиотеки и компоненты нужны?
И еще адресация ячеек DBGrid не помешает.


--------------------
PM MAIL WWW   Вверх
<Spawn>
Дата 11.11.2004, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: нет
Всего: 64



Jey_k Ни какие компоненты не нужны, разве что подключи модуль ComObj. Этот называется позднее связывание.

Цитата
И еще адресация ячеек DBGrid не помешает.


А зачем это? DBGrid предназначена для отображения данных, что не раз освещалось на форуме. Делай обычный цикл по набору данных, на подобии этого:

Код

CurrentRow := 1;
with Query1 do
begin
 First;
 while not Eof do
 begin
   WB.cells[CurrentRow, 1] := FieldByName('SomeField').AsString;
   {Либо если у тебя нескольо ячеек можно сделать так
    for i := 0 to FeldsCount - 1 do
      WB.cells[CurrentRow, i] := Feilds[i];}
   Inc(CurrentRow);
   Next;
 end;
end;


Писал без Delphi, так что могут быть ошибки smile

Это сообщение отредактировал(а) <Spawn> - 11.11.2004, 11:58


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Satana
Дата 11.11.2004, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 564
Регистрация: 15.9.2004
Где: Ставрополь, СЗ ра йон

Репутация: нет
Всего: 5



Jey_k Набор библиотек стандартный при создании нового проекта + comobj и все...

А на счет адресации ячеек <Spawn> правильно сказал во первых а во вторых ну не ужели низя самому проверить или хелп почитать?


--------------------
 Работай на себя 
www.abalentsev.com - Сайт портфолио.
www.pokushau.ru - Рецепты со всего мира.
PM MAIL WWW ICQ   Вверх
Jey_k
Дата 11.11.2004, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


WEB-командир
****


Профиль
Группа: Комодератор
Сообщений: 4149
Регистрация: 16.11.2003
Где: Москва

Репутация: нет
Всего: 61



<Spawn>
Насколько я понял надо Query на форму кидать, связывать его с Table и еще не забыть comobj в uses добавить


--------------------
PM MAIL WWW   Вверх
Satana
Дата 12.11.2004, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 564
Регистрация: 15.9.2004
Где: Ставрополь, СЗ ра йон

Репутация: нет
Всего: 5



Примерно так...


--------------------
 Работай на себя 
www.abalentsev.com - Сайт портфолио.
www.pokushau.ru - Рецепты со всего мира.
PM MAIL WWW ICQ   Вверх
<Spawn>
Дата 12.11.2004, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: нет
Всего: 64



Цитата(Jey_k @ 11.11.2004, 14:21)
<Spawn>
Насколько я понял надо Query на форму кидать, связывать его с Table и еще не забыть comobj в uses добавить

Не совсемsmile Я привел пример для Query. Но если же ты используешь Table, то воспользуйся его методами для навигации по набору данных. Вся идея состоит в том, что тебе нужно перебрать весь имющийся набор данных и на каждой итерации цикла добавлять запись в таблицу Excel.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Jey_k
Дата 12.11.2004, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


WEB-командир
****


Профиль
Группа: Комодератор
Сообщений: 4149
Регистрация: 16.11.2003
Где: Москва

Репутация: нет
Всего: 61



Цитата(Satana @ 11.11.2004, 08:32)
var
txt, Excel,WB:variant;

begin
  Excel:=CreateOleObject('Excel.Application'); //Связываем объект
  Excel.WorkBooks.Open(OpenDialog1.FileName); //Загружаем книгу
  WB:=Excel.WorkBooks[1].WorkSheets[1]; //Устанавливаем первый лист первой книги.
//Теперь мона читать и писать в эксель
WB.cells[1,1]:='чонить'; //Добавили в первую колонку первую строку значение.
//И точно так же мона читать из ячеек
txt:=WB.cells[1,1];

end;


А к Excel так обращаемся.
Так все таки как адресовать DBGrid по ячейкам?
Или остается юзать Table? Но тоже как? Там полей не 2 и не 3 а около 70



--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0875 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.