Как загрузить таблицу excel в delphi
Подскажите пожалуйста как загрузить таблицу excel в delphi и отобразить ее в dbgrid'e, для дальнейшей работы с ней. Например, чтобы можно было выполнять в ней поиск. Через ADO+соответствующий провайдер ODBC, и работать с ней как с БД Через ADO+соответствующий провайдер ODBC, и работать с ней как с БД Stilet я пробовал через ADO, но у меня не получилось. Может быть конечно у меня руки кривые. А других вариантов нет?
Ну есть конечно, например через TexcellApplication, но тогда без DBкомпонентов.
Вот специально только что проверил в АДО запрос select * from [test_pf_1$] где test_pf_1 - таблица в книге, работает на ура.
Последний раз редактировалось Stilet; 06.03.2008 в 13:07 . Значит все-таки руки кривые. Stilet а ты можешь кинуть краткую инструкцию подключения.Могу:
Ну форму ты наверное создаш сам, и ADOQuery тоже сам кинеш и присоединиш к гриду.
Короче, в АДО открой настройку ConnectionString. В Build выбери провайдер ODBC. Клацни Некст, и включи Use Connection String, (ну предположим что настройки на Эхель у тебя еще небыло). Клацни по Build рядом, и в открывшемся диалоге введи имя нового DSN - например MyExel. Клацни New, и выбери в провайдерах драйвер для Ехеля (сам найдеш его, ну а если его нет то дальше можеш не читать).
Некст - Бровзе и сохрани настройки в файл (называй его как хочеш пусть MyExel2).
Далее - Готово - Выбираем тип Эхеля, и файл XLS к которому "буду говорить без бамажки" по нажатию кнопки "Выбор Книги".
Выбрал? - Ок - Ок - Ок (если нуна)
На всякий пожарный клацни по Test Connection - убедись что коннект путевый.
Ок - Ок и лезем в инспекторе в SQL АДОшки, где пишем:
select * from [test_pf_1$] где test_pf_1 - таблица в книге
(ну это у меня так, а как ты свои книги и таблицы называеш я не знаю, потому как телепатор еще не включил)
Все! Активируй свой АДО и наслаждайся данными в табличке.
Ферштехен?
Могу:
Ну форму ты наверное создаш сам, и ADOQuery тоже сам кинеш и присоединиш к гриду.
Короче, в АДО открой настройку ConnectionString. В Build выбери провайдер ODBC. Клацни Некст, и включи Use Connection String, (ну предположим что настройки на Эхель у тебя еще небыло). Клацни по Build рядом, и в открывшемся диалоге введи имя нового DSN - например MyExel. Клацни New, и выбери в провайдерах драйвер для Ехеля (сам найдеш его, ну а если его нет то дальше можеш не читать).
Некст - Бровзе и сохрани настройки в файл (называй его как хочеш пусть MyExel2).
Далее - Готово - Выбираем тип Эхеля, и файл XLS к которому "буду говорить без бамажки" по нажатию кнопки "Выбор Книги".
Выбрал? - Ок - Ок - Ок (если нуна)
На всякий пожарный клацни по Test Connection - убедись что коннект путевый.
Ок - Ок и лезем в инспекторе в SQL АДОшки, где пишем:
select * from [test_pf_1$] где test_pf_1 - таблица в книге
(ну это у меня так, а как ты свои книги и таблицы называеш я не знаю, потому как телепатор еще не включил)
Все! Активируй свой АДО и наслаждайся данными в табличке.
Ферштехен?
Тут иногда бывают вопросы о том, как можно из Delphi работать с документами Excel. Решил написать такую инструкцию, где рассказано об основных действиях.
Для работы с OLE нужно к строке Uses добавить модуль ComObj. Так же нужно объявить переменную типа Variant.
Что бы начать работу с Экселем, нужно создать OLE объект:
Ap := CreateOleObject('Excel.Application');
После этого нужно либо создать новую книгу:
Ap.Workbooks.Add;
либо открыть файл:
Ap.Workbooks.Open(<имя файла>);
Что бы открыть файл только для чтения, нужно указать:
Ap.Workbooks.Open(<имя файла>,0,True);
где True и указывает, что файл открывается только для чтения.
По умолчанию окно Excel не будет отображаться. что бы оно появилось, нужно выполнить
Ap.Visible := True;
Но это желательно делать в последний момент, т.к. когда окно видимое, то все изменения в нём происходят медленнее. Поэтому, лучше оставить его невидимым, сделать там все необходимые изменения, и только после этого сделать его видимым или закрыть. Если вы его оставите невидимым, то процесс EXCEL.EXE останется висеть в памяти, даже когда будет закрыто ваше приложение.
Что бы записать или прочитать содержимое ячейки можно использовать Ap.Range[<имя ячейки>] или Ap.Cells[<позиция по Y>,<позиция по X>]
Ap.Range['D1'] := 'Ляляля';
Ap.Cells[1,4] := 'Ляляля';
Эти две строки выполняют одно и тоже действие: записывают строку "Ляляля" в ячейку D1
Читать значение из ячейки таким же образом:
S := Ap.Range['D1'];
или
S := Ap.Cells[1,4];
Так же можно записывать значение сразу в несколько ячеек. можно перечислить через точку с запятой или указать диапазон через двоеточие:
Всё это можно применять как к отдельным ячейкам, так и к группам ячеек, строк, столбцов и т.п. Я буду показывать примеры на Ap.Cells. но Вам никто не мешает использовать Ap.Range['D5'], Ap.Range['A2:E8'], Ap.Columns['B:F'] и т.п.
Наверное, вы обращали внимание, что в новом документе появляются 3 листа (их список отображается внизу программы Excel). По умолчанию, мы работаем с активным листом (сразу после создания это первый лист). Но при желании, мы можем использовать и другие листы. Доступ к ним осуществляется с помощью Worksheets[<номер листа>]. Обратите внимание, что нумеруются они начиная с 1 (а не с 0, как привыкли все программисты).
Ниже приведён более полный список размеров бумаги из модуля ExcelXP:
Выделение
Excel.Range[Excel.Cells[1, 1], Excel.Cells[5, 3]].Select;
а также любые другие комбинации выбора ячейки с окончанием .select - выбор 1 или группы ячеек
С выбранными ячейками возможны следующие преобразования:
1) объединение ячеек
Excel.Selection.MergeCells:=True;
2) перенос по словам
Excel.Selection.WrapText:=True;
3) горизонтальное выравнивание
Excel.Selection.HorizontalAlignment:=3;
при присваивании значения 1 используется выравнивание по умолчанию, при 2 - выравнивание слева, 3 - по центру, 4 - справа.
4) вериткальное выравнивание
Excel.Selection.VerticalAlignment:=1;
присваиваемые значения аналогичны горизонтальному выравниванию.
5) граница для ячеек
Excel.Selection.Borders.LineStyle:=1;
При значении 1 границы ячеек рисуются тонкими сплошными линиями.
Кроме этого можно указать значения для свойства Borders, например, равное 3. Тогда установится только верхняя граница для блока выделения:
Excel.Selection.Borders[3].LineStyle:=1;
Значение свойства Borders задает различную комбинацию граней ячеек.
В обоих случаях можно использовать значения в диапазоне от 1 до 10. ]
Установка пароля для активной книги может быть произведена следующим образом:
где pass - устанавливаемый пароль на книгу.
Снятие пароля с книги аналогично, использовуем команду
где pass - пароль, установленный для защиты книги.
Установка и снятие пароля для активного листа книги Excel производится командами
где pass - пароль, установленный для защиты книги.
Вспомогательные операции в EXCEL
Удаление строк со сдвигом вверх:
при выполнении данных действий будут удалены строки с 5 по 15.
Установка закрепления области на активном листе Excel
Спасибо VampireKB за дополнения
Существует ли инструкция по размещению проекта Delphi на GitHub?
После создания репозитория непонятно, что делать.
Как в Delphi сделать Excel таблицу, не употребляя компонент TStringGrid и связать ее с Delphi
Как в Delphi сделать Excel таблицу, не употребляя компонент TStringGrid и связать ее с Delphi?
Использование БД в Delphi
Привет. Возникла необходимость подключить базу данных к Delphi для хранения вычислений полученных в.
Использование Interop Excel
Добрый день! Есть приложение, которое должно вносить определенные изменения в Excel файл. .
Использование case Delphi
имеется код Case Combobox1.itemIndex of 0:begin Edit1.Clear; Form_login.Visible:=false;.
Использование stringgrid-Delphi
Дан массив А размера N. Сформировать два новых массива В и С: в массив В записать все положительные.
Использование интерфейсов из С++ в Delphi
Здравствуйте. Пытаюсь прикрутить Steamworks API напрямую к делфи, и возникла проблема. Функция.
При написании бизнес приложений на Delphi, выполняющих какие либо расчеты, может возникнуть необходимость импорта (экспорта) данных из файлов других приложений. Одно из основных таких приложений – MS Excel. Как прочитать файлы xls в Delphi мы сейчас и рассмотрим!?
Создадим новый проект и разместим на форме три компонента:
StringGrid – находится на палитре компонентов, во вкладке Additional
Кнопку Button и для удобства выбора файлов, диалог открытия файлов (работа с диалогами описана здесь).
Для StringGrid, в свойствах(Properties) укажем следующее:
DefaultRowHeight – 17
FixedCols – 0
FixedRows – 0
В результате форма будет выглядеть примерно так:
На этом украшательства закончим и приступим к написанию кода.
Для работы с Excel файлами нам понадобится библиотека ComObj, входящая в стандартную поставку Delphi. Подключается она в разделе Uses. Добавьте в конце, после запятой «ComObj».
Теперь опишите процедуру Xls_Open после ключевого слова implementation:
procedure Xls_Open(XLSFile:string; Grid:TStringGrid);
const
xlCellTypeLastCell = $0000000B;
var
ExlApp, Sheet: OLEVariant;
i, j, r, c:integer;
begin
//создаем объект Excel
ExlApp := CreateOleObject('Excel.Application');
//делаем окно Excel невидимым
ExlApp.Visible := false;
//открываем файл XLSFile
ExlApp.Workbooks.Open(XLSFile);
//создаем объект Sheet(страница) и указываем номер листа (1)
//в книге, с которого будем осуществлять чтение
Sheet := ExlApp.Workbooks[ExtractFileName(XLSFile)].WorkSheets[1];
//активируем последнюю ячейку на листе
Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
// Возвращает номер последней строки
r := ExlApp.ActiveCell.Row;
// Возвращает номер последнего столбца
c := ExlApp.ActiveCell.Column;
//устанавливаем кол-во столбцов и строк в StringGrid
Grid.RowCount:=r;
Grid.ColCount:=c;
//считываем значение из каждой ячейки и копируем в нашу таблицу
for j:= 1 to r do
for i:= 1 to c do
Grid.Cells[i-1,j-1]:= sheet.cells[j,i];
//если необходимо прочитать формулы то
//Grid.Cells[i-1,j-1]:= sheet.cells[j,i].formula;
//закрываем приложение Excel
ExlApp.Quit;
//очищаем выделенную память
ExlApp := Unassigned;
Sheet := Unassigned;
end;
Наша процедура Xls_Open имеет два входных параметра:
- XLSFile – путь к файлу Excel (xls)
- Grid – таблица, в которую будем осуществлять вывод данных.
В комментариях к коду я постарался все расписать, объясню немного принцип работы процедуры.
Мы создаем в памяти объект ExlApp с приложением Excel.Application. Затем указываем что этот объект будет невидим для пользователя ExlApp.Visible := false (если false заменить на true, то при открытии файла мы увидим окно Excel с открываемым файлом). Далее открывается файл ExlApp.Workbooks.Open(XLSFile). Потом создаем еще один объект Sheet, который позволяет работать с листом книги Excel: Sheet := ExlApp.Workbooks[ExtractFileName(XLSFile)].WorkSheets[1]. Единица в конце указывает номер листа с которого будем читать данные (к листам можно обращаться по имени, для этого вместо 1 указываем «ИмяЛиста1»). Далее определяем кол-во строк и столбцов которые содержат данные, и используя циклы For считываем данные копируя их в StringGrid. Впринципе и все.
Для использования процедуры Xls_Open пропишем в событие Click кнопки Button1 следующее:
If OpenDialog1.Execute then Xls_Open (OpenDialog1.FileName, StringGrid1);
Основные недостатки этого способа: медленное чтение данных (хотя для небольших файлов вполне сгодится) и необходимость установленной версии Excel на компьютере пользователя.
Полный листинг программы:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls,ComObj;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Button1: TButton;
OpenDialog1: TOpenDialog;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
procedure Xls_Open(XLSFile:string; Grid:TStringGrid);
const
xlCellTypeLastCell = $0000000B;
var
ExlApp, Sheet: OLEVariant;
i, j, r, c:integer;
begin
//создаем объект Excel
ExlApp := CreateOleObject('Excel.Application');
//делаем окно Excel невидимым
ExlApp.Visible := false;
//открываем файл XLSFile
ExlApp.Workbooks.Open(XLSFile);
//создаем объект Sheet(страница) и указываем номер листа (1)
//в книге, с которого будем осуществлять чтение
Sheet := ExlApp.Workbooks[ExtractFileName(XLSFile)].WorkSheets[1];
//активируем последнюю ячейку на листе
Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
// Возвращает номер последней строки
r := ExlApp.ActiveCell.Row;
// Возвращает номер последнего столбца
c := ExlApp.ActiveCell.Column;
//устанавливаем кол-во столбцов и строк в StringGrid
Grid.RowCount:=r;
Grid.ColCount:=c;
//считываем значение из каждой ячейки и копируем в нашу таблицу
for j:= 1 to r do
for i:= 1 to c do
Grid.Cells[i-1,j-1]:= sheet.cells[j,i];
//если необходимо прочитать формулы то
//Grid.Cells[i-1,j-1]:= sheet.cells[j,i].formula;
//закрываем приложение Excel
ExlApp.Quit;
//очищаем выделенную память
ExlApp := Unassigned;
Sheet := Unassigned;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
If OpenDialog1.Execute then Xls_Open (OpenDialog1.FileName, StringGrid1);
end;
end.
Обновленный пример. Добавлена функция отбора строк по критерию. Так же добавлен обработчик делающий отображение шрифта "шапки" в StringGrid жирным. Все дополнения постарался по максимуму раскомментить
В предыдущем посте я рассказывал, как работать с 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 должен находиться в папке с приложением.
При указании полного пути до файла:
Если у вас 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 формы пишем:
Сохраняем, запускаем на исполнение и видим, что с таблицами MS Excel можно работать также как и с файлами базы данных, но есть одно но, данный провайдер подключения не поддерживает удаление записей.
Когда вы первый раз заходите с помощью соцсетей, мы получаем публичную информацию из вашей учетной записи, предоставляемой провайдером услуги соцсети в рамках ваших настроек конфиденциальности. Мы также автоматически получаем ваш e-mail адрес для создания вашей учетной записи на нашем веб сайте. Когда она будет создана, вы будете авторизованы под этой учетной записью. Когда вы первый раз заходите с помощью соцсетей, мы получаем публичную информацию из вашей учетной записи, предоставляемой провайдером услуги соцсети в рамках ваших настроек конфиденциальности. Мы также автоматически получаем ваш e-mail адрес для создания вашей учетной записи на нашем веб сайте. Когда она будет создана, вы будете авторизованы под этой учетной записью.Очень хорошие статьи. Разобрался во всём с первого раза ))) Понравилась схема в mind42 )))
Автору остаётся сказать только спасибо!
не за что, Иван. Всегда рад помочь)
Странно. Если Excel запущен, то должна создаваться вторая копия приложения без исключений. Код в студию :)
Насчет процедуры CheckExcelRun. Если программа запускается из под Delphi и Excel не запущен, то выскакивает ошибка: Операция GetActiveOleObject недоступна. Если програма запускается не из под Delphi то все в порядке. Наверное эту проблему имел ввиду Алекс. Как решение можно при отладке программы когда возникает исключение нажимать F9.
По сабжу пока не работал, но скорее всего либо перменная FileName уже объявлена, либо тип TFileName из модуля SysUtils, где-то переопределен.
Помогите Вопрос! Я использую шаблоны в своей программе! Можно ли из Дельфи изменть путь Save as. Что бы при слхранений пользавателем путь сохранения был изменен? Спасибо
А можно ли проверить, что не просто запущен Excel, а уже имеется открытая конкретная книга.
Например, хочу создать в Excel (усли уже создана, то открыть) книгу table.xls
Канает в любой версии Delphi, даже в XE.
begin
result:=CheckExcelRun;
if not result then
if AutoRun then
begin
RunExcel;
result:=CheckExcelRun;
end;
if result then MyExcel.WorkBooks.Add;
end;
Или так :-)
begin
result:=CheckExcelRun;
if (not result) and (AutoRun) then
begin
RunExcel;
result:=CheckExcelRun;
end;
if result then MyExcel.WorkBooks.Add;
end;
Ну так отладчик же понятно говорит, что переменная Rez повторно объявлена. Ищите где повторное объявление. Может где в глобальных переменных повторились
function isExcelInstalled:boolean;
var
ClassID: TCLSID;
begin
Result := CLSIDFromProgID(PWideChar(WideString(ExcelApp)), ClassID) = S_OK;
end;
Понятнее и короче.
Народ , а нельзя вбить какую нить формулу в excel и чтобы результат вычисления выводился в проге в Дельфи? просто я только разбираюсь в дельфи и не знаю как это через дельфи сделать..
Это будет проще сделать в делфи, и на много облегчит программу.
MsExcel : Variant;
_Sheet : TStringList;
i, x : integer;
CCR_Ver, lLastRow, Name_Sheet, path : String;
MsExcel.Workbooks.Open[XLS_File.FileName, 0, True];
// видимость Excel
MsExcel.Visible := False;
// Закрытие открытой книги
MsExcel.WorkBooks[MsExcel.WorkBooks.Count].Close(false);
// Закрытие Excel
MsExcel.quit;
// Перераспределение памяти
inherited;
close; // Закрытие формы frm_CCR_mos
end;
Влад, здравствуйте.
Я могу с Вами как либо связаться и задать пару вопросов?
GS, спасибо большое. Не возражаете, если я, по мере наличия свободного времени, опубликую в блоге отдельным постом эти примеры (Естественно с указанием настоящего автора примеров). Думаю, что такой пост может пригодиться многим.
GS! Подскажите, где взять библиотеку XLSReadWrite?
Буду только рад :)
Ребят, вы даже представить себе не можете, насколько это полезная информация)))
Спасибо!
подскажите плиз как сделать следующее с помощью компонентов XLSReadWrite
1. открыть книгу
2. сделать поиск построчно в столбце например T при этом нужен поиск с частичным совпадением текста.
3. организовать поиск по многим книгам за 1 проход.
текущий пример как сделано сейчас прилагаю. Открытие книги и поиск в ней выполняются за 9 секунд в среднем в двух книгах за 18. хотелось бы уменьшить данное время на сколько это возможно.
заранее спасибо всем откликнувшимся.
Вопрос поднимался выше, не ответили:
Не компилит функция Save, «FileName:TFileName», пишет:
1. если не определяем параметры функции SaveWorkSheet, пишет что не хватает актуальных параметров
2. ставлю параметры, (индекс), пишет что не соответствие типов String/Integer,
Vlad огромное спасибо за статью
Просьба есть: нельзя ли перезалить модуль.. как тут уже писали он не скачивается по ссылке :(
При объявлении переменой типа OleVariant, у самой переменой нету никаких методов/классов. После нажатия точки вылазит только (*,
Хотя сами методы компилятор видит. WorkBooks, Sheet, Range, Cells и т.п.
Именно так и должно быть, т.к. мы используем раннее связывание.
кто-то может передать экземпляр сломанной ссылке
подскажите пож как сделать чтобы когда вбиваешь edit текс он выводился в excel и когда я водил опять он спускался на строчку ниже а не -заменял преждний
Читайте также: