1 / 1 / 0 Регистрация: 07.01.2017 Сообщений: 69 |
|
1 |
|
12.01.2017, 13:08. Показов 6338. Ответов 8
Помогите пожалуйста нужно проверить открыт ли конкретный excel файл и если да, то закрыть его.(delphi)
0 |
5501 / 4296 / 1379 Регистрация: 14.04.2014 Сообщений: 19,296 Записей в блоге: 19 |
|
12.01.2017, 14:16 |
2 |
эмм, он открыт в Excel, и надо прибить Excel ?
0 |
4884 / 2756 / 849 Регистрация: 04.10.2012 Сообщений: 10,054 |
|
12.01.2017, 16:17 |
3 |
Markontr, пригодится для Excel
0 |
Markontr 1 / 1 / 0 Регистрация: 07.01.2017 Сообщений: 69 |
||||
17.01.2017, 14:19 [ТС] |
4 |
|||
ребят, вот код, при запуске приложения все работает хорошо, но если одновременно с сохранением будет открыта таблица rabota2, то выдает ошибку, что файл доступен только для чтения и не записывается. Так вот как сделать так, чтобы при программа вначале смотрела открыт ли файл rabota2 и если да то либо сохраняла и закрывала его, либо работала с ним, короче нужно сделать так, чтоб не было ошибки.
0 |
droider 4884 / 2756 / 849 Регистрация: 04.10.2012 Сообщений: 10,054 |
||||
17.01.2017, 15:45 |
5 |
|||
как сделать так, чтобы при программа вначале смотрела открыт ли файл rabota2 я же Вам дал ссылку выше. Стоило посмотреть самому
Следует учитывать взаимосвязь процедур и функции в приведенной статье. Например, функция WorkBookIndex() — отдельная функция и приведена там же.
0 |
1 / 1 / 0 Регистрация: 07.01.2017 Сообщений: 69 |
|
17.01.2017, 15:46 [ТС] |
6 |
Благодарю
0 |
droider 4884 / 2756 / 849 Регистрация: 04.10.2012 Сообщений: 10,054 |
||||
17.01.2017, 15:49 |
7 |
|||
и закрывала его Из той же статьи
Все будет красиво оформлено. Главное — правильно применить!
0 |
1 / 1 / 0 Регистрация: 07.01.2017 Сообщений: 69 |
|
17.01.2017, 15:50 [ТС] |
8 |
Все все, спасибо большое. Принял!
0 |
droider |
17.01.2017, 15:53
|
Не по теме:
Принял Good
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
17.01.2017, 15:53 |
9 |
|
|
|
Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как «свернуть» программу в трей.
3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
… (продолжение следует) …
Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка — 60 дней. Последующие попытки бан.
Мат в разделе — бан на три месяца…
Как узнать, что файл Excel уже открыт?
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
мне надо обрабатывать екселевские файлы, но только если он не открыт еще никем. ЗЫ. И как можно сделать, чтобы ексель не спрашивал при сохранении, куда и что сохранять, а просто сохранял, куда скажут (программно) и в каком формате? Сообщение отредактировано: Voice — 24.12.03, 12:32 |
QUE |
|
||
В FAQ …. И читать … читать …. |
Voice |
|
Там этого нету…… |
filh |
|
Full Member Рейтинг (т): 12 |
Voice, а как же Exсel понимает, что файл уже открыт? Может где то во временной директории создается файл??? Может на мысль натолкнет |
Guest |
|
так временных папок, куда он файлы сохраняет, может быть куча и все их проверить просто нереально, т.к. придется все просматривать и пересматривать…. Точнее не нереально, а не рационально. Слишком долго это все будет сканиться и проверяться |
Voice |
|
так временных папок, куда он файлы сохраняет, может быть куча и все их проверить просто нереально, т.к. придется все просматривать и пересматривать…. Точнее не нереально, а не рационально. Слишком долго это все будет сканиться и проверяться |
filh |
|
Full Member Рейтинг (т): 12 |
Нашел
FileOpen(‘e:1.xls’, fmShareExclusive);
При возвращении -1 файл открыт, все что >0 никто не использует. Сообщение отредактировано: filh — 29.12.03, 08:43 |
n0wheremany |
|
Чел, юзай череп (свой)! >>> Поищи окна (задачу) |
Voice |
|
Цитата filh @ 29.12.03, 08:39 Нашел
FileOpen(‘e:1.xls’, fmShareExclusive);
Я уже немного по-другому сделал Добавлено в 29.12.03, 13:29: Цитата filh @ 29.12.03, 08:39 Нашел
FileOpen(‘e:1.xls’, fmShareExclusive);
Я уже немного по-другому сделал n0wheremany |
filh |
|
Full Member Рейтинг (т): 12 |
Цитата n0wheremany от 29.12.03, 15:45 А если придется открывать файл по сети? Что тогда? |
Song |
|
Цитата filh, 30.12.03, 07:50 А что, от этого окна не появляется? |
n0wheremany |
|
Цитата n0wheremany Это ты зря память сканить не надо!
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; Вот адаптированная для тебя
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:
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; |
Петрович |
|
Цитата Song, 30.12.03, 09:12 Если файл лежит на компе \COMP1 и открыт на компе \COMP2, то на компе \COMP1 никаких окон не появляется. А еще, можно открыть файл через COM интерфейс, не порождая при этом окон. |
filh |
|
Full Member Рейтинг (т): 12 |
Song, Цитата Петрович от 30.12.03, 11:00 Об этом я и говорил. |
Song |
|
Правильно, а зачем окнам появляться на Comp2 если он открывается с Comp1! |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Общие вопросы
- Следующая тема
[ Script execution time: 0,0373 ] [ 16 queries used ] [ Generated: 16.04.23, 19:06 GMT ]
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Видимо любители экономить килобайты оперативной памяти могут меня закидать помидорами или ещё чем по-хуже, но все-таки я скажу, что интеграция приложений (мегабайты оперативы) — это большой плюс нынешней разработки приложений.
Как ни крути, а время 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. |
5
3
голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Содержание
- Delphi проверить открыт или нет excel
- Delphi проверить открыт или нет excel
- Работа с Excel в Delphi. Основы основ.
- Введение
- 1. Как проверить установлен ли Excel на компьютере пользователя?
- Как проверить открыт ли в Excele нужный файл
- 8 ответов
- Excel в Delphi
- Работа с Excel в Delphi. Основы основ
- Excel в Delphi. Методы объекта WorkSheet (лист)
- Диаграммы Excel в Delphi. Общие сведения
- Excel в Delphi. Работа с объектом Range (диапазон)
- Excel в Delphi. Как изменить внешний вид ячеек?
- Полная автоматизация. Редактируем объекты Excel, содержащиеся в документах Word и наоборот
- Быстрая обработка данных Excel в Delphi
- Пост-ответ. Работа с примечаниями в Excel
- Excel в Delphi. Работа со свойствами документа
- Создаем свои контролы на ленте Microsoft Office
Delphi проверить открыт или нет excel
← →
>| 2005-02-28 17:18 ) [1]
Можна например так
GetPidFromProcessName(«EXCEL.EXE») <> $FFFF
но это как-то неправильно.
← →
MU ( 2005-02-28 17:21 ) [2]
может,
function GetActiveOleObject(const ClassName: string): IDispatch;
← →
wild_arg © ( 2005-02-28 17:22 ) [3]
if MessageDlg(«А не открыт ли у Вас Excel?», mtConfirmation, [mbYes,mbNo],0)=mrYes
then
//открыт
else
//не открыт
🙂 сорьки, не удержался.
← →
pasha_golub © ( 2005-02-28 17:25 ) [4]
wild_arg © (28.02.05 17:22) [3]
LOL
MU (28.02.05 17:21) [2]
ИМХО, не пойдет. Ибо откроет новое и скажет, шо есть..
function GetActiveOleObject в отношении к EXCEL работает некорректно. Я и сама в этом убедилась, а потом нашла в книге «СОМ-технологии» подтверждение, авторы пишут «. по непонятным причинам»
← →
MU ( 2005-02-28 17:28 ) [6]
2 pasha_golub ©
подойдет
← →
ArchValentin © ( 2005-02-28 18:10 ) [7]
не гони, всё можно намутить гораздо проще, перебираешь все окошки FindWindow , и проверяешь если первые n букв в названии равны «MS Exel» то => он открыт иначе нихрена подобного.
← →
Ольга ( 2005-02-28 18:25 ) [8]
А если смотреть в корень: зачем вам знать открыт ли Excel? Может нужно просто корректно закрывать «свои» Excel-и, а то можно закрыть открытый пользователем Excel, не имеющий никакого отношения к вашему приложению.
← →
aus ( 2005-02-28 18:30 ) [9]
ArchValentin © (28.02.05 18:10) [7]
не гони, я ведь имею право свой хелловорлд назвать «MS Exel»
> [3] wild_arg © (28.02.05 17:22)
> if MessageDlg(«А не открыт ли у Вас Excel?», mtConfirmation,
> [mbYes,mbNo],0)=mrYes
> then
> //открыт
> else
> //не открыт
С точки зрения программиста, пользователь — это периферийное устройство,
вводящее набор символов в ответ на команду READ. 🙂
← →
GanibalLector © ( 2005-03-01 02:10 ) [11]
Вариант№1(облегченный)
var Excels:Variant;
begin
try
try
Excels:=GetActiveOleObject(«Excel.Application»);
finally
//значит есть 😉
Excels:=Unassigned;
end;
except
MessageDlg(«Нет его тут!»,mterror,[MbOk],0);
end;
end;
← →
GanibalLector © ( 2005-03-01 02:16 ) [12]
Вариант №2(с коннектом)
var Excels:Variant;
n:integer;
begin
try
try
Excels:=GetActiveOleObject(«Excel.Application»);
Caption:=»Найдено документов:»+ IntToStr(Excels.WorkBooks.Count);
for n:=1 to Excels.WorkBooks.Count do
begin
if AnsiSameText(«E:Kharkov.xls»,Excels.Workbooks[n].FullName) then
begin
// тут работаем
Excels.WorkBooks[1].WorkSheets[1].Name:=»Привет из Харькова!»;
//
end;
end;
finally
Excels:=Unassigned;
end;
except
MessageDlg(«Excel не найден!»,mterror,[MbOk],0);
end;
end;
← →
GanibalLector © ( 2005-03-01 02:22 ) [13]
2 >|И еще,хотел поинтересоваться.
В статье http://www.delphimaster.ru/articles/frames/index.html Вы работаете с INI на мой взгяд не корректно.Ведь не всегда есть права на запись! Тут бы try . except не помешали .
З.Ы.Пардон,если что.
← →
ArchValentin © ( 2005-03-01 03:41 ) [14]
> aus (28.02.05 18:30) [9]
. и сколько ты видел программ с заголовком «Microsoft Exel»? если не секрет. Вот мне только некая прога из какого-то Office»a попадалась :)))
Источник
Delphi проверить открыт или нет excel
Как узнать, запущен ли Excel(2000) и закрыть его в случае необходимости?
← →
Гость Бывалый ( 2005-09-19 15:41 ) [1]
Есть такое «Я его породил, я его и убью» (с).
Может нехорошо закрывать программу открытую не Вами ? Обьясните причину.
← →
Rouse_ © ( 2005-09-19 15:42 ) [2]
AppProgId := «Excel.Application»;
AResult := GetActiveObject(ProgIDToClassID(AppProgId), nil, Unknown);
if (AResult <> MK_E_UNAVAILABLE) then
begin
App := GetActiveOleObject(AppProgId);
App.Quit;
end;
← →
Новый Гость ( 2005-09-19 16:13 ) [3]
> Гость Бывалый
Идет обмен данными по DDE между программой и открытым в Excel документом — открытие происходит непосредственно перед обменом командой ShellExecute — поэтому, если до запуска файла Excel не был открыт, то по завершении работы его необходимо закрыть, иначе просто закрыть рабочий файл. Закрыть файл по DDE получается ([CLOSE]), а закрыть весь Excel нет ([QUIT]).
Источник
Работа с Excel в Delphi. Основы основ.
Видимо любители экономить килобайты оперативной памяти могут меня закидать помидорами или ещё чем по-хуже, но все-таки я скажу, что интеграция приложений (мегабайты оперативы) — это большой плюс нынешней разработки приложений.
Как ни крути, а время DOS и килобайтов оперативной памяти прошло. Вряд ли кто-то всерьез сейчас задумывается над тем куда это с винчестера пропал мегабайт? Да и использование в своих приложениях функциональности программ, которых ты не писал, но которые выполняют что-то лучше — это всё-таки больший прогресс, нежели корпеть год-два над программой, а потом узнать, что время-то прошло.
Введение
Итак, цель сегодняшней статьи — поделиться с Вами опытом работы с Microsoft Excel в приложениях, написанных на Delphi.
Вспомнился сейчас один случай. Когда я только начинал работать по своей специальности, пригласили меня написать программу-расчётник для экологов нашего нефтезавода. В принципе ничего серьёзного — программа считает выброс от нагревательной печи и выдает табличку результатов, которую необходимо распечатать и уложить в толстую папку с отчётами. Естественно, что в области разработки подобных приложения я далеко не пионер, поэтому дали взглянуть на аналог будущей программы, который работал ещё под DOS и печатались отчёты на дико скрипящем матричном принтере с 12-ю иголками. Ну посмотрел, элементарная таблица, расчёт немного запутан, но жить можно — начал по-тихоньку писать. И попалась мне тогда на глаза статейка про работу с Excel в Delphi. Вот я и решил попробовать выдавать отчёт не только на форму приложения, а ещё и скидывать весь ход расчёта с формулами и прочим делом в Excel…Надо сказать более сильно детской радости начальника отдела я не видел до сих пор :). Люди, всю жизнь проработавшие в DOS увидели как тот же самый расчёт может выглядеть в современных условиях. Вот теперь при определении технических заданий на каждую новую программу, обязательно присутствует пункт, гласящий, что программа должна передавать данные либо в MS Word либо в MS Excel.Соответственно и цена на разработку возрастает, иногда значительно.
Отсюда можно сделать простой и однозначный вывод — заказчики готовы пожертвовать лишними деньгами только для того, чтобы всё в программе было красиво. Excel может дать вашему приложению ту самую красоту и удобство.
Ну, а для того, чтобы каждый раз не утруждать себя выполнением однотипных операций, я разработал небольшой модуль для работы с Excel. Этот же модуль я в настоящее время дорабатываю под ещё одну задачу, но об этом после. Сегодня основы основ работы с Excel в Delphi.
1. Как проверить установлен ли Excel на компьютере пользователя?
Создаем новый модуль (unit) и подключаем в uses следующие модули:
Источник
Как проверить открыт ли в Excele нужный файл
Нужно узнать открыт ли в Excele нужный мне файл или нет. Если открыт то активизировать его и работать с ним. А вообще даже не знаю как проверить запущен ли сам Excel.
Проблема в том, что vba крутится под другим приложением, хотя наверно это не проблема.
8 ответов
Я бы сделал бы так
Sub Макрос1()
Dim WB As Workbook
Dim myWorkBook As String
myWorkBook = «Бюджет.xls» ‘задаём имя искомой книги
On Error Resume Next
Windows(myWorkBook).Activate
If Err.Number = 9 Then
MsgBox «Книга » & myWorkBook & » не открыта!», , «»
End If
On Error GoTo 0
End Sub
Sub Макрос2()
Dim WB As Workbook
Dim myWorkBook As String
myWorkBook = «Бюджет.xls» ‘задаём имя искомой книги
For Each WB In Application.Workbooks
If WB.Name = myWorkBook Then
Windows(WB.Name).Activate
End
End If
Next
If ActiveWorkbook.Name <> myWorkBook Then MsgBox «Книга » & myWorkBook & » не открыта!», , «»
End Sub
первый вариант работает на ура, но проблемы начинаются после нескольких программных пусков excel’я и ручных закрытий. потом он перестаёт его видеть и начинает постоянно открывать новые копии книги. со вторым вариантом дело обстоит также.
пробовал на двух машинах 2k sp4 и xp sp2. excel 2003(11).
проблема в том что всеми этими способами я не вижу была ли открыта книга до того как была запущена моя программа. а это очень важно т.к. книга повторно откроется только для чтения, а мне надо писать в неё данные каждые 2 часа. запретить открывать книгу я тоже не могу т.к. она может быть нужна для просмотра данных.
может есть какие другие способы, через winapi или еще как, чтобы можно было 100% определить открыта ли книга и если да то писать в неё
Проверяй на существование экземпляр Excel.
Function CheckWorksheet(strName As String) As Boolean
On Error Resume Next
Dim pExcel As Excel.Application
‘Получаем объект
Set pExcel = GetObject(class:=»Excel.Application»)
If Not pExcel Is Nothing Then
Dim wb As Workbook
Источник
Excel в Delphi
На этой странице представлена подборка статей, посвященные работе с Excel в Delphi. Все статьи расположены по порядку изложения материала в блоге, то есть от самых основ работы с Excel в Delphi до выполнения сложных операций, вставки диаграмм в книгу и так далее.
Работа с Excel в Delphi. Основы основ
Это вводная статья по работе с excel в delphi, которая поможет вам разобраться с основами по взаимодействия вашего приложения Delphi и Microsoft Excel. В статье рассмотрены следующие вопросы:
Excel в Delphi. Методы объекта WorkSheet (лист)
В статье рассмотрены вопросы о том, как можно работать с листами рабочей книги, изменять внешний вид ячеек, копировать таблицу из своего приложения Delphi в открытую рабочую книгу:
Диаграммы Excel в Delphi. Общие сведения
В статье рассмотрен способ добавления диаграммы в лист Excel через объект ChartObjects. План статьи следующий:
Excel в Delphi. Работа с объектом Range (диапазон)
Статья дает более полное представление о том, как можно работать с данными листа Excel в Delphi, используя объект Range (диапазон). Рассмотрены свойства и методы объекта range. План статьи:
Excel в Delphi. Как изменить внешний вид ячеек?
В статье рассматриваются вопросы оформления ячеек таблицы Excel в Delphi:
Полная автоматизация. Редактируем объекты Excel, содержащиеся в документах Word и наоборот
В статье рассматривается достаточно нетривиальный вопрос: как добраться до диаграммы Excel, внедренной в документ Word и работать с ней в Delphi? Статья состоит из трех частей:
Быстрая обработка данных Excel в Delphi
Эта статья раскрывает вопросы, касающиеся быстрой обработки данных при работе с Excel в Delphi. Одной из проблем, с которой сталкиваются начинающие разработчики, является то, что рассмотренные в предыдущих статьях методы чтения/записи данных в Excel работают очень медленно при большом количестве данных. Статья позволяет понять то, как сократить время операций при работе с Excel в Delphi в несколько раз, используя вариантные массивы и библиотеку XLSReadWrite.
Пост-ответ. Работа с примечаниями в Excel
В статье рассматривается то, как, используя Delphi вставлять и редактировать примечания в ячейках Excel. План статьи:
Excel в Delphi. Работа со свойствами документа
Статья раскрывает вопросы изменения свойств документа Excel в Delphi и состоит из трех частей:
Создаем свои контролы на ленте Microsoft Office
Небольшая заметка о том, как получить доступ у ленте Excel и добавить на неё свою кнопку.
Эти и другие статьи, посвященные работе с Excel в Delphi вы всегда сможете найти в блоге по тегу Excel в Delphi
Источник
← →
}|{yk ©
(2005-02-28 17:11)
[0]
Собственно.
← →
}|{yk ©
(2005-02-28 17:18)
[1]
Можна например такGetPidFromProcessName("EXCEL.EXE") <> $FFFF
но это как-то неправильно…
← →
MU
(2005-02-28 17:21)
[2]
может,
function GetActiveOleObject(const ClassName: string): IDispatch;
← →
wild_arg ©
(2005-02-28 17:22)
[3]
if MessageDlg("А не открыт ли у Вас Excel?", mtConfirmation, [mbYes,mbNo],0)=mrYes
then
//открыт
else
//не открыт
сорьки, не удержался…
← →
pasha_golub ©
(2005-02-28 17:25)
[4]
wild_arg © (28.02.05 17:22) [3]
LOL
MU (28.02.05 17:21) [2]
ИМХО, не пойдет. Ибо откроет новое и скажет, шо есть..
← →
Ольга
(2005-02-28 17:27)
[5]
function GetActiveOleObject в отношении к EXCEL работает некорректно. Я и сама в этом убедилась, а потом нашла в книге «СОМ-технологии» подтверждение, авторы пишут «… по непонятным причинам»
← →
MU
(2005-02-28 17:28)
[6]
2 pasha_golub ©
подойдет
← →
ArchValentin ©
(2005-02-28 18:10)
[7]
не гони, всё можно намутить гораздо проще, перебираешь все окошки FindWindow
, и проверяешь если первые n букв в названии равны «MS Exel» то => он открыт иначе нихрена подобного.
← →
Ольга
(2005-02-28 18:25)
[8]
А если смотреть в корень: зачем вам знать открыт ли Excel? Может нужно просто корректно закрывать «свои» Excel-и, а то можно закрыть открытый пользователем Excel, не имеющий никакого отношения к вашему приложению.
← →
aus
(2005-02-28 18:30)
[9]
ArchValentin © (28.02.05 18:10) [7]
не гони, я ведь имею право свой хелловорлд назвать «MS Exel»
← →
Алхимик ©
(2005-02-28 18:40)
[10]
> [3] wild_arg © (28.02.05 17:22)
> if MessageDlg(«А не открыт ли у Вас Excel?», mtConfirmation,
> [mbYes,mbNo],0)=mrYes
> then
> //открыт
> else
> //не открыт
С точки зрения программиста, пользователь — это периферийное устройство,
вводящее набор символов в ответ на команду READ.
← →
GanibalLector ©
(2005-03-01 02:10)
[11]
Вариант№1(облегченный)
var Excels:Variant;
begin
try
try
Excels:=GetActiveOleObject("Excel.Application");
finally
//значит есть ;)
Excels:=Unassigned;
end;
except
MessageDlg("Нет его тут!",mterror,[MbOk],0);
end;
end;
← →
GanibalLector ©
(2005-03-01 02:16)
[12]
Вариант №2(с коннектом) var Excels:Variant;
n:integer;
begin
try
try
Excels:=GetActiveOleObject("Excel.Application");
Caption:="Найдено документов:"+ IntToStr(Excels.WorkBooks.Count);
for n:=1 to Excels.WorkBooks.Count do
begin
if AnsiSameText("E:Kharkov.xls",Excels.Workbooks[n].FullName) then
begin
// тут работаем
Excels.WorkBooks[1].WorkSheets[1].Name:="Привет из Харькова!";
//
end;
end;
finally
Excels:=Unassigned;
end;
except
MessageDlg("Excel не найден!",mterror,[MbOk],0);
end;
end;
← →
GanibalLector ©
(2005-03-01 02:22)
[13]
2 }|{yk ©
И еще,хотел поинтересоваться…
В статье http://www.delphimaster.ru/articles/frames/index.html Вы работаете с INI на мой взгяд не корректно.Ведь не всегда есть права на запись! Тут бы try … except не помешали .
З.Ы.Пардон,если что…
← →
ArchValentin ©
(2005-03-01 03:41)
[14]
> aus (28.02.05 18:30) [9]
…и сколько ты видел программ с заголовком «Microsoft Exel»? если не секрет. Вот мне только некая прога из какого-то Office»a попадалась :)))