Delphi adoquery в excel

Ну вот не долго думая, подошла вторая часть по работе с ADO в DELPHI на примере БД — MS Excel. В данной статье мы рассмотрим добавление и редактирование данных, так как с удалением тут возникли проблемы, в связи с тем, что данный драйвер не поддерживает удаление, ну с удалением мы что-нибудь подумаем. Сразу хочу сказать, что необходимо еще одно поле в нашей Excel-книги — id, и нам придется вручную его заполнять, что не есть хорошо, но ничего тут сложного нету, просто при инициализации данных, мы просто получаем количество записей в нашей БД, а затем при добавлении добавляем это значение в поле id. Вот и у нас будет получаться уникальное значение, что поможет нам при редактировании. Тут как всегда, думаю что писать на OnCreate нашей главной формы понятно, обычный запрос, только затем еще необходимо получить количество записей в нашей БД, что мы делаем с помощью RecordCount. Смотрим код события OnCreate формы ниже

procedure TForm1.FormCreate(Sender: TObject);
begin
try
id:=1;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM [Лист1$]');
ADOQuery1.Active:=True;
id_count:=ADOQuery1.RecordCount+1;
except
on e:Exception do
end;
end;

Для добавления данных все тоже самое, что и было в ADO с MS Access, только здесб повторюсь надо учитывать id вручную нам, в а MS Access все было подругому, там был счетчик, что облегчало нам работу. Код добавления смотрим ниже

procedure TForm1.Button1Click(Sender: TObject);
begin
try
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('INSERT INTO [Лист1$] (ФИО,Оценка,id) VALUES(''Иванов Иван Иванович'',5,'+IntToStr(id_count)+')');
ADOQuery1.ExecSQL;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM [Лист1$]');
ADOQuery1.Active:=True;
except
on e:Exception do
end;
end;

Ну я тут еще сделал дополнительный запрос, для обновления данных в TDBGrid.Для редактирования данных нам надо получить сначала id, для этого на событие компонента TDBGrid OnCellClick напишем

procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
id:=ADOQuery1.Fields.Fields[2].AsInteger;
end;

У меня id поле находится в книге Excel в 3 столбце, но так как нумерация в ADO столбцов начинается с 0, то я указал Fields[2]. Для редактирования данных применим туже технологию, что и в случае с MS Access

procedure TForm1.Button2Click(Sender: TObject);
begin
try
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('UPDATE [Лист1$] SET ФИО=''Петров Петр Петрович'',Оценка=10 WHERE id=:pid');
ADOQuery1.Parameters.ParamByName('pid').Value:=id;
ADOQuery1.ExecSQL;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM [Лист1$]');
ADOQuery1.Active:=True;
except
on e:Exception do
end;
end;

И также как видем, дополнительный запрос на обновления данных, id у нас уже получен, так что все обновиться. Да и не забыли ведь, что в комоненте TADOQuery задайте в свойстве Parameters новый параметр — pid с типом данных ftInteger. Ну и наконец-то попробуем какой-нибудь не большой поиск организовать, здесь я использовал параметр SQL-запроса — LIKE, то есть найдет все записи с совпадениями, что мы указываем. Смотрим код ниже

procedure TForm1.Button3Click(Sender: TObject);
begin
try
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM [Лист1$] WHERE ФИО LIKE ''%Иванов%''');
ADOQuery1.Active:=True;
except
on e:Exception do
end;
end;

Можно организовать поиск по полному совпадению просто через WHERE, но пока что так. Теперь понимаете, что использовать MS Excel в качестве БД тут не логично, много чего вручную контролировать нужно, ограниченное количество записей, да и с удалением проблемы, но зато отлично тут можно написать конвертацией данных, а также экспорт в Excel например или в MS Access из MS Excel. Но мы пока что займемся экспортом в Excel, а затем напишем свой конвертатор. Но это в следующий частях про MS Excel как БД в Delphi.

Содержание

  1. Работа с ADO в Delphi на примере БД MS Excel. Часть 2
  2. Editing Excel Sheets With Delphi and ADO
  3. How to Connect to Microsoft Excel
  4. Data Transfer Using ADO
  5. The ConnectionString Magic
  6. Excel через ado delphi
  7. Работа с ADO в Delphi на примере БД MS Excel. Часть 2

Работа с ADO в Delphi на примере БД MS Excel. Часть 2

Ну вот не долго думая, подошла вторая часть по работе с ADO в DELPHI на примере БД — MS Excel. В данной статье мы рассмотрим добавление и редактирование данных, так как с удалением тут возникли проблемы, в связи с тем, что данный драйвер не поддерживает удаление, ну с удалением мы что-нибудь подумаем. Сразу хочу сказать, что необходимо еще одно поле в нашей Excel-книги — id, и нам придется вручную его заполнять, что не есть хорошо, но ничего тут сложного нету, просто при инициализации данных, мы просто получаем количество записей в нашей БД, а затем при добавлении добавляем это значение в поле id. Вот и у нас будет получаться уникальное значение, что поможет нам при редактировании. Тут как всегда, думаю что писать на OnCreate нашей главной формы понятно, обычный запрос, только затем еще необходимо получить количество записей в нашей БД, что мы делаем с помощью RecordCount. Смотрим код события OnCreate формы ниже

Для добавления данных все тоже самое, что и было в ADO с MS Access, только здесб повторюсь надо учитывать id вручную нам, в а MS Access все было подругому, там был счетчик, что облегчало нам работу. Код добавления смотрим ниже

Ну я тут еще сделал дополнительный запрос, для обновления данных в TDBGrid.Для редактирования данных нам надо получить сначала id, для этого на событие компонента TDBGridOnCellClick напишем

У меня id поле находится в книге Excel в 3 столбце, но так как нумерация в ADO столбцов начинается с 0, то я указал Fields[2]. Для редактирования данных применим туже технологию, что и в случае с MS Access

И также как видем, дополнительный запрос на обновления данных, id у нас уже получен, так что все обновиться. Да и не забыли ведь, что в комоненте TADOQuery задайте в свойстве Parameters новый параметр — pid с типом данных ftInteger. Ну и наконец-то попробуем какой-нибудь не большой поиск организовать, здесь я использовал параметр SQL-запроса — LIKE, то есть найдет все записи с совпадениями, что мы указываем. Смотрим код ниже

Можно организовать поиск по полному совпадению просто через WHERE, но пока что так. Теперь понимаете, что использовать MS Excel в качестве БД тут не логично, много чего вручную контролировать нужно, ограниченное количество записей, да и с удалением проблемы, но зато отлично тут можно написать конвертацией данных, а также экспорт в Excel например или в MS Access из MS Excel. Но мы пока что займемся экспортом в Excel, а затем напишем свой конвертатор. Но это в следующий частях про MS Excel как БД в Delphi.

Источник

Editing Excel Sheets With Delphi and ADO

Methods for Transferring Data Between Excel and Delphi

This step-by-step guide describes how to connect to Microsoft Excel, retrieve sheet data, and enable editing of the data using the DBGrid. You’ll also find a list of the most common errors that might appear in the process, plus how to deal with them.

What’s Covered Below:

  • Methods for transferring data between Excel and Delphi. How to connect to Excel with ADO (ActiveX Data Objects) and Delphi.
  • Creating an Excel spreadsheet editor using Delphi and ADO
  • Retrieving the data from Excel. How to reference a table (or range) in an Excel workbook.
  • A discussion on Excel field (column) types
  • How to modify Excel sheets: edit, add and delete rows.
  • Transferring data from a Delphi application to Excel. How to create a worksheet and fill it with custom data from an MS Access database.

How to Connect to Microsoft Excel

Microsoft Excel is a powerful spreadsheet calculator and data analysis tool. Since rows and columns of an Excel worksheet closely relate to the rows and columns of a database table, many developers find it appropriate to transport their data into an Excel workbook for analysis purposes; and retrieve data back to the application afterwards.

The most commonly used approach to data exchange between your application and Excel is Automation. Automation provides a way to read Excel data using the Excel Object Model to dive into the worksheet, extract its data, and display it inside a grid-like component, namely DBGrid or StringGrid.

Automation gives you the greatest flexibility for locating the data in the workbook as well as the ability to format the worksheet and make various settings at run time.

To transfer your data to and from Excel without Automation, you can use other methods such as:

  • Write data into a comma-delimited text file, and let Excel parse the file into cells
  • Transfer data using DDE (Dynamic Data Exchange)
  • Transfer your data to and from a worksheet using ADO

Data Transfer Using ADO

Since Excel is JET OLE DB compliant, you can connect to it with Delphi using ADO (dbGO or AdoExpress) and then retrieve the worksheet’s data into an ADO dataset by issuing an SQL query (just like you would open a dataset against any database table).

In this way, all the methods and features of the ADODataset object are available to process the Excel data. In other words, using the ADO components let you build an application that can use an Excel workbook as the database. Another important fact is that Excel is an out-of-process ActiveX server. ADO runs in-process and saves the overhead of costly out-of-process calls.

When you connect to Excel using ADO, you can only exchange raw data to and from a workbook. An ADO connection cannot be used for sheet formatting or implementing formulas to cells. However, if you transfer your data to a worksheet that is pre-formatted, the format is maintained. After the data is inserted from your application to Excel, you can carry out any conditional formatting using a (pre-recorded) macro in the worksheet.

You can connect to Excel using ADO with the two OLE DB Providers that are a part of MDAC: Microsoft Jet OLE DB Provider or Microsoft OLE DB Provider for ODBC Drivers. We’ll focus on Jet OLE DB Provider, which can be used to access data in Excel workbooks through installable Indexed Sequential Access Method (ISAM) drivers.

Tip: See the Beginners Course to Delphi ADO Database Programming if you’re new to ADO.

The ConnectionString Magic

The ConnectionString property tells ADO how to connect to the datasource. The value used for ConnectionString consists of one or more arguments ADO uses to establish the connection.

In Delphi, the TADOConnection component encapsulates the ADO connection object; it can be shared by multiple ADO dataset (TADOTable, TADOQuery, etc.) components through their Connection properties.

In order to connect to Excel, a valid connection string involves only two additional pieces of information — the full path to the workbook and the Excel file version.

A legitimate connection string could look like this:

When connecting to an external database format supported by the Jet, the extended properties for the connection needs to be set. In our case, when connecting to an Excel «database,» extended properties are used to set the Excel file version.

For an Excel95 workbook, this value is «Excel 5.0» (without the quotes); use «Excel 8.0» for Excel 97, Excel 2000, Excel 2002, and ExcelXP.

Important: You must use the Jet 4.0 Provider since Jet 3.5 does not support the ISAM drivers. If you set the Jet Provider to version 3.5, you’ll receive the «Couldn’t find installable ISAM» error.

Another Jet extended property is «HDR=». «HDR=Yes» means that there is a header row in the range, so the Jet will not include the first row of the selection into the dataset. If «HDR=No» is specified, then the provider will include the first row of the range (or named range) into the dataset.

The first row in a range is considered to be the header row by default («HDR=Yes»). Therefore, if you have column heading, you do not need to specify this value. If you do not have column headings, you need to specify «HDR=No».

Now that you’re all set, this is the part where things become interesting since we’re now ready for some code. Let’s see how to create a simple Excel Spreadsheet editor using Delphi and ADO.

Note: You should proceed even if you lack knowledge on ADO and Jet programming. As you’ll see, editing an Excel workbook is as simple as editing data from any standard database.

Источник

Excel через ado delphi

В предыдущем посте я рассказывал, как работать с MS Excel из Delphi через ComObj (Com объект).
В этой статье я расскажу, как подключить таблицу MS Excel через компонент ADOConnection в Delphi. Из данной статьи вы сможете узнать о способах данного подключения. Как загрузить данные из таблицы MS Excel в компонент DBGrid. Как создавать и сохранять записи в таблице MS Excel из Delphi.

И так, приступим…

Запустим Delphi и создадим новое приложение File -> New-> VCL Forms Application – Delphi.
Разместим на форме следующие компоненты:
1. Компонент TADOConnection из вкладки dbGo (ADO);
2. Компонент TADOQuery из вкладки dbGo (ADO);
3. Компонент TDataSource из вкладки Data Access;
4. Компонент TDBGrid из вкладки Data Controls;
5. И два компонента TButton из вкладки Standard.

и сохраним ее как 1.xlsx для (MS Excel 2007) или 1.xls для (MS Excel 2003).

Затем настроим компоненты…

Начнем с компонента подключения к базе ADOConnection1. Мы будем подключаться к таблице MS Excel.
В инспекторе объектов для компонента ADOConnection1 выбираем свойство ConnectionString и вписываем туда следующую строку для MS Excel 2007:

Provider =Microsoft.ACE.OLEDB.12.0; Data Source =1.xlsx; Extended Properties =»Excel 12.0 Xml;HDR=YES»;

Файл 1.xlsx должен находиться в папке с приложением.

При указании полного пути до файла:

Provider =Microsoft.ACE.OLEDB.12.0; Data Source =c:myFoldermyExcel2007file.xlsx; Extended Properties =»Excel 12.0 Xml;HDR=YES»;

Если у вас MS Excel 2003 то вписываем следующую строку:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=1.xls;Extended Properties=Excel 8.0;

Файл 1.xls должен находиться в папке с приложением.

Также можно подключиться через мастера подключения, для этого нажимаем:

Находим наш файл и жмем ОК.

Внимание. К сожалению такое подключение возможно только для файлов Excel сохраненных в формате Excel 97-2003 (*.xls), поэтому в моем случае выдаст ошибку.

После установки подключения убираем галочка со свойства LoginPromt, чтоб не запрашивал пароль и переходим к настройке компонента ADOQuery1.

Свойство Connection устанавливаем ADOConnection1;
Свойство SQL —> TString —> пишем запрос SELECT * FROM [Лист1$] ;
Свойство Active—> True.

Переходим к компоненту DataSource1 и устанавливаем ему свойство DataSet — > ADOQuery1.
Переходим к компоненту DBGrid1 и устанавливаем ему свойство DataSource—> DataSource1.
После данных настроек, если вы все сделали правильно в DBGrid должны отобразиться поля вашей таблицы. Чтобы изменить размер отображаемых полей в Structure выбираем:

Внимание. Перед запуском на выполнение, необходимо убрать галочки у компонента ADOConnection1 — >Connected и у компонента ADOQuery —> Active иначе будут сыпаться ошибки, типа не могу подключиться, так как подключение уже используется.

Дело движется к концу. Осталось только написать обработчики событий для кнопок (назовем их «Новая запись» и «Сохранить» соответственно). Начнем…

Для события OnClick кнопки «Сохранить» пишем следующий код:

procedure TForm1.Button1Click(Sender: TObject);
begin
ADOQuery1.Edit;
ADOQuery1.Post;
end;

Для события OnClick кнопки «Новая запись» пишем следующий код:

procedure TForm1.Button2Click(Sender: TObject);
begin
ADOQuery1.Append;
end;

И для события OnCreate формы пишем:

procedure TForm1.FormCreate(Sender: TObject);
begin
ADOConnection1.Connected:=true;
ADOQuery1.Active:=False;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(‘SELECT * FROM [Лист1$]’);
ADOQuery1.Active:=True;
end;

Сохраняем, запускаем на исполнение и видим, что с таблицами MS Excel можно работать также как и с файлами базы данных, но есть одно но, данный провайдер подключения не поддерживает удаление записей.

Спасибо за внимание.

Скачать исходники к статье можно здесь.

Источник

Работа с ADO в Delphi на примере БД MS Excel. Часть 2

Ну вот не долго думая, подошла вторая часть по работе с ADO в DELPHI на примере БД — MS Excel. В данной статье мы рассмотрим добавление и редактирование данных, так как с удалением тут возникли проблемы, в связи с тем, что данный драйвер не поддерживает удаление, ну с удалением мы что-нибудь подумаем. Сразу хочу сказать, что необходимо еще одно поле в нашей Excel-книги — id, и нам придется вручную его заполнять, что не есть хорошо, но ничего тут сложного нету, просто при инициализации данных, мы просто получаем количество записей в нашей БД, а затем при добавлении добавляем это значение в поле id. Вот и у нас будет получаться уникальное значение, что поможет нам при редактировании. Тут как всегда, думаю что писать на OnCreate нашей главной формы понятно, обычный запрос, только затем еще необходимо получить количество записей в нашей БД, что мы делаем с помощью RecordCount. Смотрим код события OnCreate формы ниже

Для добавления данных все тоже самое, что и было в ADO с MS Access, только здесб повторюсь надо учитывать id вручную нам, в а MS Access все было подругому, там был счетчик, что облегчало нам работу. Код добавления смотрим ниже

Ну я тут еще сделал дополнительный запрос, для обновления данных в TDBGrid.Для редактирования данных нам надо получить сначала id, для этого на событие компонента TDBGridOnCellClick напишем

У меня id поле находится в книге Excel в 3 столбце, но так как нумерация в ADO столбцов начинается с 0, то я указал Fields[2]. Для редактирования данных применим туже технологию, что и в случае с MS Access

И также как видем, дополнительный запрос на обновления данных, id у нас уже получен, так что все обновиться. Да и не забыли ведь, что в комоненте TADOQuery задайте в свойстве Parameters новый параметр — pid с типом данных ftInteger. Ну и наконец-то попробуем какой-нибудь не большой поиск организовать, здесь я использовал параметр SQL-запроса — LIKE, то есть найдет все записи с совпадениями, что мы указываем. Смотрим код ниже

Можно организовать поиск по полному совпадению просто через WHERE, но пока что так. Теперь понимаете, что использовать MS Excel в качестве БД тут не логично, много чего вручную контролировать нужно, ограниченное количество записей, да и с удалением проблемы, но зато отлично тут можно написать конвертацией данных, а также экспорт в Excel например или в MS Access из MS Excel. Но мы пока что займемся экспортом в Excel, а затем напишем свой конвертатор. Но это в следующий частях про MS Excel как БД в Delphi.

Источник

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
unit Main;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Grids, DBGrids, Buttons, DBCtrls, ComCtrls,
  Menus, ComObj;
 
type
  TfMain = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Splitter1: TSplitter;
    Panel3: TPanel;
    Panel4: TPanel;
    RadioButton2: TRadioButton;
    RadioButton3: TRadioButton;
    Bevel1: TBevel;
    Label1: TLabel;
    Label2: TLabel;
    Bevel2: TBevel;
    DBGrid1: TDBGrid;
    DBGrid2: TDBGrid;
    CheckBox1: TCheckBox;
    RadioGroup1: TRadioGroup;
    Edit2: TEdit;
    Button1: TButton;
    Edit1: TEdit;
    Button3: TButton;
    CheckBox2: TCheckBox;
    Button2: TButton;
    Button4: TButton;
    Button5: TButton;
    Label3: TLabel;
    Button6: TButton;
    Button7: TButton;
    Memo1: TMemo;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    Button8: TButton;
    N2: TMenuItem;
    N11: TMenuItem;
    Button9: TButton;
    procedure RadioButton2Click(Sender: TObject);
    procedure RadioButton3Click(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
    procedure CheckBox2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  fMain: TfMain;
 
implementation
 
uses DM;
 
{$R *.dfm}
 
procedure TfMain.RadioButton2Click(Sender: TObject);
begin
if RadioButton2.Checked then
    DBGrid2.DataSource := fDM.DSKlientData;
end;
 
procedure TfMain.RadioButton3Click(Sender: TObject);
begin
if RadioButton3.Checked then
    DBGrid2.DataSource := fDM.DSTovarData;
end;
 
procedure TfMain.CheckBox1Click(Sender: TObject);
begin
 if CheckBox1.Checked=true
 then begin
  DBGrid1.DataSource:=fDM.DSQuery1;
  CheckBox1.Caption:='Режим поиска включен';
  Edit2.SetFocus;
   // вывести таблицу
  fDM.ADOQuery1.Close;
  fDM.ADOQuery1.SQL.Clear;
  fDM.ADOQuery1.SQL.Add('Select * from Zakazi');
  fDM.ADOQuery1.Open;
  end
 else begin
  CheckBox1.Caption:='Режим поиска выключен';
  DBGrid1.DataSource:=fDM.DSZakaziData;
  end;
end;
 
procedure TfMain.Edit2Change(Sender: TObject);
var
 strField:string;
begin
 if not CheckBox1.Checked then Exit;
  // выбрать поле поиска
 case RadioGroup1.ItemIndex of
  0: strField:='ИдКлиента';
  1: strField:='ИдТовара';
 end;
 if Edit2.Text <> '' // пользователь ввел инф
 then begin
 // выполнить поиск
 fDM.ADOQuery1.Close;
 fDM.ADOQuery1.SQL.Clear;
 fDM.ADOQuery1.SQL.Add('Select * from Zakazi where '+strField+'=' +Edit2.Text );
 fDM.ADOQuery1.Open;
 end
 else begin
   // вывести таблицу
  fDM.ADOQuery1.Close;
  fDM.ADOQuery1.SQL.Clear;
  fDM.ADOQuery1.SQL.Add('Select * from Zakazi');
  fDM.ADOQuery1.Open;
 end;
 end;
 
procedure TfMain.CheckBox2Click(Sender: TObject);
begin
 if CheckBox2.Checked=true
 then begin
  DBGrid1.DataSource:=fDM.DSQuery1;
  CheckBox2.Caption:='Режим поиска включен';
   // вывести таблицу
  fDM.ADOQuery1.Close;
  fDM.ADOQuery1.SQL.Clear;
  fDM.ADOQuery1.SQL.Add('Select * from Zakazi');
  fDM.ADOQuery1.Open;
  Button1.Enabled:=true;
  Button3.Enabled:=true;
  Button2.Enabled:=true;
  Button4.Enabled:=true;
  Button5.Enabled:=true;
  end
 else begin
  CheckBox2.Caption:='Режим поиска выключен';
  DBGrid1.DataSource:=fDM.DSZakaziData;
  Button1.Enabled:=false;
  Button3.Enabled:=false;
  Button2.Enabled:=false;
  Button4.Enabled:=false;
  Button5.Enabled:=false;
  end;
end;
procedure TfMain.Button1Click(Sender: TObject);
begin
fDM.ADOQuery1.First;
end;
 
procedure TfMain.Button3Click(Sender: TObject);
begin
fDM.ADOQuery1.Last;
end;
 
procedure TfMain.Button2Click(Sender: TObject);
begin
fDM.ADOQuery1.Insert;
end;
 
procedure TfMain.Button4Click(Sender: TObject);
begin
fDM.ADOQuery1.Delete;
end;
 
procedure TfMain.Button5Click(Sender: TObject);
var
 n:integer;
begin
 // отключение отображения записей в визуальных компонентах
fDM.ADOQuery1.DisableControls;
fDM.ADOQuery1.First;
 for n:=1 to fDM.ADOQuery1.RecordCount do
  begin
   // обработка записи набора данных Table1
fDM.ADOQuery1.Next;
  end;
 // включение отображения записей в визуальных компонентах
 fDM.ADOQuery1.EnableControls;
end;
procedure TfMain.FormCreate(Sender: TObject);
begin
  Button1.Enabled:=false;
  Button3.Enabled:=false;
  Button2.Enabled:=false;
  Button4.Enabled:=false;
  Button5.Enabled:=false;
end;
 
procedure TfMain.Button6Click(Sender: TObject);
begin
//проверим - есть ли текст в Memo. Если нет, выходим:
  if Memo1.Text = '' then begin
    ShowMessage('Вначале введите запрос!');
    Memo1.SetFocus;
    Exit;
  end;
  //текст есть. Очистим предыдущий запрос в наборе данных:
  fDM.ADOQuery1.SQL.Clear;
  //добавим новый запрос из Memo:
  fDM.ADOQuery1.SQL.Add(Memo1.Text);
  //открываем набор данных, т.е. выполняем запрос:
  fDM.ADOQuery1.Open;
    DBGrid1.DataSource:=fDM.DSQuery1;
end;
 
procedure TfMain.Button7Click(Sender: TObject);
begin
Memo1.Clear;
end;
 
procedure TfMain.Button8Click(Sender: TObject);
var d: TDateTime;
begin
 if (Edit1.Text <> '') and (TryStrToDateTime(Edit1.Text, d)) // пользователь ввел инф
 then begin
  with fDM.ADOQuery1 do begin
    Close; // закрыть файл-результат выполнения предыдущего запроса
    SQL.Text:='select * from Zakazi where ДатаЗаказа  = :DATA'; // удалить текст предыдущего запроса
    Parameters[0].Value:=StrToDate(Edit1.Text);
    Open; // активизируем выполнение запроса
    DBGrid1.DataSource:=fDM.DSQuery1;
    Button8.Caption:='Поиск on';
end end else begin
    Button8.Caption:='Поиск off';
    DBGrid1.DataSource:=fDM.DSZakaziData;
end; end;
 
procedure TfMain.Button9Click(Sender: TObject);
Var
XLApp,Sheet,Colum:Variant;
index,i:integer;
begin
    XLApp:=CreateOLEObject('Excel.Application'); //Строка создаёт объект Excel и записывает его в переменную
    XLApp.Visible:=true; //объект видимый EXcel
    XLApp.Workbooks.Add(-4167); //Excel состоит из книг (страниц), которые мы добавляем.
    //Число - константа, менять нельзя
 
    //Функция, которая создаёт OLE-объекты позволяет наладить связь с другим приложением
    XLApp.Workbooks[1].WorkSheets[1].Name:='Отчёт';
    Colum:=XLApp.Workbooks[1].WorkSheets['Отчёт'].Columns;
 
    Colum.Columns[1].ColumnWidth:=20;   //Ширина столбцов
    Colum.Columns[2].ColumnWidth:=30;
    Colum.Columns[3].ColumnWidth:=20;
    Colum.Columns[4].ColumnWidth:=20;
    Colum.Columns[5].ColumnWidth:=20;
    Colum.Columns[6].ColumnWidth:=20;
 
    Colum:=XLApp.Workbooks[1].WorkSheets['Отчёт'].Rows; //Переносим указатель на строки
    Colum.Rows[2].Font.Bold:=true;   //Меняется шрифт
    Colum.Rows[1].Font.Bold:=true;
    Colum.Rows[1].Font.Color:=clRed;  //Цвет строки
    Colum.Rows[1].Font.Size:=14;      //Размер шрифта
 
    Sheet:=XLApp.Workbooks[1].WorkSheets['Отчёт']; //Указатель на лист
    Sheet.Cells[1,2]:='Заказы'; // Название таблицы
    Sheet.Cells[2,1]:='Код';
    Sheet.Cells[2,2]:='ИдКлиента';
    Sheet.Cells[2,3]:='ИдТовара';                    //Шапка таблицы
    Sheet.Cells[2,4]:='ДатаЗаказа';
    Sheet.Cells[2,5]:='Срочность';
    Sheet.Cells[2,6]:='Колличество';
 
    fDM.TZakaziData.First;
    index:=6;
    //Цикл для вывода данных таблицы
    for i:=0 to fDM.TZakaziData.RecordCount do
                                        begin
    sheet.Cells[index,1]:=fDM.TZakaziData.Fields.Fields[1].AsString; //Наполнение таблицы
    sheet.Cells[index,2]:=fDM.TZakaziData.Fields.Fields[2].AsString;
    sheet.Cells[index,3]:=fDM.TZakaziData.Fields.Fields[3].AsString;
    sheet.Cells[index,4]:=fDM.TZakaziData.Fields.Fields[4].AsString;
    sheet.Cells[index,5]:=fDM.TZakaziData.Fields.Fields[5].AsString;
    sheet.Cells[index,6]:=fDM.TZakaziData.Fields.Fields[6].AsString;
    Inc(index);    
    fDM.TZakaziData.Next; //Переход на следующую строку
 
                                        end;
 end;
 
end.

I have an ADOQuery (TADOQuery, bound to other visual components) with multiple columns (fields), in Delphi. I can export all the data (rows and columns) to an Excel file. I’m using OleVariant, something like ovRange.CopyFromRecordset (Data, Rows, Cols).
How can I export only some columns from an ADOQuery to Excel using Delphi (any version)?

procedure ExportRecordsetToMSExcel(const DestName: string; Data: _Recordset);
var
  ovExcelApp: OleVariant;
  ovExcelWorkbook: OleVariant;
  ovWS: OleVariant;
  ovRange: OleVariant;
  FileFormat: Integer;
  Cols, Rows: Cardinal;
begin
  FileFormat := ExcelFileTypeToInt(xlWorkbookDefault);
  ovExcelApp := CreateOleObject('Excel.Application'); // If Excel isnt installed will raise an exception

  try
    ovExcelWorkbook := ovExcelApp.WorkBooks.Add;
    ovWS := ovExcelWorkbook.Worksheets.Item[1]; // go to first worksheet
    ovWS.Activate;
    ovWS.Select;

    Rows := Data.RecordCount;
    Cols := Data.Fields.Count; // I don't want all of them, just some, maybe the ones that are visible

    ovRange := ovWS.Range['A1', 'A1']; // go to first cell
    ovRange.Resize[Rows, Cols]; //ovRange.Resize[Data.RecordCount, Data.Fields.Count];

    ovRange.CopyFromRecordset(Data, Rows, Cols); // this copy the entire recordset to the selected range in excel

    ovWS.SaveAs(DestName, FileFormat, '', '', False, False);
  finally
    ovExcelWorkbook.Close(SaveChanges := False);
    ovWS := Unassigned;
    ovExcelWorkbook := Unassigned;

    ovExcelApp.Quit;
    ovExcelApp := Unassigned;
  end;
end;
...
  ExportRecordsetToMSExcel('c:temptest.xlsx', ADOQuery.Recordset);

Resolved (working solution based on @MartynA and @PeterWolf’s answers):

procedure ExportRecordsetToMSExcel(const DestName: string; ADOQuery: TADOQuery; const Fields: array of string); overload;

  procedure CopyData( { out } var Values: OleVariant);
  var
    R, C: Integer;
    FieldsNo: array of Integer;
    L1, H1, L2, H2: Integer;
    V: Variant;
    F: TField;
  begin
    L1 := 0;
    H1 := ADOQuery.RecordSet.RecordCount + L1 - 1;
    L2 := Low(Fields); // 0
    H2 := High(Fields);

    SetLength(FieldsNo, Length(Fields));
    for C := L2 to H2 do
      FieldsNo[C] := ADOQuery.FieldByName(Fields[C]).Index;

    Values := VarArrayCreate([L1, H1, L2, H2], varVariant);

    for R := L1 to H1 do begin
      for C := L2 to H2 do
        Values[R, C] := ADOQuery.RecordSet.Fields[FieldsNo[C]].Value;

      ADOQuery.RecordSet.MoveNext();
    end;
  end;

var
  ovExcelApp: OleVariant;
  ovExcelWorkbook: OleVariant;
  ovWS: OleVariant;
  ovRange: OleVariant;
  Values: OleVariant;
  RangeStr: string;
  Rows, Cols: Integer;
begin
  CopyData(Values);
  try
    ovExcelApp := CreateOleObject('Excel.Application');
    try
      ovExcelWorkbook := ovExcelApp.WorkBooks.Add;
      ovWS := ovExcelWorkbook.ActiveSheet;

      Rows := ADOQuery.RecordSet.RecordCount;
      Cols := Length(Fields);
      RangeStr := ToRange(1, 1, Rows, Cols); // Ex: 'A1:BE100'

      ovRange := ovWS.Range[RangeStr];
      ovRange.Value := Values;

      ovWS.SaveAs(FileName := DestName);
    finally
      ovExcelWorkbook.Close(SaveChanges := False);
      ovWS := Unassigned;
      ovExcelWorkbook := Unassigned;

      ovExcelApp.Quit;
      ovExcelApp := Unassigned;
    end;
  finally
    VarClear(Values);
  end;
end;

Получить доступ, отображение и
редактирование данных Excel возможно так же при помощи технологии ADO (ADO
ActiveX Data Object)
и Delphi.

Применение технологии ADO позволяет
осуществлять доступ к данным таблицы Excel, что по сравнению с ранее описанной технологией на базе OLE производится
быстрее и эффективнее в смысле обмена данными, но не редактирования страниц.

В данном разделе будут описаны
подробные шаги такого доступа, а так же возможные ошибки и пути их устранения,
которые могут возникнуть в процессе настройки и работы.

Итак, необходимо решить следующие задачи:

·        
получить методы передачи данных между Excel<->
Delphi при помощи ADO;

·        
редактирование страницы Excel;

·        
получение данных из Excel. Как связать таблицу
данных с WorkBook Excel;

·        
определение типов полей (колонок) в Excel
странице;

·        
передача данных из Delphi приложения в Excel.

Подключение к MS Excel

При работе с Excel через ADO происходит
обмен данных по аналогии с таблицей из базы данных. Для подключения необходимо
использовать компонент AdoConnection и свойство connection string.
Строка подключения в данном свойстве зависит от версии Excel, формата данных и для формата .xls будет выглядеть следующим
образом:

 
strConn:=’Provider=Microsoft.Jet.OLEDB.4.0;’
+  ‘Data Source=’ +’MyFile.xls ‘+ ‘;’ +
‘Extended Properties=Excel 8.0;’;

Процедуру подключения к выбранному файлу можно реализовать
следующим образом:

procedure TForm1.ConnectToExcel;

var strConn : 
widestring;

begin

 
strConn:=’Provider=Microsoft.Jet.OLEDB.4.0;’ +

          
‘Data Source=’ + FileListBox1.FileName + ‘;’ +

           ‘Extended
Properties=Excel 8.0;’;

 
AdoConnection1.Connected:=False;

 
AdoConnection1.ConnectionString:=strConn;

    try

   
AdoConnection1.Open;

   
AdoConnection1.GetTableNames(ComboBox1.Items,True);

  except

   
ShowMessage(‘Не получается подключиться к файлу ‘ +
FileListBox1.FileName);

    raise;

 
end;

end;(*ConnectToExcel*)

При этом имена страниц книги помещаются в компонент Combobox1.

Управление данными

Выборка данных происходит на основе SQL запроса:

SELECT * FROM [Sheet1]

Sheet1 – имя страницы для
выборки.

Проверка подключения к
таблице с данными и выборку можно произвести при помощи TadoQuery

 
if not AdoConnection1.Connected then
ConnectToExcel;

 
AdoQuery1.Close;

 
AdoQuery1.SQL.Text:=Edit1.Text;

  try

   
AdoQuery1.Open;

  except

   
ShowMessage(‘
Ошибка!’);

    raise;

 
end;

При этом доступ к данным для чтения и записи будет осуществляться
стандартным образом. В следующем программном коде сначала выбирается первая
запись, затем значение второго по счету поля заносится в Edit3, после чего происходит редактирование
полученного значения с записью в файл Excel.
Имя поля при этом содержится в первой строке таблицы.

ADOQuery1.First;

Edit2.Text:=ADOQuery1.FieldByName(ADOQuery1.Fields[1].FieldName).AsString;

ADOQuery1.Edit;

ADOQuery1.FieldByName(ADOQuery1.Fields[1].FieldName).AsString:=Edit2.Text+’!’;

ADOQuery1.Post;

Таким образом технология ADO позволяет гибко
настраивать подключение к файлам Excel,
производить обмен данными по аналогии с таблицами  баз данных. 

Понравилась статья? Поделить с друзьями:
  • Delete the table in word
  • Delete the comments in excel
  • Delete text in word
  • Delphi 2010 word 2010
  • Delete table in microsoft word