Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 224

/ вопрос решён /

Доброго времени суток, уважаемые эксперты! Подскажите как передать данные из Access в Excel. Как запустить сам Excel разобрался, а вот с отображением ни чего понять не могу. Может , ну если так будет легче, как нибудь сперва загрузить данные в DBGrid , а потом в Excel?что подскажите???

Анучин Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Анучин (статус: Посетитель)
Вопрос отправлен: 23 апреля 2011, 00:26
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: Шичко Игорь

Здравствуйте, Анучин!
Загружать данные в DBGrid имеет смысл, если желаем контролировать данные в выборке.
В общем случае можно напрямую переносить.
Код и описание в приложении.
Вопросы пишите в форум.
Удачи.

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, DB, ADODB, ComObj, StdCtrls;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. ADOConnection1: TADOConnection;
  12. ADOQuery1: TADOQuery;
  13. Button1: TButton;
  14. procedure Button1Click(Sender: TObject);
  15. procedure FormActivate(Sender: TObject);
  16. procedure FormClose(Sender: TObject; var Action: TCloseAction);
  17. private
  18. { Private declarations }
  19. public
  20. { Public declarations }
  21. end;
  22.  
  23. var
  24. Form1: TForm1;
  25. Excel, WorkBook: variant;
  26.  
  27. implementation
  28.  
  29. {$R *.dfm}
  30.  
  31. procedure TForm1.FormActivate(Sender: TObject);
  32. begin
  33.  
  34. end;
  35.  
  36. procedure TForm1.Button1Click(Sender: TObject);
  37. var
  38. i: integer;
  39. Sheet: variant;
  40.  
  41. begin
  42. ADOQuery1.SQL.Clear;
  43.  
  44. ADOQuery1.Open;
  45.  
  46. begin
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55. while ADOQuery1.Eof do
  56. begin
  57.  
  58. Sheet.Range['B' + IntToStr(i)]:= ADOQuery1.FieldByName('pole_2').AsInteger;
  59. Sheet.Range['C' + IntToStr(i)]:= DateToStr(ADOQuery1.FieldByName('pole_3').AsDateTime);
  60.  
  61.  
  62. end;
  63.  
  64.  
  65.  
  66. Excel:= UnAssigned;
  67. end;
  68.  
  69.  
  70. end;
  71.  
  72.  
  73. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  74. begin
  75.  
  76. end;
  77.  
  78. end.
  79.  


Ответ отправил: Шичко Игорь (статус: 9-ый класс)
Время отправки: 23 апреля 2011, 09:51
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 16; последнее сообщение — 26 апреля 2011, 19:09; участников в обсуждении: 3.
min@y™

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['Лист'];)
Анучин

Анучин (статус: Посетитель), 24 апреля 2011, 19:59 [#7]:

Шичко Игорь: строку с оператором if..then добавил, а строки: 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:09 [#16]:

Шичко Игорь: все разобрался.:) Немного надо было допечатоть кода:)
 while not ADOQuery1.Eof do
    begin
    Sheet.Range['A' + IntToStr(i)]:= ADOQuery1.FieldByName('Предмет').AsString;
    ADOQuery1.Next;
    i:=i+1
    end;
Спасибо за помощь!!!!!

26 апреля 2011, 19:10: Статус вопроса изменён на решённый (изменил автор вопроса — Анучин)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:39
Выполнено за 0.04 сек.