Delphi проверить открыт или нет excel

1 / 1 / 0

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

Сообщений: 69

1

12.01.2017, 13:08. Показов 6211. Ответов 8


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

Помогите пожалуйста нужно проверить открыт ли конкретный excel файл и если да, то закрыть его.(delphi)



0



5501 / 4296 / 1379

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

Сообщений: 19,295

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

12.01.2017, 14:16

2

эмм, он открыт в Excel, и надо прибить Excel ?



0



Эксперт Pascal/Delphi

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

Delphi
1
2
3
4
5
6
7
8
9
Ap.Workbooks.Open(ExtractFilePath(ParamStr(0))+'rabota2.xls');
 Ap.WorkSheets[1].Activate;
 d:=Ap.ActiveSheet.UsedRange.Rows.Count+1;// подсчет кол-во знятых строк+1
    Ap.Cells.Item[d,1] :=Edit9.Text;
 Ap.DisplayAlerts:=False;
 Ap.ActiveWorkbook.SaveAs(ExtractFilePath(ParamStr(0))+'rabota2.xls');
 showmessage('сохранил ');
 Ap.ActiveWorkbook.Close;
 Ap.Application.Quit;



0



droider

Эксперт Pascal/Delphi

4884 / 2756 / 849

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

Сообщений: 10,054

17.01.2017, 15:45

5

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

как сделать так, чтобы при программа вначале смотрела открыт ли файл rabota2

я же Вам дал ссылку выше. Стоило посмотреть самому

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure OpenWorkBook(WorkBookName: Ansistring);
var
  k: integer;
begin
  CheckExtension(WorkBookName);
  if VarIsEmpty(Excel) = true then
  begin
    Excel := CreateOleObject('Excel.Application');
    Excel.Visible := true;
  end;
  k := WorkBookIndex(WorkBookName);
  if k = 0 then
    Excel.Workbooks.Open(WorkBookName)
  else
    MessageDlg('Книга с таким именем уже открыта.', mtWarning, [mbOk], 0);
end;

Следует учитывать взаимосвязь процедур и функции в приведенной статье. Например, функция WorkBookIndex() — отдельная функция и приведена там же.



0



1 / 1 / 0

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

Сообщений: 69

17.01.2017, 15:46

 [ТС]

6

Благодарю



0



droider

Эксперт Pascal/Delphi

4884 / 2756 / 849

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

Сообщений: 10,054

17.01.2017, 15:49

7

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

и закрывала его

Из той же статьи

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure CloseWorkBook(WorkBookName: Ansistring);
var
  k: integer;
begin
  if VarIsEmpty(Excel) = false then
  begin
    k := WorkBookIndex(WorkBookName);
    if k <> 0 then
      Excel.ActiveWorkbook.Close(WorkBookName)
    else
      MessageDlg('Книга с таким именем отсутствует.', mtWarning, [mbOk], 0);
  end;
end;

Все будет красиво оформлено. Главное — правильно применить!



0



1 / 1 / 0

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

Сообщений: 69

17.01.2017, 15:50

 [ТС]

8

Все все, спасибо большое. Принял!



0



droider

17.01.2017, 15:53


    Проверить открыт ли файл excel, если да закрыть

Не по теме:

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

Принял

;) Good



0



IT_Exp

Эксперт

87844 / 49110 / 22898

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

Сообщений: 92,604

17.01.2017, 15:53

9

 
}|{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 попадалась :)))


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

Видимо любители экономить килобайты оперативной памяти могут меня закидать помидорами или ещё чем по-хуже, но все-таки я скажу, что интеграция приложений (мегабайты оперативы) — это большой плюс нынешней разработки приложений.
Как ни крути, а время 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
голоса

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

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

Содержание

  1. Delphi проверить открыт или нет excel
  2. Delphi проверить открыт или нет excel
  3. Работа с Excel в Delphi. Основы основ.
  4. Введение
  5. 1. Как проверить установлен ли Excel на компьютере пользователя?
  6. Как проверить открыт ли в Excele нужный файл
  7. 8 ответов
  8. Excel в Delphi
  9. Работа с Excel в Delphi. Основы основ
  10. Excel в Delphi. Методы объекта WorkSheet (лист)
  11. Диаграммы Excel в Delphi. Общие сведения
  12. Excel в Delphi. Работа с объектом Range (диапазон)
  13. Excel в Delphi. Как изменить внешний вид ячеек?
  14. Полная автоматизация. Редактируем объекты Excel, содержащиеся в документах Word и наоборот
  15. Быстрая обработка данных Excel в Delphi
  16. Пост-ответ. Работа с примечаниями в Excel
  17. Excel в Delphi. Работа со свойствами документа
  18. Создаем свои контролы на ленте 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

Источник

    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,0519 ]   [ 16 queries used ]   [ Generated: 13.04.23, 22:37 GMT ]  

                                  Понравилась статья? Поделить с друзьями:
                                • Delphi все листы excel в один лист
                                • Delphi весь текст word
                                • Delphi в другой ячейке excel
                                • Delphi xml в word
                                • Delphi word что такое