|
Вопрос # 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);
- var
- i: 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: Статус вопроса изменён на решённый (изменил автор вопроса — Анучин)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|