Экспортировать TDBGrid в Excel без использования OLEDelphi , Технологии , OLE Automation MSOfficeЭкспортировать TDBGrid в Excel без использования OLE
Оформил: DeeCo { Exporting a DBGrid to excel without OLE I develop software and about 95% of my work deals with databases. I enjoied the advantages of using Microsoft Excel in my projects in order to make reports but recently I decided to convert myself to the free OpenOffice suite. I faced with the problem of exporting data to Excel without having Office installed on my computer. The first solution was to create directly an Excel format compatible file: this solution is about 50 times faster than the OLE solution but there is a problem: the output file is not compatible with OpenOffice. I wanted a solution which was compatible with each "DataSet"; at the same time I wanted to export only the dataset data present in a DBGrid and not all the "DataSet". Finally I obtained this solution which satisfied my requirements. I hope that it will be usefull for you too. First of all you must import the ADOX type library which will be used to create the Excel file and its internal structure: in the Delphi IDE: 1)Project->Import Type Library: 2)Select "Microsoft ADO Ext. for DDL and Security" 3)Uncheck "Generate component wrapper" at the bottom 4)Rename the class names (TTable, TColumn, TIndex, TKey, TGroup, TUser, TCatalog) in (TXTable, TXColumn, TXIndex, TXKey, TXGroup, TXUser, TXCatalog) in order to avoid conflicts with the already present TTable component. 5)Select the Unit dir name and press "Create Unit". It will be created a file named AOX_TLB. Include ADOX_TLB in the "uses" directive inside the file in which you want to use ADOX functionality. That is all. Let's go now with the implementation: } unit DBGridExportToExcel; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ComCtrls, DB, IniFiles, Buttons, dbgrids, ADOX_TLB, ADODB; type TScrollEvents = class BeforeScroll_Event: TDataSetNotifyEvent; AfterScroll_Event: TDataSetNotifyEvent; AutoCalcFields_Property: Boolean; end; procedure DisableDependencies(DataSet: TDataSet; var ScrollEvents: TScrollEvents); procedure EnableDependencies(DataSet: TDataSet; ScrollEvents: TScrollEvents); procedure DBGridToExcelADO(DBGrid: TDBGrid; FileName: string; SheetName: string); implementation //Support procedures: I made that in order to increase speed in //the process of scanning large amounts //of records in a dataset //we make a call to the "DisableControls" procedure and then disable the "BeforeScroll" and //"AfterScroll" events and the "AutoCalcFields" property. procedure DisableDependencies(DataSet: TDataSet; var ScrollEvents: TScrollEvents); begin with DataSet do begin DisableControls; ScrollEvents := TScrollEvents.Create(); with ScrollEvents do begin BeforeScroll_Event := BeforeScroll; AfterScroll_Event := AfterScroll; AutoCalcFields_Property := AutoCalcFields; BeforeScroll := nil; AfterScroll := nil; AutoCalcFields := False; end; end; end; //we make a call to the "EnableControls" procedure and then restore // the "BeforeScroll" and "AfterScroll" events and the "AutoCalcFields" property. procedure EnableDependencies(DataSet: TDataSet; ScrollEvents: TScrollEvents); begin with DataSet do begin EnableControls; with ScrollEvents do begin BeforeScroll := BeforeScroll_Event; AfterScroll := AfterScroll_Event; AutoCalcFields := AutoCalcFields_Property; end; end; end; //This is the procedure which make the work: procedure DBGridToExcelADO(DBGrid: TDBGrid; FileName: string; SheetName: string); var cat: _Catalog; tbl: _Table; col: _Column; i: integer; ADOConnection: TADOConnection; ADOQuery: TADOQuery; ScrollEvents: TScrollEvents; SavePlace: TBookmark; begin // //WorkBook creation (database) cat := CoCatalog.Create; cat._Set_ActiveConnection('Provider=Microsoft.Jet.OLEDB.4.0; Data Source=' + FileName + ';Extended Properties=Excel 8.0'); //WorkSheet creation (table) tbl := CoTable.Create; tbl.Set_Name(SheetName); //Columns creation (fields) DBGrid.DataSource.DataSet.First; with DBGrid.Columns do begin for i := 0 to Count - 1 do if Items[i].Visible then begin col := nil; col := CoColumn.Create; with col do begin Set_Name(Items[i].Title.Caption); Set_Type_(adVarWChar); end; //add column to table tbl.Columns.Append(col, adVarWChar, 20); end; end; //add table to database cat.Tables.Append(tbl); col := nil; tbl := nil; cat := nil; //exporting ADOConnection := TADOConnection.Create(nil); ADOConnection.LoginPrompt := False; ADOConnection.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0; Data Source=' + FileName + ';Extended Properties=Excel 8.0'; ADOQuery := TADOQuery.Create(nil); ADOQuery.Connection := ADOConnection; ADOQuery.SQL.Text := 'Select * from [' + SheetName + '$]'; ADOQuery.Open; DisableDependencies(DBGrid.DataSource.DataSet, ScrollEvents); SavePlace := DBGrid.DataSource.DataSet.GetBookmark; try with DBGrid.DataSource.DataSet do begin First; while not Eof do begin ADOQuery.Append; with DBGrid.Columns do begin ADOQuery.Edit; for i := 0 to Count - 1 do if Items[i].Visible then begin ADOQuery.FieldByName(Items[i].Title.Caption).AsString := FieldByName(Items[i].FieldName).AsString; end; ADOQuery.Post; end; Next; end; end; finally DBGrid.DataSource.DataSet.GotoBookmark(SavePlace); DBGrid.DataSource.DataSet.FreeBookmark(SavePlace); EnableDependencies(DBGrid.DataSource.DataSet, ScrollEvents); ADOQuery.Close; ADOConnection.Close; ADOQuery.Free; ADOConnection.Free; end; end; end. Программный модуль Объявление модуля
Модуль Помощники
В модуле есть два вспомогательных процедура: Процедура DBGridToExcelADO Эта основная процедура экспортирует данные из TDBGrid в файл Excel. Она принимает три параметра:
Процедура выполняет следующие действия: 1. Создает объект Catalog (CoCatalog) и устанавливает его активную связь с указанным файлом Excel. 2. Создает объект Table (CoTable) и добавляет его в каталог. 3. Итерирует через столбцы TDBGrid и создает соответствующие объекты Column в таблице. 4. Добавляет таблицу в каталог. 5. Создает объект ADOConnection и устанавливает строку подключения к тому же файлу Excel. 6. Создает объект ADOQuery и устанавливает текст SQL на выборку всех данных из указанного листа. 7. Отключает зависимости dataset, ассоциированного с TDBGrid. 8. Сохраняет текущую позицию закладки dataset. 9. Итерирует через строки TDBGrid, добавляя каждую строку в объект ADOQuery. 10. Включает зависимости dataset, ассоциированного с TDBGrid. 11. Закрывает объекты ADOQuery и ADOConnection. Альтернативное решение
Код может быть сложным и трудно понять или поддерживать. Альтернативное решение может заключаться в использовании третьей-сторонней библиотеки, такой как Улучшения Некоторые потенциальные улучшения кода включают: * Обработку ошибок: код не обрабатывает ошибки хорошо, поэтому может возникнуть проблема, если есть проблемы с файлом Excel или dataset. * Оптимизацию производительности: код использует объекты CoCatalog и CoTable, которые могут быть медленными. Рассмотрите использование других методов создания файла Excel, таких как потоковая передача. * Организацию кода: код организован в процедуры и типы, но все еще немного запутан. Рассмотрите разбиение на более маленькие, более фокусированные блоки кода. В целом, этот код предоставляет работающее решение для экспорта данных из TDBGrid в файл Excel без использования OLE. Однако он может потребовать улучшений в отношении обработки ошибок, оптимизации производительности и организации кода. Экспортировать TDBGrid в Excel без использования OLE: код на Delphi для экспорта данных из DBGrid в файл Excel, compatible с OpenOffice. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: OLE Automation MSOffice ::
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |