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

 
Новый Гость
 
(2005-09-19 15:11)
[0]

Как узнать, запущен ли 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])…


> Rouse_

Спасибо!
Получилось…


Would someone assist with what I’m sure is a basic error on my part please.

My goal is to open an Excel spreadsheet (invisibly), populate it, attach it to an email, send and close everything.

It is close to complete, except that Excel remains open — in the Task Manager — after the process is complete.

The block of code is:

procedure TFMain.SendEmail;
var
  i, j, r: Integer;
  vBody, vSaveVer: string;
  vAttach: TIdAttachment;
  vMftQty: array [1 .. 2] of Integer;
  vQtyTot: array [1 .. 12] of Integer;
  vNetTot: array [1 .. 12] of Real;
  oXL, oWB, oSheet: Variant;
begin
  IdMessage1.From.Address := 'sage@valid-email.co.uk';
  IdMessage1.From.Domain := 'valid-email.co.uk';
  IdMessage1.From.Text := 'Sage <sage@valid-email.co.uk>';
  IdMessage1.Subject := 'Sage';
  try
    SQLQuery1.Close;
    SQLQuery1.SQL.Clear;
    SQLQuery1.SQL.Add('SELECT comp,dept,e_addr FROM acc_email WHERE dept="' +
      EMailQuery.FieldByName('Dept').Text + '"');
    SQLQuery1.Open;
    while not SQLQuery1.Eof do
    begin
      IdMessage1.Recipients.EMailAddresses :=
        EMailQuery.FieldByName('E_Addr').Text;
      SQLQuery2.Close;
      SQLQuery2.SQL.Clear;
      SQLQuery2.SQL.Add('SELECT * FROM invoice WHERE global_dept_number="' +
        EMailQuery.FieldByName('Dept').Text +
        '" ORDER BY account_ref, stock_code');
      SQLQuery2.Open;

      oXL := CreateOleObject('Excel.Application');
      oXL.DisplayAlerts := False;
      oWB := oXL.Workbooks.Add;
      while not SQLQuery2.Eof do
      begin
        oXL.Cells[r, 1].Value := 'Code';
        oXL.Cells[r, 2].Value := 'Description';
        oXL.Cells[r, j * 2 + 1].Value := 'Qty';
        oXL.Cells[r, j * 2 + 2].Value := 'Value';
        Inc(r);
        oWB.Worksheets.Add(After := oWB.Worksheets[oWB.Worksheets.Count]);
        oSheet := oWB.ActiveSheet;
        oSheet.Name := SQLQuery2.FieldByName('account_ref').Text;
        oXL.Cells[1, j * 2 + 1].Value := 'Month';
        r := 2;
        SQLQuery2.Next;
      end;
      if oWB.Worksheets.Count > 1 then
        oWB.Worksheets.Item['Sheet1'].Delete;
      oWB.Worksheets[1].Select;
      oWB.SaveAs(vSave + EMailQuery.FieldByName('Dept').Text + '.xlsx');
      SQLQuery1.Next;
    end;
    try
      if IdMessage1.Recipients.EMailAddresses <> '' then
      begin
        vAttach := TIdAttachmentFile.Create(IdMessage1.MessageParts,
          vSave + EMailQuery.FieldByName('Dept').Text + '.xlsx');
        IdSMTP1.Connect;
        IdSMTP1.Send(IdMessage1);
        IdMessage1.Recipients.EMailAddresses := '';
        IdMessage1.Body.Text := '';
      end;
    finally
      if IdSMTP1.Connected then
        IdSMTP1.Disconnect;
    end;
  finally
    vAttach.Free;
    oSheet := Unassigned;
    oWB := Unassigned;
    oXL.Quit;
    oXL := Unassigned;
  end;
end;

Yet Excel remains in the Task Manager and as the process runs a few times over the day, they build up in the background.

Could someone direct me to either the solution or how to troubleshoot the problem?

Содержание

  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 дней. Последующие попытки бан.
    Мат в разделе — бан на три месяца…

    >
    Закрыть файл

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



    Сообщ.
    #1

    ,
    10.10.07, 11:07

      Подскажите с таким вопросом!
      Как проверит открыт файл или нет
      и если открыт, то закрыть его.
      Если нет то далее идет работа с файлом.
      Самое главное как проверить и закрыть файл.
      Спасибо!!!!


      Сан Иваныч



      Сообщ.
      #2

      ,
      10.10.07, 11:10

        Не понял! Ты что, запускаешь свою программу и хочешь знать, открыт ли файл, который она будет использовать?


        AlikV



        Сообщ.
        #3

        ,
        10.10.07, 11:16

          Да просто там идет экспорт данных в ексель.
          Запустят программы откроют этот файл,
          забудут закрыть его просто и снова
          нажмут экспорт.
          программа выдаст ошибку типа «Ресурс занят».
          Хотелось бы чтоб проста закрыла(сама программа)
          файл и произвела экспорт и открыла этот файл екселя.
          Программа делает все экспорт, открытие.
          Хотелось бы добавить и это


          Сан Иваныч



          Сообщ.
          #4

          ,
          10.10.07, 11:35

            А кнопку «Экспорт» задисаблить религия не позволяет? У вас там что — каждые 5 минут экспортируют?


            Domino



            Сообщ.
            #5

            ,
            10.10.07, 11:39

              Цитата Сан Иваныч @ 10.10.07, 11:35

              А кнопку «Экспорт» задисаблить религия не позволяет?

              По какой причине она задизаблена? Из-за того, что эксель запущен? Лучше имя файла экспорта поменять.

              Решить задачу можно только закрыв открытый файл в экселе или сам эксель.


              AlikV



              Сообщ.
              #6

              ,
              10.10.07, 12:02

                Имя конечно можно поменять, а если все в один файл надо скидывать????
                как тут поступить, потом руками туда добавлять
                лишняя работа будет только.
                Лучше варианта чем закрыть файла я не вижу.
                Помогите плиз
                хоть на толкните как…
                Спасибо


                medved_68



                Сообщ.
                #7

                ,
                10.10.07, 12:10

                  Цитата AlikV @ 10.10.07, 11:07

                  Как проверит открыт файл или нет
                  и если открыт, то закрыть его.

                  Цитата AlikV @ 10.10.07, 11:16

                  программа выдаст ошибку типа «Ресурс занят».

                  AlikV наличие ошибки и является признаком, что файл открыт. :D Обрабатывай ошибку в программе, а не доводи дело до глобального обработчика и все. :) А обработка заключается в закрытии файла, зависит от того как открываешь его.


                  AlikV



                  Сообщ.
                  #8

                  ,
                  10.10.07, 12:14

                    Компонент использую QExport3XLS.
                    Вызываю открытие нажатием кнопки.

                    ExpandedWrap disabled

                      QExport3XLS1.Execute;

                    там сам компонент большее делает за меня, чем я кода описываю


                    nawok78



                    Сообщ.
                    #9

                    ,
                    10.10.07, 12:21

                      а если закрыть файл который не открыт? критической же ошибки не будет ? вот ты и закрывай его перед тем как туда что-то дописывать!


                      AlikV



                      Сообщ.
                      #10

                      ,
                      10.10.07, 12:34

                        [б]нащок78[/б]
                        Извини не понял как это

                        Цитата

                        а если закрыть файл который не открыт?

                        :)

                        Добавлено 10.10.07, 12:35
                        nawok78(тут подвела кнопоска одна СОРРИ)
                        Извини не понял как это

                        Цитата

                        Извини не понял как это

                        :)


                        nawok78



                        Сообщ.
                        #11

                        ,
                        10.10.07, 12:41

                          Цитата AlikV @ 10.10.07, 12:34

                          Извини не понял как это

                          а как ты собираешься программно закрывать Ехель?
                          найти Эксель и закрыть! есть CreateOleObject — может и FindOleObject есть?
                          я всего лишь идею подсказал а не пути реализации… 1 раз всего лишь с ним работал…
                          там я создаю Оле-объект затем его уничтожаю…


                          AlikV



                          Сообщ.
                          #12

                          ,
                          10.10.07, 12:51

                            Походу эта задача не разрешима.
                            Так подумал если файл был изменен и не сохранен.
                            То после закрытия может и не спросить сохранить или нет.
                            Просто возьмет и убъет всю инфу.
                            Мда……. <_<
                            Че делать :wall:


                            Marriage



                            Сообщ.
                            #13

                            ,
                            10.10.07, 13:19

                              Перед экспортом проверять открыт файл или нет. Если открыт, то тогда выводить сообщение, тчо типа файл открыт, закройте его…
                              Только так …


                              AlikV



                              Сообщ.
                              #14

                              ,
                              10.10.07, 13:22

                                Да Marriage тоже идея хорошо.
                                Подскажи тогда как проверить его открытие.
                                Никогда не сталкивался с таким
                                Спасибо


                                Marriage



                                Сообщ.
                                #15

                                ,
                                10.10.07, 13:35

                                  Цитата medved_68 @ 10.10.07, 12:10

                                  AlikV наличие ошибки и является признаком, что файл открыт. :D Обрабатывай ошибку в программе, а не доводи дело до глобального обработчика и все. :) А обработка заключается в закрытии файла, зависит от того как открываешь его.

                                  ExpandedWrap disabled

                                    procedure TForm1.Button1Click(Sender: TObject);

                                    var

                                    CurrentFile:integer;

                                    begin

                                     CurrentFile := FileOpen(‘J:ШПОРА ГОТОВАЯ.doc’, fmOpenReadWrite);

                                     If CurrentFile < 0 then

                                      Begin

                                       ShowMEssage(‘Не могу открыть файл’);

                                       exit;

                                      End;

                                     FileClose(CurrentFile);

                                    end;

                                  Сообщение отредактировано: Marriage — 10.10.07, 13:36

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

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

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

                                  Рейтинг@Mail.ru

                                  [ Script execution time: 0,0404 ]   [ 16 queries used ]   [ Generated: 13.04.23, 22:37 GMT ]  


                                  Форум программистов Vingrad

                                  Модераторы: Poseidon, Snowy, bems, MetalFan

                                  Поиск:

                                  Ответ в темуСоздание новой темы
                                  Создание опроса
                                  > Как корректно закрыть Excel 

                                  :(

                                     

                                  Опции темы

                                  Akella
                                  Дата 24.2.2004, 15:52 (ссылка)
                                  | (нет голосов)
                                  Загрузка ... Загрузка …




                                  Быстрая цитата

                                  Цитата

                                  Творец
                                  ****

                                  Профиль
                                  Группа: Модератор
                                  Сообщений: 18485
                                  Регистрация: 14.5.2003
                                  Где: Корусант

                                  Репутация: 36
                                  Всего: 329

                                  использую WinXP, ExcelXP, D7

                                  На дополнительной модальной форме лежит компонена TExcelApplication со страницы Servers
                                  Автоподключение и автовыход отключены (False)

                                  Uses System, …., ExcelXP;
                                  также объявлены глобальные переменные

                                  WorkBook: _WorkBook;
                                  Sheet: _WorkSheet;

                                  В нажатия кнопки коде пишу:

                                  Excel.Connect;
                                  Excel.WorkBooks.Open(параметры, имя файла);

                                  выполняю какие-то действия


                                  Excel.DisConnect;//это не помогает
                                  Excel.Quit;//это тоже не помогает

                                  и то и другое вместе тоже не помогает

                                  Открываю диспетчер задач — висит Excel, исчезает только после закрытия основного окна, т.е. выхода из программы.

                                  Использовать CreetOleObject не хочется, т.к. много переделывать, а уже все работает идеально кроме закрытия Excel`я

                                  весь код я уже выкладывал.

                                  PM MAIL   Вверх
                                  Cashey
                                  Дата 24.2.2004, 17:00 (ссылка)
                                  | (нет голосов)
                                  Загрузка ... Загрузка …




                                  Быстрая цитата

                                  Цитата

                                  Бессмертный
                                  ****

                                  Профиль
                                  Группа: Завсегдатай
                                  Сообщений: 3441
                                  Регистрация: 13.11.2002
                                  Где: в столице

                                  Репутация: 2
                                  Всего: 60

                                  Выгрузи переменные WorkBook и Sheet из памяти.

                                  ———————

                                  библия учит любить ближнего, а камасутра обучает как именно

                                  PM Jabber   Вверх
                                  Albinos
                                  Дата 24.2.2004, 19:03 (ссылка)
                                  | (нет голосов)
                                  Загрузка ... Загрузка …




                                  Быстрая цитата

                                  Цитата

                                  Шустрый
                                  *

                                  Профиль
                                  Группа: Участник
                                  Сообщений: 64
                                  Регистрация: 11.10.2003

                                  Репутация: 1
                                  Всего: 3

                                  А чего нибудь типа Close() там нет?

                                  PM MAIL   Вверх
                                  Georg4
                                  Дата 25.2.2004, 01:19 (ссылка)
                                  | (нет голосов)
                                  Загрузка ... Загрузка …




                                  Быстрая цитата

                                  Цитата

                                  Опытный
                                  **

                                  Профиль
                                  Группа: Участник
                                  Сообщений: 961
                                  Регистрация: 2.11.2002

                                  Репутация: 0
                                  Всего: 10

                                  Отличный вопросsmile.gifsmile.gifsmile.gif
                                  Нет не пугайтесь, кто бы то ни был, я не буду опять вбухивать суда всю мануала по ЕХЕЛУ, я действительно задолбался это делать, так что:
                                  Закрытие Excel

                                  Испольуя раннее связывание
                                  if Assigned(IExcel) then begin
                                  if (IExcel.Workbooks.Count > 0) and (not IExcel.Visible[xlLCID]) then
                                  // не закрывайте не свои книги
                                  begin
                                  IExcel.WindowState[xlLCID] := TOLEEnum(Excel8_TLB.xlMinimized);
                                  IExcel.Visible[xlLCID] := true;
                                  Application.BringToFront;
                                  end
                                  else
                                  IExcel.Quit;
                                  IExcel := nil; // см. Хорошая практика
                                  end;
                                  Зачем столько кода? Зачем столько кода? Вы не запускали новый процесс, вы «законнектились» к уже существовавшему. В нем была открыта книга. Если оставить только присваивание в nil, то существовавший процесс не будет выгружен (он же существовал до запуска вашего приложения), но будет, возможно, спрятан от пользователя с его открытой книгой.
                                  Используя компоненты Delphi 5
                                  if Assigned(Excel) then begin
                                  if (Excel.Workbooks.Count > 0) and (not Excel.Visible[xlLCID]) then
                                  // не закрывайте не свои книги
                                  begin
                                  Excel.WindowState[xlLCID] := TOLEEnum(Excel97.xlMinimized);
                                  Excel.Visible[xlLCID] := true;
                                  Application.BringToFront;
                                  end
                                  else
                                  Excel.Quit;
                                  FreeAndNil(Excel);
                                  end;
                                  В Delphi 5 вы работаете уже не с интерфейсом напрямую, а с экземпляром класса TExcelApplcation. Это настоящий экземпляр класса, освободить который просто необходимо. Поэтому вместо присваивания в nil — FreeAndNil.
                                  Используя позднее связывание
                                  if not VarIsEmpty(Excel) then begin
                                  if (Excel.Workbooks.Count > 0) and (not Excel.Visible) then
                                  // не закрывайте не свои книги
                                  begin
                                  Excel.WindowState := Excel97.xlMinimized;
                                  Excel.Visible := true;
                                  Application.BringToFront;
                                  end
                                  else
                                  Excel.Quit;
                                  Excel := UnAssigned;
                                  end;
                                  Внимание — хорошая практика!
                                  Процесс Excel останется в памяти, скрыто выполняясь, до тех пор, пока вы не освободите все ваши указатели на любые, использованные вами, интерфейсы Excel. Отсоедините все компоненты, присвойте всем интерфейсным переменным nil и установите все переменные типа variant в Unassigned, чтобы избежать этого.

                                  Вот и все!

                                  ———————

                                  Никто и никогда не должен решать одну проблему дважды

                                  PM MAIL ICQ   Вверх
                                  Kesh
                                  Дата 25.2.2004, 13:52 (ссылка)
                                  | (нет голосов)
                                  Загрузка ... Загрузка …




                                  Быстрая цитата

                                  Цитата

                                  Эксперт
                                  ****

                                  Профиль
                                  Группа: Эксперт
                                  Сообщений: 2488
                                  Регистрация: 31.7.2002
                                  Где: Германия, Saarbrü cken

                                  Репутация: 4
                                  Всего: 54

                                  Georg4 Ты бы весь цикл статей привел… Ибо это есть гуд…
                                  По-моему «По волнам интеграции…»

                                  ———————

                                  user posted image

                                  PM MAIL WWW ICQ Skype   Вверх
                                  Cashey
                                  Дата 25.2.2004, 15:44 (ссылка)
                                  | (нет голосов)
                                  Загрузка ... Загрузка …




                                  Быстрая цитата

                                  Цитата

                                  Бессмертный
                                  ****

                                  Профиль
                                  Группа: Завсегдатай
                                  Сообщений: 3441
                                  Регистрация: 13.11.2002
                                  Где: в столице

                                  Репутация: 2
                                  Всего: 60

                                  Georg4, все твои рекоммендации сводятся к одному Quit и выгрузка из памяти , что я и говорил.

                                  По поводу статей, я и сам бы мог поделиться не малым опытом работы с екселем, но для етого хорошо было бы создать отдельный форум, что бы добро не пропало smile.gif, а главное для того, что бы этим могли воспользоваться и те кто работает с другими языками и бывает на других форумах.

                                  ———————

                                  библия учит любить ближнего, а камасутра обучает как именно

                                  PM Jabber   Вверх



















                                  Ответ в темуСоздание новой темы
                                  Создание опроса
                                  Правила форума «Delphi: Общие вопросы»
                                  SnowyMetalFan
                                  bemsPoseidon
                                  Rrader

                                  Запрещается!

                                  1. Публиковать ссылки на вскрытые компоненты

                                  2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

                                  • Литературу по Дельфи обсуждаем здесь
                                  • Действия модераторов можно обсудить здесь
                                  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
                                  • Вопросы по реализации алгоритмов рассматриваются здесь
                                  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Дельфи


                                  Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

                                   

                                  0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
                                  0 Пользователей:
                                  « Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


                                  Не могу закрыть Excel из Delphi

                                  От:

                                  yuriyr

                                   
                                  Дата:  06.07.04 11:06
                                  Оценка:

                                  У меня форма запускает через Ole Excel

                                      SaveName:=Name;
                                      XLap := CreateOLEObject('Excel.Application');
                                      Workbook := XLap.WorkBooks.Open(Name);
                                      xlap.Visible := true;
                                      xlap.DefaultFilePath:=ExtractFileDir(Name);

                                  а сама всплывает поверх его (из нее я перетаскиваю в ячейки всякую шнягу)
                                  она держит application екселя до своего закрытия,
                                  а при закрытии этой формы я все сохраняю и закрываю ексель

                                      xlap.DisplayAlerts := False;
                                      Workbook.SaveAs(SaveNAme);
                                      xlap.Quit;
                                      Application.ProcessMessages;

                                  Так вот если в екселе не редактируется ячейка все проходит на ура
                                  а ежели редактируется, то он игнорирует команды на закрытие и остается открытым.
                                  Вопрос: Как бы его вывести из состояния редактирования ячейки?
                                  YuriyR


                                  Re: Не могу закрыть Excel из Delphi

                                  От:

                                  Softwarer

                                  http://softwarer.ru
                                  Дата:  06.07.04 11:16
                                  Оценка:

                                  +1

                                  Здравствуйте, yuriyr, Вы писали:

                                  Y> xlap.Quit;

                                  Y>Так вот если в екселе не редактируется ячейка все проходит на ура
                                  Y>а ежели редактируется, то он игнорирует команды на закрытие и остается открытым.

                                  Ответы на такие вопросы легче искать, сделав xlap.visible := true. В данном случае, если мне не изменяет память, Excel задает тебе вопрос о том, надо ли сохранять сделанные изменения, и, соответственно, не выходит, пока не ткнешь в Yes или No в невидимом окне Соответственно, надо явно сохранить файл.


                                  Re[2]: Не могу закрыть Excel из Delphi

                                  От:

                                  yuriyr

                                   
                                  Дата:  06.07.04 11:23
                                  Оценка:

                                  Здравствуйте, Softwarer, Вы писали:

                                  S>Здравствуйте, yuriyr, Вы писали:


                                  Y>> xlap.Quit;

                                  Y>>Так вот если в екселе не редактируется ячейка все проходит на ура
                                  Y>>а ежели редактируется, то он игнорирует команды на закрытие и остается открытым.

                                  S>Ответы на такие вопросы легче искать, сделав xlap.visible := true. В данном случае, если мне не изменяет память, Excel задает тебе вопрос о том, надо ли сохранять сделанные изменения, и, соответственно, не выходит, пока не ткнешь в Yes или No в невидимом окне Соответственно, надо явно сохранить файл.

                                  Нет первая команда xlap.DisplayAlerts := False;
                                  Она отменяет все вопросы Excel на счет подтверждения сохранения
                                  Но и она — самая первая — не выполняется exeption выдает каманда игнорирована


                                  Re[3]: Не могу закрыть Excel из Delphi

                                  От:

                                  Softwarer

                                  http://softwarer.ru
                                  Дата:  06.07.04 11:28
                                  Оценка:

                                  Здравствуйте, yuriyr, Вы писали:

                                  Y>Нет первая команда xlap.DisplayAlerts := False;

                                  Виноват, действительно прореагировал «на рефлексах». Прошу прощения.


                                  Re[3]: Не могу закрыть Excel из Delphi

                                  От:

                                  akasoft

                                  Россия

                                   
                                  Дата:  06.07.04 13:36
                                  Оценка:

                                  Здравствуйте, yuriyr, Вы писали:

                                  Y>Нет первая команда xlap.DisplayAlerts := False;

                                  Y>Она отменяет все вопросы Excel на счет подтверждения сохранения

                                  Я тебе конечно верю, но и ты мне поверь, иногда Excel капризничает, иногда привелегий не хватает. Попробуй с алертами, посмотри, что он там пишет и дай ему это…

                                  … << RSDN@Home 1.1.4 beta 2 >>


                                  Re[4]: Не могу закрыть Excel из Delphi

                                  От:

                                  yuriyr

                                   
                                  Дата:  06.07.04 16:25
                                  Оценка:

                                  Здравствуйте, akasoft, Вы писали:

                                  A>Я тебе конечно верю, но и ты мне поверь, иногда Excel капризничает, иногда привелегий не хватает. Попробуй с алертами, посмотри, что он там пишет и дай ему это…

                                  Попробовал и так. Изменений нет
                                  OLE error ‘Вызов был отклонен’
                                  Использую ExcelXP
                                  Help! Please


                                  Re: Не могу закрыть Excel из Delphi

                                  От:

                                  Slicer [Mirkwood]

                                  Россия

                                  https://ru.linkedin.com/in/maksim-gumerov-039a701b
                                  Дата:  06.07.04 19:01
                                  Оценка:

                                  Да не команду на закрытие он игнорирует, а любые OLE-вызовы

                                  Slicer

                                  Специалист — это варвар, невежество которого не всесторонне :)


                                  Re[5]: Не могу закрыть Excel из Delphi

                                  От:

                                  Григоричев Денис

                                   
                                  Дата:  08.07.04 05:15
                                  Оценка:

                                  6 (1)

                                  Здравствуйте, yuriyr, Вы писали:
                                  Y>Здравствуйте, akasoft, Вы писали:

                                  A>>Я тебе конечно верю, но и ты мне поверь, иногда Excel капризничает, иногда привелегий не хватает. Попробуй с алертами, посмотри, что он там пишет и дай ему это…


                                  Y>Попробовал и так. Изменений нет

                                  Y>OLE error ‘Вызов был отклонен’
                                  Y>Использую ExcelXP
                                  Y>Help! Please
                                  Таки да, есть такая бодяга. Проходили.Вылечилось так:
                                  EA.SendKeys(‘{ESC}’,0,LOCALE_USER_DEFAULT);
                                  Где EA — ExcelApplication.
                                  Этим мы вырубаем режим редактирования ячейки. Дальше он принимает все OLE вызовы.

                                  … << RSDN@Home 1.1.3 stable >>


                                  Re[6]: Не могу закрыть Excel из Delphi

                                  От:

                                  Slicer [Mirkwood]

                                  Россия

                                  https://ru.linkedin.com/in/maksim-gumerov-039a701b
                                  Дата:  08.07.04 09:04
                                  Оценка:

                                  Логично
                                  Интересно, а нормальное решение есть? Без имитации клавиатурного ввода?
                                  Ведь такая имитация плоха уже тем, что при этом отменяются внесенные юзверем в ячейку изменения. Сравните это с поведением самого Excel: если мы пытаемся его закрыть в момент редактирования, внесенные в ячейку изменения считаются подтвержденными.
                                  Кстати, напомню, что в ряде случаев такая блокировка со стороны Excel очень логична (если, например, юзверь сидит в диалоговом окне).

                                  Во многих случаях может подойти открытие данных как внедренного OLE-объекта. При этом как только пользователь переключится на другой элемент нашего окна, automation закроет эксель (в т.ч. если эксель был в режиме редактирования — но не в диалоговом окне). Правда, есть и досадный глюк (по кр. мере, в D6): если в design-time открыть (open, а не edit) объект в OLEContainer, а потом закрыть только книгу (но не эксель), будет закрыта и эксель тоже. А вот если то же проделать в рантайме — эксель останется открыта. Подробно не смотрел — может, как-то это регулируется. Ну сопровождение этого глюка — если один раз объект открыли в режиме open и закрыли, потом с ним можно делать что угодно — но в режиме просмотра в контейнере он при этом будет заштрихован серым (как если в данный момент редактируется в режиме open).

                                  На выбор еще три варианта, не полностью, но решающих проблему: 1) ждем, пока Excel не согласна будет выполнить нашу команду (юзер покинет диалог или выйдет из режима редактирования), 2) блокируем пользовательский интерфейс Excel, 3) открываем данные в режиме «только для чтения» (проблема с диалогами остается).

                                  Кстати, а зачем понадобилось показывать юзеру эксель и разрешать редактирование? И почему убивать Excel мы пытаемся из нашего приложения? Раз уж юзеру дали возможность полазить по таблице, так может, он сам определится, когда ему выходить?

                                  Slicer

                                  Специалист — это варвар, невежество которого не всесторонне :)


                                  Re[7]: Не могу закрыть Excel из Delphi

                                  От:

                                  Григоричев Денис

                                   
                                  Дата:  09.07.04 05:27
                                  Оценка:

                                  Здравствуйте, Slicer [Mirkwood], Вы писали:

                                  SM>Логично

                                  SM>Интересно, а нормальное решение есть? Без имитации клавиатурного ввода?
                                  IMHO, нет. Я не нашел, спрашивал об этом на Королевстве Дельфи — мне так и сказали. Так же мне сказали, что сплошная безнадега пытаться узнать позицию курсора при редактировании ячейки.
                                  SM>Ведь такая имитация плоха уже тем, что при этом отменяются внесенные юзверем в ячейку изменения.
                                  Мне это подходило, ибо я все равно затираю содержимое ячейки. В ЭТОМ случае. В другом — ставлю в позицию редактирования. Нашел способ.
                                  SM> Сравните это с поведением самого Excel: если мы пытаемся его закрыть в момент редактирования, внесенные в ячейку изменения считаются подтвержденными.
                                  О, Excel это такая загадочная вещь!
                                  SM>Во многих случаях может подойти открытие данных как внедренного OLE-объекта. При этом как только
                                  Я его так и использую. Мне нужно было достроить меню своими фишками, и, чтобы не мучиться с Add-in-ами, сделал в OleContainer.

                                  SM>Кстати, а зачем понадобилось показывать юзеру эксель и разрешать редактирование? И почему убивать Excel мы пытаемся из нашего приложения? Раз уж юзеру дали возможность полазить по таблице, так может, он сам определится, когда ему выходить?

                                  Не всегда это подходит. У меня это делается в диалоговом окне. Т.е., юзер, сам решает, когда ему прекратить редактирование. Но убиваем Excel из нашего приложения. Ксати, есть способ убить процесс Excel, если прогу «срубили», например из TaskMan?
                                  Денис

                                  … << RSDN@Home 1.1.3 stable >>


                                  Re[8]: Не могу закрыть Excel из Delphi

                                  От:

                                  Slicer [Mirkwood]

                                  Россия

                                  https://ru.linkedin.com/in/maksim-gumerov-039a701b
                                  Дата:  09.07.04 09:52
                                  Оценка:

                                  ГД>Ксати, есть способ убить процесс Excel, если прогу «срубили», например из TaskMan?
                                  Это вряд ли хорошо — в экселе могут быть открыты чьи-то еще документы, кроме подсунутых Вами

                                  Slicer

                                  Специалист — это варвар, невежество которого не всесторонне :)


                                  Re[9]: Не могу закрыть Excel из Delphi

                                  От:

                                  yuriyr

                                   
                                  Дата:  09.07.04 11:21
                                  Оценка:

                                  Сделал так
                                  Не могу использовать OleContainer так как суть работы заключается в OLE перетаскивании данных из одного обьекта
                                  в ексель, а сним при потере фокуса в контейнере нифига не сделаешь.

                                  procedure TDSBOXF.OpenTemplate(Name: string);
                                  begin
                                  try
                                  SaveName := Name;
                                  XLap := CreateOLEObject(‘Excel.Application’);
                                  Workbook := XLap.WorkBooks.Open(Name);
                                  xlap.Visible := true;
                                  xlap.DefaultFilePath := ExtractFileDir(Name);
                                  except
                                  end;
                                  Show;
                                  end;

                                  procedure TDSBOXF.FormClose(Sender: TObject; var Action: TCloseAction);
                                  var
                                  i: integer;
                                  findapp: string;
                                  begin

                                  ////////////////////////////////////////////////////////////////////////////////
                                  // Save Workbook
                                  ////////////////////////////////////////////////////////////////////////////////

                                  try
                                  xlap.DisplayAlerts := False;
                                  Workbook.SaveAs(SaveNAme);
                                  Workbook.Close(False);
                                  Application.ProcessMessages;
                                  except
                                  on E: Exception do
                                  begin
                                  // if (E.ClassName = ‘EOleSysError’) AND (EOleSysError(E).ErrorCode = -2147417848) then Exit; // Отключен клиент
                                  if (E.ClassName = ‘EOleSysError’) and (EOleSysError(E).ErrorCode = -2147418111) then // Заблокирован Excel
                                  begin
                                  findapp := ‘Microsoft Excel — ‘ + ChangeFileExt(ExtractFileNAme(SaveNAme), »);
                                  if not AppActivate(Pchar(findapp)) then
                                  begin
                                  findapp := ‘Microsoft Excel*’;
                                  if not AppActivate(Pchar(findapp)) then Exit;
                                  end;
                                  begin
                                  try
                                  SendKeys(‘{TAB}’, True);
                                  Application.ProcessMessages;
                                  xlap.DisplayAlerts := False;
                                  Workbook.SaveAs(SaveNAme);
                                  Workbook.Close(False);
                                  Application.ProcessMessages;
                                  except
                                  end;
                                  end;
                                  end;
                                  end;
                                  end;

                                  Покритикуйте!
                                  Посылаю TAB через Sendkey32 немного модифицированный.
                                  Там еще пишут XLap := CreateOLEObject(‘Excel.Application 7.8.9… ‘);
                                  Вот эти 7-8-9 сильно нужны или нет ? У меня вроде и так все работает.

                                  Подождите ...

                                  Wait...

                                  • Переместить
                                  • Удалить
                                  • Выделить ветку

                                  Пока на собственное сообщение не было ответов, его можно удалить.

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