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 |
4884 / 2756 / 849 Регистрация: 04.10.2012 Сообщений: 10,054 |
|
12.01.2017, 16:17 |
3 |
Markontr, пригодится для Excel
0 |
Markontr 1 / 1 / 0 Регистрация: 07.01.2017 Сообщений: 69 |
||||
17.01.2017, 14:19 [ТС] |
4 |
|||
ребят, вот код, при запуске приложения все работает хорошо, но если одновременно с сохранением будет открыта таблица rabota2, то выдает ошибку, что файл доступен только для чтения и не записывается. Так вот как сделать так, чтобы при программа вначале смотрела открыт ли файл rabota2 и если да то либо сохраняла и закрывала его, либо работала с ним, короче нужно сделать так, чтоб не было ошибки.
0 |
droider 4884 / 2756 / 849 Регистрация: 04.10.2012 Сообщений: 10,054 |
||||
17.01.2017, 15:45 |
5 |
|||
как сделать так, чтобы при программа вначале смотрела открыт ли файл rabota2 я же Вам дал ссылку выше. Стоило посмотреть самому
Следует учитывать взаимосвязь процедур и функции в приведенной статье. Например, функция WorkBookIndex() — отдельная функция и приведена там же.
0 |
1 / 1 / 0 Регистрация: 07.01.2017 Сообщений: 69 |
|
17.01.2017, 15:46 [ТС] |
6 |
Благодарю
0 |
droider 4884 / 2756 / 849 Регистрация: 04.10.2012 Сообщений: 10,054 |
||||
17.01.2017, 15:49 |
7 |
|||
и закрывала его Из той же статьи
Все будет красиво оформлено. Главное — правильно применить!
0 |
1 / 1 / 0 Регистрация: 07.01.2017 Сообщений: 69 |
|
17.01.2017, 15:50 [ТС] |
8 |
Все все, спасибо большое. Принял!
0 |
droider |
17.01.2017, 15:53
|
Не по теме:
Принял Good
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
17.01.2017, 15:53 |
9 |
← →
Новый Гость
(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?
Содержание
- Delphi проверить открыт или нет excel
- Delphi проверить открыт или нет excel
- Работа с Excel в Delphi. Основы основ.
- Введение
- 1. Как проверить установлен ли Excel на компьютере пользователя?
- Как проверить открыт ли в Excele нужный файл
- 8 ответов
- Excel в Delphi
- Работа с Excel в Delphi. Основы основ
- Excel в Delphi. Методы объекта WorkSheet (лист)
- Диаграммы Excel в Delphi. Общие сведения
- Excel в Delphi. Работа с объектом Range (диапазон)
- Excel в Delphi. Как изменить внешний вид ячеек?
- Полная автоматизация. Редактируем объекты Excel, содержащиеся в документах Word и наоборот
- Быстрая обработка данных Excel в Delphi
- Пост-ответ. Работа с примечаниями в Excel
- Excel в Delphi. Работа со свойствами документа
- Создаем свои контролы на ленте Microsoft Office
Delphi проверить открыт или нет excel
← →
>| 2005-02-28 17:18 ) [1]
Можна например так
GetPidFromProcessName(«EXCEL.EXE») <> $FFFF
но это как-то неправильно.
← →
MU ( 2005-02-28 17:21 ) [2]
может,
function GetActiveOleObject(const ClassName: string): IDispatch;
← →
wild_arg © ( 2005-02-28 17:22 ) [3]
if MessageDlg(«А не открыт ли у Вас Excel?», mtConfirmation, [mbYes,mbNo],0)=mrYes
then
//открыт
else
//не открыт
🙂 сорьки, не удержался.
← →
pasha_golub © ( 2005-02-28 17:25 ) [4]
wild_arg © (28.02.05 17:22) [3]
LOL
MU (28.02.05 17:21) [2]
ИМХО, не пойдет. Ибо откроет новое и скажет, шо есть..
function GetActiveOleObject в отношении к EXCEL работает некорректно. Я и сама в этом убедилась, а потом нашла в книге «СОМ-технологии» подтверждение, авторы пишут «. по непонятным причинам»
← →
MU ( 2005-02-28 17:28 ) [6]
2 pasha_golub ©
подойдет
← →
ArchValentin © ( 2005-02-28 18:10 ) [7]
не гони, всё можно намутить гораздо проще, перебираешь все окошки FindWindow , и проверяешь если первые n букв в названии равны «MS Exel» то => он открыт иначе нихрена подобного.
← →
Ольга ( 2005-02-28 18:25 ) [8]
А если смотреть в корень: зачем вам знать открыт ли Excel? Может нужно просто корректно закрывать «свои» Excel-и, а то можно закрыть открытый пользователем Excel, не имеющий никакого отношения к вашему приложению.
← →
aus ( 2005-02-28 18:30 ) [9]
ArchValentin © (28.02.05 18:10) [7]
не гони, я ведь имею право свой хелловорлд назвать «MS Exel»
> [3] wild_arg © (28.02.05 17:22)
> if MessageDlg(«А не открыт ли у Вас Excel?», mtConfirmation,
> [mbYes,mbNo],0)=mrYes
> then
> //открыт
> else
> //не открыт
С точки зрения программиста, пользователь — это периферийное устройство,
вводящее набор символов в ответ на команду READ. 🙂
← →
GanibalLector © ( 2005-03-01 02:10 ) [11]
Вариант№1(облегченный)
var Excels:Variant;
begin
try
try
Excels:=GetActiveOleObject(«Excel.Application»);
finally
//значит есть 😉
Excels:=Unassigned;
end;
except
MessageDlg(«Нет его тут!»,mterror,[MbOk],0);
end;
end;
← →
GanibalLector © ( 2005-03-01 02:16 ) [12]
Вариант №2(с коннектом)
var Excels:Variant;
n:integer;
begin
try
try
Excels:=GetActiveOleObject(«Excel.Application»);
Caption:=»Найдено документов:»+ IntToStr(Excels.WorkBooks.Count);
for n:=1 to Excels.WorkBooks.Count do
begin
if AnsiSameText(«E:Kharkov.xls»,Excels.Workbooks[n].FullName) then
begin
// тут работаем
Excels.WorkBooks[1].WorkSheets[1].Name:=»Привет из Харькова!»;
//
end;
end;
finally
Excels:=Unassigned;
end;
except
MessageDlg(«Excel не найден!»,mterror,[MbOk],0);
end;
end;
← →
GanibalLector © ( 2005-03-01 02:22 ) [13]
2 >|И еще,хотел поинтересоваться.
В статье http://www.delphimaster.ru/articles/frames/index.html Вы работаете с INI на мой взгяд не корректно.Ведь не всегда есть права на запись! Тут бы try . except не помешали .
З.Ы.Пардон,если что.
← →
ArchValentin © ( 2005-03-01 03:41 ) [14]
> aus (28.02.05 18:30) [9]
. и сколько ты видел программ с заголовком «Microsoft Exel»? если не секрет. Вот мне только некая прога из какого-то Office»a попадалась :)))
Источник
Delphi проверить открыт или нет excel
Как узнать, запущен ли Excel(2000) и закрыть его в случае необходимости?
← →
Гость Бывалый ( 2005-09-19 15:41 ) [1]
Есть такое «Я его породил, я его и убью» (с).
Может нехорошо закрывать программу открытую не Вами ? Обьясните причину.
← →
Rouse_ © ( 2005-09-19 15:42 ) [2]
AppProgId := «Excel.Application»;
AResult := GetActiveObject(ProgIDToClassID(AppProgId), nil, Unknown);
if (AResult <> MK_E_UNAVAILABLE) then
begin
App := GetActiveOleObject(AppProgId);
App.Quit;
end;
← →
Новый Гость ( 2005-09-19 16:13 ) [3]
> Гость Бывалый
Идет обмен данными по DDE между программой и открытым в Excel документом — открытие происходит непосредственно перед обменом командой ShellExecute — поэтому, если до запуска файла Excel не был открыт, то по завершении работы его необходимо закрыть, иначе просто закрыть рабочий файл. Закрыть файл по DDE получается ([CLOSE]), а закрыть весь Excel нет ([QUIT]).
Источник
Работа с Excel в Delphi. Основы основ.
Видимо любители экономить килобайты оперативной памяти могут меня закидать помидорами или ещё чем по-хуже, но все-таки я скажу, что интеграция приложений (мегабайты оперативы) — это большой плюс нынешней разработки приложений.
Как ни крути, а время DOS и килобайтов оперативной памяти прошло. Вряд ли кто-то всерьез сейчас задумывается над тем куда это с винчестера пропал мегабайт? Да и использование в своих приложениях функциональности программ, которых ты не писал, но которые выполняют что-то лучше — это всё-таки больший прогресс, нежели корпеть год-два над программой, а потом узнать, что время-то прошло.
Введение
Итак, цель сегодняшней статьи — поделиться с Вами опытом работы с Microsoft Excel в приложениях, написанных на Delphi.
Вспомнился сейчас один случай. Когда я только начинал работать по своей специальности, пригласили меня написать программу-расчётник для экологов нашего нефтезавода. В принципе ничего серьёзного — программа считает выброс от нагревательной печи и выдает табличку результатов, которую необходимо распечатать и уложить в толстую папку с отчётами. Естественно, что в области разработки подобных приложения я далеко не пионер, поэтому дали взглянуть на аналог будущей программы, который работал ещё под DOS и печатались отчёты на дико скрипящем матричном принтере с 12-ю иголками. Ну посмотрел, элементарная таблица, расчёт немного запутан, но жить можно — начал по-тихоньку писать. И попалась мне тогда на глаза статейка про работу с Excel в Delphi. Вот я и решил попробовать выдавать отчёт не только на форму приложения, а ещё и скидывать весь ход расчёта с формулами и прочим делом в Excel…Надо сказать более сильно детской радости начальника отдела я не видел до сих пор :). Люди, всю жизнь проработавшие в DOS увидели как тот же самый расчёт может выглядеть в современных условиях. Вот теперь при определении технических заданий на каждую новую программу, обязательно присутствует пункт, гласящий, что программа должна передавать данные либо в MS Word либо в MS Excel.Соответственно и цена на разработку возрастает, иногда значительно.
Отсюда можно сделать простой и однозначный вывод — заказчики готовы пожертвовать лишними деньгами только для того, чтобы всё в программе было красиво. Excel может дать вашему приложению ту самую красоту и удобство.
Ну, а для того, чтобы каждый раз не утруждать себя выполнением однотипных операций, я разработал небольшой модуль для работы с Excel. Этот же модуль я в настоящее время дорабатываю под ещё одну задачу, но об этом после. Сегодня основы основ работы с Excel в Delphi.
1. Как проверить установлен ли Excel на компьютере пользователя?
Создаем новый модуль (unit) и подключаем в uses следующие модули:
Источник
Как проверить открыт ли в Excele нужный файл
Нужно узнать открыт ли в Excele нужный мне файл или нет. Если открыт то активизировать его и работать с ним. А вообще даже не знаю как проверить запущен ли сам Excel.
Проблема в том, что vba крутится под другим приложением, хотя наверно это не проблема.
8 ответов
Я бы сделал бы так
Sub Макрос1()
Dim WB As Workbook
Dim myWorkBook As String
myWorkBook = «Бюджет.xls» ‘задаём имя искомой книги
On Error Resume Next
Windows(myWorkBook).Activate
If Err.Number = 9 Then
MsgBox «Книга » & myWorkBook & » не открыта!», , «»
End If
On Error GoTo 0
End Sub
Sub Макрос2()
Dim WB As Workbook
Dim myWorkBook As String
myWorkBook = «Бюджет.xls» ‘задаём имя искомой книги
For Each WB In Application.Workbooks
If WB.Name = myWorkBook Then
Windows(WB.Name).Activate
End
End If
Next
If ActiveWorkbook.Name <> myWorkBook Then MsgBox «Книга » & myWorkBook & » не открыта!», , «»
End Sub
первый вариант работает на ура, но проблемы начинаются после нескольких программных пусков excel’я и ручных закрытий. потом он перестаёт его видеть и начинает постоянно открывать новые копии книги. со вторым вариантом дело обстоит также.
пробовал на двух машинах 2k sp4 и xp sp2. excel 2003(11).
проблема в том что всеми этими способами я не вижу была ли открыта книга до того как была запущена моя программа. а это очень важно т.к. книга повторно откроется только для чтения, а мне надо писать в неё данные каждые 2 часа. запретить открывать книгу я тоже не могу т.к. она может быть нужна для просмотра данных.
может есть какие другие способы, через winapi или еще как, чтобы можно было 100% определить открыта ли книга и если да то писать в неё
Проверяй на существование экземпляр Excel.
Function CheckWorksheet(strName As String) As Boolean
On Error Resume Next
Dim pExcel As Excel.Application
‘Получаем объект
Set pExcel = GetObject(class:=»Excel.Application»)
If Not pExcel Is Nothing Then
Dim wb As Workbook
Источник
Excel в Delphi
На этой странице представлена подборка статей, посвященные работе с Excel в Delphi. Все статьи расположены по порядку изложения материала в блоге, то есть от самых основ работы с Excel в Delphi до выполнения сложных операций, вставки диаграмм в книгу и так далее.
Работа с Excel в Delphi. Основы основ
Это вводная статья по работе с excel в delphi, которая поможет вам разобраться с основами по взаимодействия вашего приложения Delphi и Microsoft Excel. В статье рассмотрены следующие вопросы:
Excel в Delphi. Методы объекта WorkSheet (лист)
В статье рассмотрены вопросы о том, как можно работать с листами рабочей книги, изменять внешний вид ячеек, копировать таблицу из своего приложения Delphi в открытую рабочую книгу:
Диаграммы Excel в Delphi. Общие сведения
В статье рассмотрен способ добавления диаграммы в лист Excel через объект ChartObjects. План статьи следующий:
Excel в Delphi. Работа с объектом Range (диапазон)
Статья дает более полное представление о том, как можно работать с данными листа Excel в Delphi, используя объект Range (диапазон). Рассмотрены свойства и методы объекта range. План статьи:
Excel в Delphi. Как изменить внешний вид ячеек?
В статье рассматриваются вопросы оформления ячеек таблицы Excel в Delphi:
Полная автоматизация. Редактируем объекты Excel, содержащиеся в документах Word и наоборот
В статье рассматривается достаточно нетривиальный вопрос: как добраться до диаграммы Excel, внедренной в документ Word и работать с ней в Delphi? Статья состоит из трех частей:
Быстрая обработка данных Excel в Delphi
Эта статья раскрывает вопросы, касающиеся быстрой обработки данных при работе с Excel в Delphi. Одной из проблем, с которой сталкиваются начинающие разработчики, является то, что рассмотренные в предыдущих статьях методы чтения/записи данных в Excel работают очень медленно при большом количестве данных. Статья позволяет понять то, как сократить время операций при работе с Excel в Delphi в несколько раз, используя вариантные массивы и библиотеку XLSReadWrite.
Пост-ответ. Работа с примечаниями в Excel
В статье рассматривается то, как, используя Delphi вставлять и редактировать примечания в ячейках Excel. План статьи:
Excel в Delphi. Работа со свойствами документа
Статья раскрывает вопросы изменения свойств документа Excel в Delphi и состоит из трех частей:
Создаем свои контролы на ленте Microsoft Office
Небольшая заметка о том, как получить доступ у ленте Excel и добавить на неё свою кнопку.
Эти и другие статьи, посвященные работе с Excel в Delphi вы всегда сможете найти в блоге по тегу Excel в Delphi
Источник
|
|
|
Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как «свернуть» программу в трей.
3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
… (продолжение следует) …
Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка — 60 дней. Последующие попытки бан.
Мат в разделе — бан на три месяца…
Закрыть файл
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Подскажите с таким вопросом! |
Сан Иваныч |
|
Не понял! Ты что, запускаешь свою программу и хочешь знать, открыт ли файл, который она будет использовать? |
AlikV |
|
Да просто там идет экспорт данных в ексель. |
Сан Иваныч |
|
А кнопку «Экспорт» задисаблить религия не позволяет? У вас там что — каждые 5 минут экспортируют? |
Domino |
|
Цитата Сан Иваныч @ 10.10.07, 11:35 А кнопку «Экспорт» задисаблить религия не позволяет? По какой причине она задизаблена? Из-за того, что эксель запущен? Лучше имя файла экспорта поменять. Решить задачу можно только закрыв открытый файл в экселе или сам эксель. |
AlikV |
|
Имя конечно можно поменять, а если все в один файл надо скидывать???? |
medved_68 |
|
Цитата AlikV @ 10.10.07, 11:07 Как проверит открыт файл или нет Цитата AlikV @ 10.10.07, 11:16 программа выдаст ошибку типа «Ресурс занят». AlikV наличие ошибки и является признаком, что файл открыт. Обрабатывай ошибку в программе, а не доводи дело до глобального обработчика и все. А обработка заключается в закрытии файла, зависит от того как открываешь его. |
AlikV |
|
Компонент использую QExport3XLS.
QExport3XLS1.Execute; там сам компонент большее делает за меня, чем я кода описываю |
nawok78 |
|
а если закрыть файл который не открыт? критической же ошибки не будет ? вот ты и закрывай его перед тем как туда что-то дописывать! |
AlikV |
|
[б]нащок78[/б] Цитата а если закрыть файл который не открыт? Добавлено 10.10.07, 12:35 Цитата Извини не понял как это
|
nawok78 |
|
Цитата AlikV @ 10.10.07, 12:34 Извини не понял как это
а как ты собираешься программно закрывать Ехель? |
AlikV |
|
Походу эта задача не разрешима. |
Marriage |
|
Перед экспортом проверять открыт файл или нет. Если открыт, то тогда выводить сообщение, тчо типа файл открыт, закройте его… |
AlikV |
|
Да Marriage тоже идея хорошо. |
Marriage |
|
Цитата medved_68 @ 10.10.07, 12:10 AlikV наличие ошибки и является признаком, что файл открыт. Обрабатывай ошибку в программе, а не доводи дело до глобального обработчика и все. А обработка заключается в закрытии файла, зависит от того как открываешь его.
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: Общие вопросы
- Следующая тема
[ Script execution time: 0,0404 ] [ 16 queries used ] [ Generated: 13.04.23, 22:37 GMT ]
Форум программистов Vingrad
Модераторы: Poseidon, Snowy, bems, MetalFan |
Поиск: |
|
Как корректно закрыть Excel |
Опции темы |
Akella |
|
||
Творец Профиль
Репутация: 36
|
использую WinXP, ExcelXP, D7 На дополнительной модальной форме лежит компонена TExcelApplication со страницы Servers Uses System, …., ExcelXP; WorkBook: _WorkBook; В нажатия кнопки коде пишу: выполняю какие-то действия Excel.DisConnect;//это не помогает Открываю диспетчер задач — висит Excel, исчезает только после закрытия основного окна, т.е. выхода из программы. Использовать CreetOleObject не хочется, т.к. много переделывать, а уже все работает идеально кроме закрытия Excel`я весь код я уже выкладывал. |
||
|
|||
Cashey |
|
||
Бессмертный Профиль
Репутация: 2
|
Выгрузи переменные WorkBook и Sheet из памяти. ——————— библия учит любить ближнего, а камасутра обучает как именно |
||
|
|||
Albinos |
|
||
Шустрый Профиль Репутация: 1
|
А чего нибудь типа Close() там нет? |
||
|
|||
Georg4 |
|
||
Опытный Профиль Репутация: 0
|
Отличный вопрос Испольуя раннее связывание Вот и все! ——————— Никто и никогда не должен решать одну проблему дважды |
||
|
|||
Kesh |
|
||
Эксперт Профиль
Репутация: 4
|
Georg4 Ты бы весь цикл статей привел… Ибо это есть гуд… ——————— |
||
|
|||
Cashey |
|
||
Бессмертный Профиль
Репутация: 2
|
Georg4, все твои рекоммендации сводятся к одному Quit и выгрузка из памяти , что я и говорил. По поводу статей, я и сам бы мог поделиться не малым опытом работы с екселем, но для етого хорошо было бы создать отдельный форум, что бы добро не пропало , а главное для того, что бы этим могли воспользоваться и те кто работает с другими языками и бывает на других форумах. ——————— библия учит любить ближнего, а камасутра обучает как именно |
||
|
|||
|
Правила форума «Delphi: Общие вопросы» | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, 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 сильно нужны или нет ? У меня вроде и так все работает.
- Переместить
- Удалить
- Выделить ветку
Пока на собственное сообщение не было ответов, его можно удалить.