Открыть excel delphi если уже открыт

Delphi как подключится к уже открытой excel

В предыдущем посте я рассказывал, как работать с 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 можно работать также как и с файлами базы данных, но есть одно но, данный провайдер подключения не поддерживает удаление записей.

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

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

Источник

Работа с Excel из Delphi. Часть 1

Опубликовано Va-Bank в ПТ, 12/11/2010 — 23:57

Подготовка

Откроем нашу среду разработки Delphi (в моем случае это Delphi 2010). Создадим новый проект. Должен сказать, что работа с Excel происходит через объекты COM. Поэтому нам надо подключить в раздел USES нашего проекта модуль COMObj . Так же нам понадобится модуль ActiveX . Это будет выглядеть примерно вот так:

Проверка наличия установленного Microsoft Excel в операционной системе

Теперь собственно нам нужно, как писалось выше, определить наличие Excel в системе. Если он не будет обнаружен, то мы сообщим об этом пользователю и завершим программу. Для этого создадим простенькую функцию и объявим её в секции private нашей формы TForm1 :

то там можно будет обнаружить много разделов. Среди них есть как раз нужный нам «Excel.Application» (при условии, что данное ПО установлено в системе). К сведению: у этого раздела имеется еще два подраздела:

Параметры функции:
— pszProgID : строка, содержащая ProgID.
— clsid : получает CLSID.

Возвращаемые значения:
— S_OK — CLSID создан успешно.
— CO_E_CLASSSTRING — CLSID зарегистрированный для ProgID неверен.
— REGDB_E_WRITEREGDB — ошибка записи в реестр.
— E_OUTOFMEMORY — нет памяти.
— E_INVALIDARG — указывает что один или более аргументов неверны. Стоит проверить правильность строки pszProgID.
— E_UNEXPECTED — неизвестная ошибка.

Теперь на событии OnCreate формы TForm1 напишем следующий код:

Проверить, запущен ли Microsoft Excel

Далее давайте кинем на форму одну кнопку TButton. На событии OnClick будем писать код работы с Excel. Первое что мы сделаем, это добавим локальную переменную типа Variant для доступа к Excel с именем, например, FExcel :

Создание нового экземпляра Microsoft Excel

Создать новый экземпляр можно с помощью функции CreateOleObject . Давайте сразу напишем шаблон.

Операции над программой Microsoft Excel из Delphi

Теперь давайте рассмотрим, что вообще можно делать с Excel из Delphi. Операций достаточно много. И все описать просто невозможно. Но если в моем описании не окажется нужного вам метода, то огорчаться не стоит. Методы можно узнать самому. Открываете Excel. Затем в меню Сервис – Макрос – Начать запись . Там жмем ОК и выполняем необходимые нам операции в Excel. Когда закончите, жмем на Стоп . Затем нажимаем комбинацию клавиш Alt+F11 и перед нами открывается редактор Visual Basic . Вот в нем слева вверху есть древовидный список. В нем находится папка с названием Modules . В свою очередь в ней располагаются модули. Вот эти модули и есть ваши макросы. Кликнем два раза на тот модуль, который мы только что записали (если это первая запись, то модуль будет один). И тут будут отображены все ваши действия в виде исходного кода на языке Visual Basic. Вам остается только перевести это дело на Delphi.
По поводу констант. В Delphi придется объявлять их самим. Посмотреть чему они равны можно в том же редакторе Visual Basic. Делается это так. Вписываем любую нужную нам константу в редакторе. Кликаем правой клавишей мыши, чтобы появилось контекстное меню. И там выбираем пункт «Quick Info» . При этом будет показана всплывающая подсказка со значением этой константы. Все просто! Единственное оговорюсь. В Visual Basic будет показано так, например: &HFFFFEFF4 , но Delphi этого не поймет. Надо объявлять в нем так: $FFFFEFF4 .

FExcel.Visible := true;
Делать Excel видимым (True)/не видимым(False). При установке Visible в FALSE , программа Excel Так же пропадает из панели задач Windows.

FExcel.Application.EnableEvents := false;
Показывать (True)/не показывать(False) системные сообщения Excel. Рекомендую отключать сообщения при построении отчета. А сам код писать после создания экземпляра Excel. Это увеличит скорость создания отчета. Пример:

FExcel.WindowState := xlMaximized;
Состояние окна Excel:
const xlMaximized = $FFFFEFD7 (или -4137) — развернуть Excel на весь экран.
const xlNormal = $FFFFEFD1 (или -4143) — восстановить Excel.
const xlMinimized = $FFFFEFD4 (или -4140) — свернуть Excel на панель задач.

FExcel.ScreenUpdating := false;
Включить (True)/отключить (False) перерисовку окон. Используется для ускорения работы макроса, т.к. в это время не обновляется экран. Я в своих проектах не использовал данный метод, но возможно построение отчета будет выполняться быстрее, если отключить обновление окон Excel. После построения отчета перерисовку окон можно будет включить обратно.

FExcel.Workbooks.Open(path);
Открытие существующей книги (где path — путь к фалу). Функция Open описана так:

UpdateLinks — Необязательный параметр. Определяет способ обновления связи в открываемом файле. Если данный аргумент отсутствует, то пользователю будет выдан запрос на определение способа обновления связей. Данный параметр имеет следующие допустимые значения:
0 – никакие связи не обновляются;
1 – обновляются внешние ссылки, но не обновляются удаленные ссылки;
2 – обновляются удаленные ссылки, но не обновляются внешние ссылки;
3 – обновляются оба типа ссылок

ReadOnly — необязательный параметр. Если файл имеет атрибут только для чтения, то при открытии его в Excel выдается соответствующее предупреждение*. Чтобы его игнорировать, передайте в качестве данного параметра True.

Format — необязательный параметр. При открытии текстового файла этот параметр определяет вид символов-разделителей. Ниже представлены допустимые значения данного аргумента:
1 – символы табуляции;
2 – запятые;
3 – пробелы;
4 – точка с запятой;
5 – разделители отсутствуют;
6 – вид разделителя определяется пользователем (с помощью параметра Delimiter).

Password — необязательный параметр, задающий строку пароля, необходимого для открытия защищенной рабочей книги. Если при открытии защищенной книги данный аргумент отсутствует, то пользователю будет выдан запрос на ввод пароля*.

WriteResPassword — необязательный параметр. Предназначен для задания пароля, необходимого для записи в рабочую книгу. Если при открытии защищенной книги данный аргумент отсутствует, то пользователю будет выдан запрос на ввод пароля*.

IgnoreReadOnlyRecommended — необязательный параметр. В случае задания ему значения True этот аргумент позволяет устранить вывод сообщения с рекомендацией открытия книги только для чтения (в том случае, если данная рабочая книга была сохранена с параметром Read-Only Recommended).

Origin — необязательный параметр. При открытии текстового файла этот параметр указывает, где был создан этот файл, что необходимо для правильного распознавания страницы кодировки. Значениями данного аргумента может быть одна из констант: xlMacintosh, xlWindows или xlMSDOS**. Если данный аргумент отсутствует, то используются текущие параметры операционной системы.

Delimiter — необязательный параметр. Если открывается текстовый файл и параметр Format имеет значение, равное 6, то этот аргумент определяет символ-разделитель.

Editable — необязательный параметр. Если файл является файлом MS Excel 4.0, то этот параметр при задании ему значения True позволяет открыть надстройку как видимое окно. По умолчанию ему присвоено значение False.

Notify — необязательный параметр. Если файл не может быть открыт для записи, то при задании данному аргументу значения True файл будет добавлен в список уведомления. Если данный аргумент равен False или отсутствует, то открыть файл будет невозможно.

Converter — необязательный параметр. Предназначен для определения индекса фильтра, который будет использован при открытии данного файла. Если фильтр не сможет распознать формат файла, то будут последовательно использованы все доступные фильтры.

AddToMRU — необязательный параметр типа Variant. Если данный параметр имеет значение True, то рабочая книга будет добавлена в список недавно использованных файлов. По умолчанию ему присвоено значение False.

Примечание:
* Сообщения будут выведены на экран, если вы не отключили их с помощью:
FExcel.Application.EnableEvents := false;
Показывать (True)/не показывать(False) системные сообщения Excel.

** Delphi не знает о существовании констант, поэтому чтобы посмотреть их значения, нужно воспользоваться средствами VBA. Эти константы соответственно равны 1, 2 и 3.

FExcel.Workbooks.Add(path); // path — путь к фалу
Создание новой книги. Причем создается стандартная книга с тремя листами. В этом методе можно указать стандартный тип шаблона Excel. Если же в нем указать имя (с полным путем) подготовленного файла (шаблоном может быть и «обычный» файл XLS, а не только файл XLT), то можно открыть книгу на диске как шаблон.

FExcel.Workbooks.Add(Template);
Template — Необязательный параметр. Этот параметр определяет, как будет создана рабочая книга. Если этот параметр будет иметь значение строки, определяющей имя файла (включая путь) существующей рабочей книги, то создается рабочая книга с использованием данного файла как шаблона. В случае когда данный параметр является одной из констант: xlWBATExcel4IntlMacroSheet = 4;
xlWBATExcel4MacroSheet = 3;
xlWBATWorksheet = $FFFFEFB9 (или -4167);
xlWBATChart = $FFFFEFF3 (или -4109);
Создаваемая книга будет содержать один лист соответствующего типа. В том случае, если этот параметр отсутствует, то создается рабочая книга с количеством листов, определяемым значением свойства SheetslnNewWorkbook .

FileFormat — необязательный параметр. Данный параметр задает формат файла. Его значением может быть одна из констант, описанных в таблице 1 . В том случае, если файл уже существует, в качестве его формата по умолчанию будет назначен формат, использовавшийся при его предыдущем сохранении.

Password — необязательный параметр. Данный параметр определяет защитный пароль для сохраняемого файла. Пароль определяется строкой, содержащей не более 15 символов.

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

ReadOnlyRecommended — необязательный параметр. В случае присвоения ему значения True, последующее открытие файла на экране будет сопровождаться сообщением, говорящим о том, что этот файл рекомендуется открыть в режиме только для чтения.

CreateBackup — необязательный параметр. Определяет возможность создания резервного файла (значение True).

AccessMode — необязательный параметр. Этот параметр определяет режим доступа к рабочей книге и может иметь одно из следующих значений:
xINoChange – режим доступа не изменяется (равно 1);
xlShared – общие листы (равно 2);
xlExclusive – монопольный доступ (равно 3).

ConflictResolution — необязательный параметр. Определяет способ разрешения конфликтов в том случае, если книга имеет общие листы. Значением данного свойства может быть значение одной из констант:
xlUserResolution — отображает окно диалога для разрешения конфликтов (равно 1);
xlLocalSessionChanges — автоматически принимаются изменения локального пользователя (равно 2);
xlOtherSessionChanges — принимаются другие изменения вместо изменений локального пользователя (равно 3).

AddToMru — необязательный параметр. Позволяет поместить сохраняемый файл в список сохраненных файлов в меню Файл (File). Для реализации этой возможности значение этого аргумента должно равняться True.

TextCodePage — необязательный параметр. В локализованной версии MS Office не используется.

TextVisualLayout — необязательный параметр. В локализованной версии MS Office не используется.

FWorkbook.Close;
Закрыть книгу. При этом если Excel видимый, то появится диалог с вопросом, хотите ли вы сохранить файл.
Функция Close описана так:

FExcel.Workbooks[1].WorkSheets[1] .Name := ‘Отчёт’;
Присваиваем первому листу в первой книге имя «Отчет». Если будем работать с самим листом, то чтобы не писать много кода мы можем просто объявить новую переменную, например, FSheet типа Variant :

И присвоим ей ссылку на наш Лист1 первой книги:

FSheet.PageSetup.Orientation := 2;
Ориентация страницы (1 – книжная, 2 – альбомная).

FSheet.PageSetup.LeftMargin := X;
Отступ от левого края страницы

FSheet.PageSetup.RightMargin := X;
Отступ от правого края страницы

FSheet.PageSetup.TopMargin := X;
Отступ от верхнего края страницы.

FSheet.PageSetup.BottomMargin := X;
Отступ от нижнего края страницы.

FSheet.PageSetup.HeaderMargin := X;
Высота верхнего колонтитула страницы.

FSheet.PageSetup.FooterMargin := X;
Высота нижнего колонтитула страницы.
Где X — это отступ в пикселях. Можно в принципе воспользоваться функцией перевода из, например, сантиметров в пиксели. Делается это так:
FSheet.PageSetup.BottomMargin := FExcel.Application.CentimetersToPoints(1.5);
Это будет полтора сантиметра, а как там переводится в пиксели это не наша забота.

FSheet.PageSetup.Zoom := false (или значение в процентах Z);
Масштаб. Принимает следующие значения:
Z — «Установить Z% от натуральной величины», где X – это количество процентов. Т.е. если вы решите включить масштабирование, то вам необходимо вместо FALSE подставить число, например: FSheet.PageSetup.Zoom := 100; (что означает 100%).
FALSE — «Разместить не более чем на: X стр. в ширину и Y стр. в высоту, где:
FSheet.PageSetup.FitToPagesWide := 1;
Количество страниц в ширину (X).
FSheet.PageSetup.FitToPagesTall := 100;
Количество страниц в высоту (Y).

FSheet.PageSetup.CenterFooter := ‘Стр. &С из &К’ ;
Центральный нижний колонтитул. В нем будет информации о номере страницы из всего страниц. Данные переменные (&C, &K и т.п.) описаны в справочнике самого Excel. Аналогично:
FSheet.PageSetup.LeftFooter:=’Левый нижний колонтитул’;
FSheet.PageSetup.RightFooter:=’Правый нижний колонтитул’;
FSheet.PageSetup.LeftHeader:=’Левый верхний колонтитул’;
FSheet.PageSetup.CenterHeader:=’Центральный верхний колонтитул’;
FSheet.PageSetup.RightHeader:=’&7Правый верхний колонтитул’; *
Примечание: *для изменения размера шрифта добавьте к колонтитулу управляющий символ «&» и размер шрифта, в нашем случае 7

// const xlAutomatic = $FFFFEFF7 (или -4105)
FSheet.PageSetup.FirstPageNumber := xlAutomatic;
Номер первой страницы. В данном случае «Авто».

FSheet.PageSetup.Order := 1;
Последовательность вывода страниц на печать (1 — вниз, затем вправо; 2 — вправо, затем вниз).

FSheet.PrintPreview;
Предварительный просмотр страницы. Если вы не продолжите печать, а нажмете «Отмена», то будет вызвано исключение.
Примечание : Excel, перед выполнением этой команды, обязательно должен быть видимым (FExcel.Visible := true;).

FSheet.PrintOut;
Вывод страницы на печать. Функция PrintOut описана так:

To — необязательный параметр. Задает последнюю печатаемую страницу. Если этот аргумент отсутствует, то печать продолжается до последней страницы.

Copies — необязательный параметр. Задает количество печатаемых копий.

Preview — необязательный параметр, принимающий одно из двух значений:
TRUE — приводит к выводу перед печатью окна предварительного просмотра;
FALSE (значение по умолчанию) — печать производится без предварительного просмотра.

ActivePrinter — необязательный параметр. Задает имя активного принтера.

PrintToFile — необязательный параметр. Если данный параметр имеет значение True, то производится печать в файл. При этом пользователю выдается запрос на ввод имени файла.

Collate — необязательный параметр. Если ему задать значение True, то копии будут объединены.
Пример:

Источник

21 / 19 / 12

Регистрация: 03.11.2013

Сообщений: 866

1

Эксель. Работать с открытой книгой

24.01.2014, 17:43. Показов 2106. Ответов 8


Студворк — интернет-сервис помощи студентам

Как в делфи можно сообщить проекту имя открытого экселевского файла?

например я открыл файл «Васютка». Как я могу передать имя этого файла и если реально путь до него)



0



volvo

Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32518 / 20999 / 8120

Регистрация: 22.10.2011

Сообщений: 36,265

Записей в блоге: 7

24.01.2014, 17:52

2

Delphi
1
2
WorkBook := xl.ActiveWorkbook;
s := workbook.FullName;



2



Vologd

21 / 19 / 12

Регистрация: 03.11.2013

Сообщений: 866

24.01.2014, 17:56

 [ТС]

3

Цитата
Сообщение от UI
Посмотреть сообщение

Delphi
1
2
WorkBook := xl.ActiveWorkbook;
s := workbook.FullName;

подскажите, еще, пожалуйста, S (фулнейм) это какой тип переменной?



0



Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32518 / 20999 / 8120

Регистрация: 22.10.2011

Сообщений: 36,265

Записей в блоге: 7

24.01.2014, 17:59

4

Строка, конечно.



0



Vologd

21 / 19 / 12

Регистрация: 03.11.2013

Сообщений: 866

24.01.2014, 18:01

 [ТС]

5

Цитата
Сообщение от UI
Посмотреть сообщение

Строка, конечно.

ну, я так и подумал((, но на стринг он ругается(( сейчас код приведу

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var
  Form1: TForm1;
  ap: variant;
  wk, s: string;
 
 
implementation
 
{$R *.dfm}
 
procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
Ap:= CreateOleObject('Excel.Application');
Wk := ap.ActiveWorkbook;
s := wk.FullName;
ap.ActiveCell.Text := 'Чего там нужно';
end;



0



Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32518 / 20999 / 8120

Регистрация: 22.10.2011

Сообщений: 36,265

Записей в блоге: 7

24.01.2014, 18:04

6

Ничего не ругается:

Эксель. Работать с открытой книгой

, я сначала проверяю, и только потом выкладываю код…



1



21 / 19 / 12

Регистрация: 03.11.2013

Сообщений: 866

24.01.2014, 18:19

 [ТС]

7

Цитата
Сообщение от UI
Посмотреть сообщение

Ничего не ругается:
Вложение 358134

, я сначала проверяю, и только потом выкладываю код…

не в коем случае не хотел Вас обидеть и уж нисколько не сомневаюсь в Вашей компетенции! На этом форуме видел много полезных ответов на тяжелые вопросы. Я лишь хотел уточнить, где я мог ошибиться, у меня подчеркивал красной волнистой чертой именно фулнейм((. Сейчас к сожалению уже надо бежать, вернусь обязательно разберусь! Спасибо! после проверки все «плюсики» тоже поставлю)



0



Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32518 / 20999 / 8120

Регистрация: 22.10.2011

Сообщений: 36,265

Записей в блоге: 7

24.01.2014, 18:44

8

Цитата
Сообщение от Vologd
Посмотреть сообщение

у меня подчеркивал красной волнистой чертой именно фулнейм

Это не страшно, Дельфи не обязан уметь парсить свойства/методы OLE-объекта. Оно может подчеркиваться как ошибка, но программа будет прекрасно компилироваться и работать…



1



Модератор

3488 / 2611 / 741

Регистрация: 19.09.2012

Сообщений: 7,971

24.01.2014, 19:22

9

Цитата
Сообщение от Vologd
Посмотреть сообщение

ну, я так и подумал((, но на стринг он ругается

wk должна быть variant



1



уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Видимо любители экономить килобайты оперативной памяти могут меня закидать помидорами или ещё чем по-хуже, но все-таки я скажу, что интеграция приложений (мегабайты оперативы) — это большой плюс нынешней разработки приложений.
Как ни крути, а время DOS и килобайтов оперативной памяти прошло. Вряд ли кто-то всерьез сейчас задумывается над тем куда это с винчестера пропал мегабайт? Да и использование в своих приложениях функциональности программ, которых ты не писал, но которые выполняют что-то лучше — это всё-таки больший прогресс, нежели корпеть год-два над программой, а потом узнать, что время-то прошло.

Введение

Итак, цель сегодняшней статьи — поделиться с Вами опытом работы с Microsoft Excel в приложениях, написанных на Delphi.
Вспомнился сейчас один случай. Когда я только начинал работать по своей специальности, пригласили меня написать программу-расчётник для экологов нашего нефтезавода. В принципе ничего серьёзного — программа считает выброс от нагревательной печи и выдает табличку результатов, которую необходимо распечатать и уложить в толстую папку с отчётами. Естественно, что в области разработки подобных приложения я далеко не пионер, поэтому дали взглянуть на аналог будущей программы, который работал ещё под DOS и печатались отчёты на дико скрипящем матричном принтере с 12-ю иголками. Ну посмотрел, элементарная таблица, расчёт немного запутан, но жить можно — начал по-тихоньку писать. И попалась мне тогда на глаза статейка про работу с Excel в Delphi. Вот я и решил попробовать выдавать отчёт не только на форму приложения, а ещё и скидывать весь ход расчёта с формулами и прочим делом в Excel…Надо сказать более сильно детской радости начальника отдела я не видел до сих пор :). Люди, всю жизнь проработавшие в DOS увидели как тот же самый расчёт может выглядеть в современных условиях. Вот теперь при определении технических заданий на каждую новую программу, обязательно присутствует пункт, гласящий, что программа должна передавать данные либо в MS Word либо в MS Excel.Соответственно и цена на разработку возрастает, иногда значительно.

Отсюда можно сделать простой и однозначный вывод — заказчики готовы пожертвовать лишними деньгами только для того, чтобы всё в программе было красиво. Excel может дать вашему приложению ту самую красоту и удобство.

Ну, а для того, чтобы каждый раз не утруждать себя выполнением однотипных операций, я разработал небольшой модуль для работы с Excel. Этот же модуль я в настоящее время дорабатываю под ещё одну задачу, но об этом после. Сегодня основы основ работы с Excel в Delphi.

Создаем новый модуль (unit) и подключаем в uses следующие модули:

uses ComObj, ActiveX, Variants, Windows, Messages, SysUtils, Classes;

теперь объявляем глобальную переменную:

Одну константу (для удобства):

const ExcelApp = 'Excel.Application';

И пишем простенькую функцию:

function CheckExcelInstall:boolean;
var
  ClassID: TCLSID;
  Rez : HRESULT;
begin
// Ищем CLSID OLE-объекта
  Rez := CLSIDFromProgID(PWideChar(WideString(ExcelApp)), ClassID);
  if Rez = S_OK then  // Объект найден
    Result := true
  else
    Result := false;
end;

Или ещё короче:

function CheckExcelInstall: boolean;
var
  ClassID: TCLSID;
begin
  Result:=CLSIDFromProgID(PWideChar(WideString(ExcelApp)), ClassID) = S_OK;
end;

Если функция CLSIDFromProgID находит CLSID OLE-объекта, то, соответственно — Excel установлен.

Но проверка на наличие установленного Excel — это только часть необходимых операций перед началом работы. Другой немаловажной проверкой является проверка на наличие уже запущенного экземпляра Excel. Если этого не делать, то может случиться такая нехорошая ситуация, когда в системе будет зарегистрировано …дцать процессов Excel и все оперативная память волшебным образом утекает «в трубу» — за такое могут и по ушам надавать. Но мы-то свои уши бережем. Пишем вторую функцию проверки.

2. Определяем запущен ли Excel

function CheckExcelRun: boolean;
begin
  try
    MyExcel:=GetActiveOleObject(ExcelApp);
    Result:=True;
  except
    Result:=false;
  end;
end;

Думаю тут лишних объяснений не потребуется? Всё предельно просто — если есть активный процесс Excel, то мы просто получаем на него ссылку и можем использовать Excel для своих корыстных целей. Главное — не забыть проверить — может кто-то этот самый Excel забыл закрыть, но это другой момент. Будем считать, что Excel в нашем полном распоряжении.

3. Как запустить Excel?

Одно дело, когда мы получаем в распоряжение уже запущенный Excel, другое — когда Excel требуется запустить из Delphi. Напишем функцию запуска Excel:

function RunExcel(DisableAlerts:boolean=true; Visible: boolean=false): boolean;
begin
  try
{проверяем установлен ли Excel}
    if CheckExcelInstall then
      begin
        MyExcel:=CreateOleObject(ExcelApp);
//показывать/не показывать системные сообщения Excel (лучше не показывать)
        MyExcel.Application.EnableEvents:=DisableAlerts;
        MyExcel.Visible:=Visible;
        Result:=true;
      end
    else
      begin
        MessageBox(0,'Приложение MS Excel не установлено на этом компьютере','Ошибка',MB_OK+MB_ICONERROR);
        Result:=false;
      end;
  except
    Result:=false;
  end;
end;

Здесь мы в начале проверяем, установлен ли Excel в принципе и, если он все же установлен, запускам. При этом мы можем сразу показать окно Excel пользователю — для этого необходимо выставить параметр Visible в значение True.

Также рекомендую всегда отключать системные сообщения Excel, иначе, когда программа начнет говорить голосом Excel — пользователь может занервничать.

Переходим к следующему этапу работы — созданию рабочей книги.

4. Создаем пустую рабочую книгу Excel

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

function AddWorkBook(AutoRun:boolean=true):boolean;
begin
  if CheckExcelRun then
    begin
      MyExcel.WorkBooks.Add;
      Result:=true;
    end
  else
   if AutoRun then
     begin
       RunExcel;
       MyExcel.WorkBooks.Add;
       Result:=true;
     end
   else
     Result:=false;
end;

Второй вариант (более лаконичный):

function AddWorkBook(AutoRun: boolean = true): boolean;
begin
  Result := CheckExcelRun;
  if (not Result) and (AutoRun) then
  begin
    RunExcel;
    Result := CheckExcelRun;
  end;
  if Result then
    MyExcel.WorkBooks.Add;
end;

То есть сразу проверяю запущен ли Excel и, если он не запущен, то либо запускаю и добавляю книгу, либо просто выхожу — всё зависит от ситуации.

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

function GetAllWorkBooks:TStringList;
var i:integer;
begin
  try
    Result:=TStringList.Create;
    for i:=1 to MyExcel.WorkBooks.Count do
      Result.Add(MyExcel.WorkBooks.Item[i].FullName)
  except
    MessageBox(0,'Ошибка перечисления открытых книг','Ошибка',MB_OK+MB_ICONERROR);
  end;
end;

Функция возвращает список TStringList всех рабочих книг Excel открытых в данный момент. Обратите внимание, что в отличие от Delphi Excel присваивает первой книге индекс 1, а не 0 как это обычно делается в Delphi при работе, например, с теми же индексами в ComboBox’ах.

Ну, и наконец, после того, как поработали с книгами — их требуется закрыть. Точнее сохранить, а потом уж закрыть.

5. Сохраняем рабочую книгу и закрываем Excel

Для того, чтобы сохранить рабочую книгу, я использовал такую функцию:

function SaveWorkBook(FileName:TFileName; WBIndex:integer):boolean;
begin
  try
    MyExcel.WorkBooks.Item[WBIndex].SaveAs(FileName);
    if MyExcel.WorkBooks.Item[WBIndex].Saved then
      Result:=true
    else
      Result:=false;
  except
    Result:=false;
  end;
end;

Если у Вас открыто 10 книг — просто вызываете функцию 10 раз, меняя значение параметра WBIndex и имени файла и дело в шляпе.

А закрывается Excel вот так:

function StopExcel:boolean;
begin
  try
    if MyExcel.Visible then MyExcel.Visible:=false;
    MyExcel.Quit;
    MyExcel:=Unassigned;
    Result:=True;
  except
    Result:=false;
  end;
end;

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

Книжная полка

Название:Разработка приложений Microsoft Office 2007 в Delphi

Описание Описаны общие подходы к программированию приложений MS Office. Даны программные методы реализации функций MS Excel, MS Word, MS Access и MS Outlook в среде Delphi.

купить книгу delphi на ЛитРес

5
3
голоса

Рейтинг статьи

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.


    Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
    1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
    2. Как «свернуть» программу в трей.
    3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
    4. Как прочитать список файлов, поддиректорий в директории?
    5. Как запустить программу/файл?
    … (продолжение следует) …


    Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
    Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


    Внимание
    Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
    Повторная попытка — 60 дней. Последующие попытки бан.
    Мат в разделе — бан на три месяца…

    >
    Как узнать, что файл Excel уже открыт?

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему



    Сообщ.
    #1

    ,
    24.12.03, 12:20

      мне надо обрабатывать екселевские файлы, но только если он не открыт еще никем.
      Как можно проверить, что его кто-то уже открыл?

      ЗЫ. И как можно сделать, чтобы ексель не спрашивал при сохранении, куда и что сохранять, а просто сохранял, куда скажут (программно) и в каком формате?

      Сообщение отредактировано: Voice — 24.12.03, 12:32


      QUE



      Сообщ.
      #2

      ,
      24.12.03, 13:42

        Цитата
        Voice,  <b>сегодня в</b> 15:20

        В FAQ …. И читать … читать ….


        Voice



        Сообщ.
        #3

        ,
        25.12.03, 08:55

          Там этого нету……


          filh



          Сообщ.
          #4

          ,
          25.12.03, 10:27

            Full Member

            ***

            Рейтинг (т): 12

            Voice, а как же Exсel понимает, что файл уже открыт? Может где то во временной директории создается файл???
            Да, файл создается, но для просмотра его не существует!

            dry.gif

            Может на мысль натолкнет

            smile.gif


            Guest



            Сообщ.
            #5

            ,
            25.12.03, 13:06

              так временных папок, куда он файлы сохраняет, может быть куча и все их проверить просто нереально, т.к. придется все просматривать и пересматривать…. Точнее не нереально, а не рационально. Слишком долго это все будет сканиться и проверяться
              Нет ли флага какого, что файл занят или как-то еще?


              Voice



              Сообщ.
              #6

              ,
              26.12.03, 07:58

                так временных папок, куда он файлы сохраняет, может быть куча и все их проверить просто нереально, т.к. придется все просматривать и пересматривать…. Точнее не нереально, а не рационально. Слишком долго это все будет сканиться и проверяться
                Нет ли флага какого, что файл занят или как-то еще?


                filh



                Сообщ.
                #7

                ,
                29.12.03, 08:39

                  Full Member

                  ***

                  Рейтинг (т): 12

                  Нашел :)

                  ExpandedWrap disabled

                    FileOpen(‘e:1.xls’, fmShareExclusive);

                  При возвращении -1 файл открыт, все что >0 никто не использует.
                  Делаешь проверку перед открытием и все.
                  Для примера взят файл 1.xls
                  Но! если файла не существует, FileOpen будет <0

                  Сообщение отредактировано: filh — 29.12.03, 08:43


                  n0wheremany



                  Сообщ.
                  #8

                  ,
                  29.12.03, 12:45

                    Чел, юзай череп (свой)!
                    Если файл открыт, то открыто окно!!

                    >>> Поищи окна (задачу)


                    Voice



                    Сообщ.
                    #9

                    ,
                    29.12.03, 13:17

                      Цитата filh @ 29.12.03, 08:39

                      Нашел :)

                      ExpandedWrap disabled

                        FileOpen(‘e:1.xls’, fmShareExclusive);

                      Я уже немного по-другому сделал :)
                      if Excel.WorkBooks[1].ReadOnly then…..

                      Добавлено в 29.12.03, 13:29:

                      Цитата filh @ 29.12.03, 08:39

                      Нашел :)

                      ExpandedWrap disabled

                        FileOpen(‘e:1.xls’, fmShareExclusive);

                      Я уже немного по-другому сделал ;)
                      if Excel.WorkBooks[1].ReadOnly then…..
                      Но скорее, воспользуюсь твоим методом, т.к. Excel.WorkBooks[1].ReadOnly возвратит true, даже если файл никем не открыт, но просто имеет атрибут «для чтения»
                      а если FileOpen(‘e:1.xls’, fmShareExclusive)<0 можно проверить и на существование файла
                      например
                      if FileOpen(‘e:1.xls’, fmShareExclusive)<0 then
                      if FileExists(‘e:1.xls’) then
                      …………….
                      спасибо :rolleyes:

                      n0wheremany
                      Я уже думал об этом, но это не рационально… Можно конечно и все процессы просмотреть и всю память просканировать. А еще можно и картинку с экрана «снять», а потом поискать на ней текст, где есть что-то похожее на имя нужного файла и, если что-то нашлось, то значит, файл занят…. (это был сарказм) :angry:
                      Но можно сделать все намного проще, главное поискать (а если не нашел, то спросить у кого-то, кто знает…. КТО ЗНАЕТ) <_<


                      filh



                      Сообщ.
                      #10

                      ,
                      30.12.03, 04:50

                        Full Member

                        ***

                        Рейтинг (т): 12

                        Цитата

                        n0wheremany от 29.12.03, 15:45
                        Если файл открыт, то открыто окно!!
                        >>> Поищи окна (задачу)

                        А если придется открывать файл по сети? Что тогда?


                        Song



                        Сообщ.
                        #11

                        ,
                        30.12.03, 06:12

                          Цитата

                          filh, 30.12.03, 07:50
                          А если придется открывать файл по сети? Что тогда?

                          А что, от этого окна не появляется?


                          n0wheremany



                          Сообщ.
                          #12

                          ,
                          30.12.03, 07:54

                            Цитата

                            n0wheremany
                            Я уже думал об этом, но это не рационально… Можно конечно и все процессы просмотреть и всю память просканировать. А еще можно и картинку с экрана «снять», а потом поискать на ней текст, где есть что-то похожее на имя нужного файла и, если что-то нашлось, то значит, файл занят…. (это был сарказм)
                            Но можно сделать все намного проще, главное поискать (а если не нашел, то спросить у кого-то, кто знает…. КТО ЗНАЕТ)

                            Это ты зря память сканить не надо!

                            ExpandedWrap disabled

                              function tform1.listprocesses:string;

                              VAR

                               Wnd : hWnd;  

                               buff: ARRAY [0..127] OF Char;

                              begin

                               result:=»;

                               Wnd := GetWindow(Handle, gw_HWndFirst);

                               WHILE Wnd <> 0 DO

                               BEGIN {Не показываем:}

                               IF (Wnd <> Application.Handle) AND {-Собственное окно}

                               IsWindowVisible(Wnd) AND {-Невидимые окна}

                              (GetWindow(Wnd, gw_Owner) = 0) AND {-Дочернии окна}

                              (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) {-Окна без заголовков}

                               THEN BEGIN

                               GetWindowText(Wnd, buff, sizeof(buff));

                               if result=» then result:=’ ‘+StrPas(buff) else result:=result+’#13#10’+’ ‘+StrPas(buff);

                               END;

                               Wnd := GetWindow(Wnd, gw_hWndNext);

                               END;

                              end;

                            Вот адаптированная для тебя

                            ExpandedWrap disabled

                              function tform1.ExcelFileOpen(NameFile:string):boolean; {без расширения}

                              VAR

                               Wnd : hWnd;  

                               buff: ARRAY [0..127] OF Char;

                              begin

                               result:=»;

                               Wnd := GetWindow(Handle, gw_HWndFirst);

                               WHILE Wnd <> 0 DO

                               BEGIN {Не показываем:}

                               IF (Wnd <> Application.Handle) AND {-Собственное окно}

                               IsWindowVisible(Wnd) AND {-Невидимые окна}

                              (GetWindow(Wnd, gw_Owner) = 0) AND {-Дочернии окна}

                              (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) {-Окна без заголовков}

                               THEN BEGIN

                               GetWindowText(Wnd, buff, sizeof(buff));

                               if StrPas(buff)=’Microsoft Excel — ‘+NameFile then result:=true;

                               END;

                               Wnd := GetWindow(Wnd, gw_hWndNext);

                               END;

                              end;

                            Проверь и посмотри!!

                            Добавлено в 30.12.03, 07:58:
                            Чуть чуть ошибся

                            ExpandedWrap disabled

                              function tform1.ExcelFileOpen(NameFile:string):boolean; {без расширения}

                              VAR

                               Wnd : hWnd;  

                               buff: ARRAY [0..127] OF Char;

                              begin

                               result:=false;                  {<<<<<<<<<<<}

                               Wnd := GetWindow(Handle, gw_HWndFirst);

                               WHILE Wnd <> 0 DO

                               BEGIN {Не показываем:}

                               IF (Wnd <> Application.Handle) AND {-Собственное окно}

                               IsWindowVisible(Wnd) AND {-Невидимые окна}

                              (GetWindow(Wnd, gw_Owner) = 0) AND {-Дочернии окна}

                              (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) {-Окна без заголовков}

                               THEN BEGIN

                               GetWindowText(Wnd, buff, sizeof(buff));

                               if StrPas(buff)=’Microsoft Excel — ‘+NameFile then result:=true;

                               END;

                               Wnd := GetWindow(Wnd, gw_hWndNext);

                               END;

                              end;


                            Петрович



                            Сообщ.
                            #13

                            ,
                            30.12.03, 08:00

                              Цитата

                              Song, 30.12.03, 09:12
                              А что, от этого окна не появляется?

                              Если файл лежит на компе \COMP1 и открыт на компе \COMP2, то на компе \COMP1 никаких окон не появляется.

                              А еще, можно открыть файл через COM интерфейс, не порождая при этом окон.


                              filh



                              Сообщ.
                              #14

                              ,
                              30.12.03, 08:52

                                Full Member

                                ***

                                Рейтинг (т): 12

                                Song,

                                Цитата

                                Петрович от 30.12.03, 11:00
                                Если файл лежит на компе \COMP1 и открыт на компе \COMP2, то на компе \COMP1 никаких окон не появляется.

                                Об этом я и говорил.


                                Song



                                Сообщ.
                                #15

                                ,
                                30.12.03, 09:01

                                  Правильно, а зачем окнам появляться на Comp2 если он открывается с Comp1!
                                  Мы что, сканим на предмет окон с Comp2 ?

                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                                  0 пользователей:

                                  • Предыдущая тема
                                  • Delphi: Общие вопросы
                                  • Следующая тема

                                  Рейтинг@Mail.ru

                                  [ Script execution time: 0,0404 ]   [ 16 queries used ]   [ Generated: 16.04.23, 13:15 GMT ]  

                                  В этом разделе приводятся краткое описание основных объектов двух наиболее популярных серверов — Excel и Word, а также примеры использования Excel в стиле VBA (по имени) и с помощью компонентов страницы Servers. Поскольку специально для версии MS Office 97 язык VBA был существенно расширен, этот материал нельзя использовать для работы с более ранними версиями пакета.

                                  Объекты Excel

                                  На рис. 1 представлена функциональная структура объектов и коллекций Excel.

                                  Объект Application имеет многочисленные свойства, методы и события, управляющие сервером в целом. Только с его помощью, например, можно визуализировать полнофункциональное окно текстового процессора. Его центральное свойство Workbooks предоставляет доступ ко всем открытым в процессоре рабочим книгам.

                                  Объекты Word

                                  На рис. 2 показана функциональная иерархия объектов Word.

                                  Позднее связывание

                                  На рис. 3 показан прайс-лист в окне Excel, а на рис. 4 — вид формы примера на этапе конструирования.

                                  Перед началом работы над проектом следует скопировать все файлы BOOKS.* в отдельную папку на жестком диске (потребуется чуть больше 800 Кбайт свободного пространства) и связать с папкой псевдоним BDE BIBLDATA типа Standard. Эту процедуру упростит программа SetupBooks.exe, расположенная в том же каталоге CD-ROM.

                                  Начните новый проект и поместите на форму компоненты Query1, Label1, Button1 и ProgressBar1. Для компонента Query1 измените значение свойства Name на Books, свяжите его с псевдонимом BIBLDATA и поместите в свойство SQL такой запрос:

                                  Создайте для него все объекты-поля. В свойство Caption компонента Label1 поместите значение Щелкните по кнопке Пуск, чтобы создать таблицу Excel, в такое же свойство кнопки — значение Пуск и измените имя компонента ProgressBar1 на pb.

                                  В окне кода в разделе private класса TForm1 поместите поле Excel типа Variant. В предложении uses укажите ссылку на модуль COMObj и напишите следующий обработчик события OnClick кнопки Button1 (см. листинг 1).

                                  Переменная Excel определяет поле класса TForm1. При создании класса в него автоматически помещается значение VarEmpty. После завершения работы с Excel пользователь может закрыть его. Но в моей программе Excel не визуализировался, его работа проходила «за кулисами», а созданная таблица записывалась в указанный пользователем файл с помощью оператора Excel.Workbooks[1].SaveAs(FileName).

                                  После этого Excel закрывался. Поскольку в нашем случае Excel показывает свое окно, а пользователь может его не закрыть, полезно написать такой обработчик события OnDestroy формы:

                                  Запуская пример, помните, что создание прайс-листа с помощью Excel — процесс достаточно длительный. На моем компьютере (400 МГц, 64 Мбайт) он занял около минуты (для примера — аналогичный прайс-лист средствами Quick Report создается менее чем за 2 с). В конце обработчика в метку lb помещается общее время работы.

                                  Раннее связывание

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

                                  Все мои попытки работать с объектами Range оказались неудачными. Чтобы вы не слишком осуждали меня, я поместил библиотеку типов Excel_TLB.pas в каталог размещения примера — полистайте ее на досуге и попробуйте найти нужное решение для изменения ширины колонок и полей листа, а также для раскрашивания диапазона, выравнивания текста и т.п.

                                  Есть свои нюансы и при обращении к ячейкам. Во-первых, ими владеет объект Application, а не Sheet. Во-вторых, обращение к конкретному элементу коллекции Cells (как и любой другой коллекции) возможно только через ее свойство Item.

                                  Редактирование таблиц MS Excel с помощью Delphi и ADO

                                  Если вы хотите подключиться к внешнему формату базы данных, поддерживаемому Jet, вам необходимо установить расширенные свойства для подключения. В нашем случае при подключении к «базе данных» Excel используются расширенные свойства для установки версии файла Excel.

                                  [expert_bq id=»1570″]Автоматизация предоставляет способ чтения данных Excel с помощью объектной модели Excel для погружения в рабочий лист, извлечения его данных и отображения их внутри сеточного компонента, а именно DBGrid или StringGrid. Если же вы хотите что-то уточнить, обращайтесь ко мне![/expert_bq]
                                  Если вы используете обновление виртуализации взаимодействия с пользователем (UE-V), установите исправление 2927019. Для этого см. Пакет исправления 1 для виртуализации взаимодействия с пользователем Microsoft 2.0.
                                  Урок 5 Создание, экспорт и печать отчета (DELPHI FastReport) | Виктор Восонов

                                  Excel открывает пустой экран, если дважды щелкнуть значок или имя файла — Office | Microsoft Docs

                                  Silverlight Excel Автоматизация Factory API Документация Привет, я использую фабрику автоматизации Excel для экспорта данных из silverlight в excel. Проблема в том, что я не могу найти документацию по использованию excel таким образом. Все, что я мог найти, где какой-то небольшой учебник, из.

                                  Понравилась статья? Поделить с друзьями:
                                • Открыть excel 2010 в новом окне
                                • Открыть doc в word 2016
                                • Открыть dbf в excel с правильной кодировкой
                                • Открыть csv в word
                                • Открыть csv в excel с разбиением на ячейки онлайн