| 
| 
 | Вопрос # 5 224/ вопрос решён / | 
 |  Доброго времени суток, уважаемые эксперты! Подскажите как передать данные из Access в Excel. Как запустить сам Excel разобрался, а вот с отображением ни чего понять не могу. Может , ну если так будет легче, как нибудь сперва загрузить данные в DBGrid , а потом в Excel?что подскажите??? 
|  |   Вопрос задал: Анучин (статус: Посетитель)Вопрос отправлен: 23 апреля 2011, 00:26
 Состояние вопроса: решён, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Шичко Игорь Здравствуйте, Анучин!Загружать данные в DBGrid имеет смысл, если желаем контролировать данные в выборке.
 В общем случае можно напрямую переносить.
 Код и описание в приложении.
 Вопросы пишите  в форум.
 Удачи.
 Приложение:Переключить в обычный режим unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, DB, ADODB, ComObj, StdCtrls; type  TForm1 = class(TForm)    ADOConnection1: TADOConnection;    ADOQuery1: TADOQuery;    Button1: TButton;    procedure Button1Click(Sender: TObject);    procedure FormActivate(Sender: TObject);    procedure FormClose(Sender: TObject; var Action: TCloseAction);  private    { Private declarations }  public    { Public declarations }  end; var  Form1: TForm1;  Excel, WorkBook: variant; implementation {$R *.dfm} procedure TForm1.FormActivate(Sender: TObject);begin end; procedure TForm1.Button1Click(Sender: TObject);vari: integer;Sheet: variant; begin  ADOQuery1.SQL.Clear;   ADOQuery1.Open;   begin              while ADOQuery1.Eof do    begin     Sheet.Range['B' + IntToStr(i)]:= ADOQuery1.FieldByName('pole_2').AsInteger;    Sheet.Range['C' + IntToStr(i)]:= DateToStr(ADOQuery1.FieldByName('pole_3').AsDateTime);      end;     Excel:= UnAssigned;    end;  end;  procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);begin end; end. 
|  | Ответ отправил: Шичко Игорь (статус: 9-ый класс)Время отправки: 23 апреля 2011, 09:51
 Оценка за ответ: 5
 |  
 Мини-форум вопросаВсего сообщений: 16; последнее сообщение — 26 апреля 2011, 19:09; участников в обсуждении: 3. 
|   | min@y™ (статус: Доктор наук), 23 апреля 2011, 09:07 [#1]:А погуглить пробовал? Или религия не позволяет? Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Анучин (статус: Посетитель), 23 апреля 2011, 23:32 [#2]:Шичко Игорь: Незнаю почему, хотя DElphi не выдает ошибки при запуске, но в Excel ни чего не отображается.У меня в проге , в списке комбобокса отображаются таблицы, одной базы данных.Поэтому я написал так: 
 ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:= ' select * from '+ ComboBox1.Items[ComboBox1.ItemIndex]; 
ADOQuery1.Open;В таблицах есть столбец "Предмет", поэтому записал вот так: 
  Sheet.Range['S' + IntToStr(i)]:= ADOQuery1.FieldByName('Предмет').AsString;И убрал строки:
 {WorkBook.close;  // закрыли
  Excel.Quit;  // вышли из Excel
  Excel:= UnAssigned;потому что мне надо что бы эксель оставался открытым.Все больше ни чего я не менял, подскажите что надо исправить, что бы таблицы отображались в Excel????
 |  
|   | Шичко Игорь (статус: 9-ый класс), 24 апреля 2011, 08:52 [#3]:1. Попробуйте пройти по шагам. Остановитесь на шаге if ADOQuery1.RecordCount > 0 then   и посмотрите выбираются ли данные.
 2. Имя у таблицы с данными какое? Если оно на русском языке, то SQL-запросом данные из него не выбрать.
 3. если пункты 1 и 2 нормальные, то хорошо бы посмотреть полный код.
 |  
|   | Анучин (статус: Посетитель), 24 апреля 2011, 16:29 [#4]:Шичко Игорь: Имена у таблиц вообще на русском, но я забивал и на английском, то же не работает  Вот полностью код с комбобоксом и кнопкой на Excel: 
 unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, ComObj;
 
type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    Button1: TButton;
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    procedure GetNames();
    procedure ComboBox1Change(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);
 
     private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  Excel, WorkBook: variant;
implementation
 
{$R *.dfm}
 
 procedure TForm1.GetNames();
var
 x: TStrings;
 i: integer;
begin
 x:=TstringList.Create;
 ADOConnection1.GetTableNames(x,false);
 for i := 0 to x.Count - 1 do
 begin
   ComboBox1.Items.Add(x.Strings[i]);
 end;
 ComboBox1.ItemIndex:=-1;
 x.Free;
end;
 
procedure TForm1.ComboBox1Change(Sender: TObject);
 var
 str: string;
begin
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  str:=' select * from '+ ComboBox1.Items[ComboBox1.ItemIndex];
  ADOQuery1.SQL.Add(str);
  ADOQuery1.Open;
end;
 
procedure TForm1.FormShow(Sender: TObject);
begin
 GetNames;
end;
 
///// кнопка на эксел
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
Sheet: variant;
 begin
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Text:= ' select * from '+ ComboBox1.Items[ComboBox1.ItemIndex]; // считываем данные из таблицы запросом
  ADOQuery1.Open;
  Excel:=CreateOleObject('Excel.Application'); // запуск Excel
  Excel.Visible:=True;  // Скрываем Excel (=True, если хотим видеть)
  Workbook:=Excel.Workbooks.Open('C:\Лист.xlsx'); // открываем файл шаблона
  Sheet:= WorkBook.Sheets[1]; // определяем страницу для данных ( можно по имени листа : Sheet:=
WorkBook.Sheets['Лист'];)
  i:=1;  // счетчик строк
  ADOQuery1.First; // переход на первую запись
  while ADOQuery1.Eof do
    begin
     Sheet.Range['A' + IntToStr(i)]:= ADOQuery1.FieldByName('Предмет').AsString;  // записываем ячейки Excel
     Inc(i);  // увеличили счетчик строк
     ADOQuery1.Next;  // перешли на следующую запись
    end;
  WorkBook.Save;  // сохранили
  ADOQuery1.Close;  // закрыли запрос
  end;
 
end. |  
|   | Анучин (статус: Посетитель), 24 апреля 2011, 16:29 [#5]:подскажите что не так??? |  
|   | Шичко Игорь (статус: 9-ый класс), 24 апреля 2011, 19:32 [#6]:Введите строку if ADOQuery1.RecordCount > 0 then
 begin...
 
 Т.е. чтобы файл формировался только при наличии записей.
 Посмотрите идет ли выборка.
 
 Лишняя строка: WorkBook.Sheets['Лист']
   |  
|   | Шичко Игорь (статус: 9-ый класс), 24 апреля 2011, 20:09 [#8]:Поставьте курсор в начале строки if ADOQuery1.RecordCount > 0, запустите программу клавишей F4. Программа остановится на курсоре. Наведите мышкой на ADOQuery1.RecordCount, и отобразится количество отобранных записей в запросе. |  
|   | Анучин (статус: Посетитель), 24 апреля 2011, 20:14 [#9]:показывает что ADOQuery1.RecordCount=4 |  
|   | Шичко Игорь (статус: 9-ый класс), 24 апреля 2011, 20:18 [#10]:Идем дальше по шагам (F8) и смотрим строку Sheet.Range['A' + IntToStr(i)]:= ADOQuery1.FieldByName('Предмет').AsString;  - какие данные записываются в файл |  
|   | Анучин (статус: Посетитель), 24 апреля 2011, 20:30 [#11]:ну если я все правильно сделал, то результат такой: когда навожу на  Sheet, то показывает  Sheet=unassigned,
 когда на AsString , то показывает ADOQuery1.FieldByName('Предмет').AsString= inaccessible value. ну это если я правильно понял.
 |  
|   | Шичко Игорь (статус: 9-ый класс), 24 апреля 2011, 21:24 [#12]:Sheet не должно быть unassigned на этом этапе, также и ADOQuery1.FieldByName('Предмет').AsString= inaccessible должно показывать строку данных. |  
|   | Шичко Игорь (статус: 9-ый класс), 24 апреля 2011, 21:36 [#13]:Можно перейти к рассмотрению строк   Workbook:=Excel.Workbooks.Open('C:\Лист.xlsx'); Sheet:= WorkBook.Sheets[1];
 Переменная Sheet должна показывать в отладчике что-то типа $1F0D101E
 |  
|   | Анучин (статус: Посетитель), 24 апреля 2011, 21:40 [#14]:ну когда я нажимаю на F8 то открывается вкладка Project1.dpr и там пошагово запускаются вот эти строки: begin
 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.Run;
 а после открывается сам проект. а когда открываю вкладку Unit1 и навожу на строку : Sheet.Range['A' + IntToStr(i)]:= ADOQuery1.FieldByName('Предмет').AsString; то показывается все то что писал в предыдущем сообщении
 |  
|   | Шичко Игорь (статус: 9-ый класс), 24 апреля 2011, 21:45 [#15]:Поставьте курсор перед Workbook:=Excel.Workbooks.Open('C:\Лист.xlsx'); Нажимаем F4. (Пункт меню Run - Run to Cursor)
 Останавливаемся.
 Шагаем по шагам F8.
 Смотрим переменные Sheet, ADOQuery1.FieldByName('Предмет').AsString.
 |  26 апреля 2011, 19:10: Статус вопроса изменён на решённый (изменил автор вопроса — Анучин) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |