Ну вот не долго думая, подошла вторая часть по работе с 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.
Содержание
- Работа с ADO в Delphi на примере БД MS Excel. Часть 2
- Editing Excel Sheets With Delphi and ADO
- How to Connect to Microsoft Excel
- Data Transfer Using ADO
- The ConnectionString Magic
- Excel через ado delphi
- Работа с 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, для этого на событие компонента TDBGrid — OnCellClick напишем
У меня 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, для этого на событие компонента TDBGrid — OnCellClick напишем
У меня 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,
производить обмен данными по аналогии с таблицами баз данных.