1 | ||||||
Если открыт Excel, то возникает ошибка при сохранении09.03.2020, 13:42. Показов 2689. Ответов 15
Здравствуйте!
Если что-то неправильно (не та ветка и т.д.), то я первый раз на форуме. Пишу программу, работающую с Excel. Сохраняет-загружает нормально, большинство ошибок исправил. Но когда жмёшь кнопку "Сохранить в Excel" и одновременно открыт файл, в который нужно сохранить, то выдаёт ошибку "Project ИМЯ_ТАКОЕ-ТО.exe raised exception class EOleException with message 'Нет доступа к ИМЯ_ТАКОЕ-ТО.xlsx''. Process stopped. Use Step or Run to continue", зелёная стрелка указывает на строку Excel.WorkBooks[1].WorkSheets[1].SaveAs(GetExcelFileName), выделенную синим цветом и Excel остаётся в фоновых процессах Диспетчера задач. Если без Delphi запускаю из Windows скомпилированный exe-файл и одновременно открыт файл, куда нужно сохранить, тогда тоже выдаёт ошибку 'Нет доступа к ИМЯ_ТАКОЕ-ТО.xlsx'. Есть ли что-то вроде Excel.DisplayAlerts := False, чтобы перехватить эту ошибку и либо закрыть Excel (необязательно. Пользователь открыл - пусть сам и закрывает), либо вывести вежливый ShowMessage с просьбой закрыть файл вместо ошибки "Нет доступа"? Помогите, пожалуйста. Уже несколько дней эту проблему ищу. Спасибо! PS: попробовал хитрость - сохранять с другим расширением файла, чтобы пользователь просто не пробовал его открывать. Но какая-то эта хитрость... нечестная. На всякий случай программный код кнопки "Сохранить в Excel":
Многострочные коды пробовал добавлять, но много багов получается. Пожалуйста, попроще, если есть.
0
|
09.03.2020, 13:42 | |
Ответы с готовыми решениями:
15
При сохранении xml возникает ошибка, связанная с кодировкой При сохранении битмапа возникает такая ошибка: "В GDI+ возникла ошибка общего вида" Ошибка при сохранении Excel файла Ошибка при сохранении данных из StringGrid в Excel |
Модератор
|
|
09.03.2020, 15:14 | 2 |
А как, интересно, Вы хотите записать данные в файл, уже открытый на редактирование? Такой фокус не пройдет, если только сама книга Excel не настроена на многопользовательский режим... Ищите открытые процессы Excel, проверяйте на соответствие открытый файл и свое имя и если совпадает - либо сами убивайте процесс либо просите сделать это пользователя...
Но вообще - это не есть гут - лезть программно в файл, куда могут залезть другие пользователи... Очень много косяков можно огрести...
0
|
09.03.2020, 15:49 [ТС] | 3 |
записать данные в файл, уже открытый на редактирование, я не хочу. Я как раз ищу вариант "либо сами убивайте процесс либо просите сделать это пользователя".
Видимо, подобный вопрос рассмотрен в теме Проверить открыт ли файл excel, если да закрыть, но мне не удалось это применить, не всё понятно (я не программист по образованию).
0
|
Модератор
|
|
09.03.2020, 16:31 | 6 |
Alexander-7, я еще раз не постесняюсь спросить: почему файл, куда Вы что-то пытаетесь писать программно, должен быть открыт каким-то левым пользователем? Что за глобальная задача перед Вами поставлена?
0
|
10.03.2020, 13:39 [ТС] | 7 |
D1973, например, поработал пользователь в написанной мной программе. Потом нажал "Сохранить" и программа сама создала файл Excel. Он заинтересовался, что это за файл появился, открыл его. Забыл закрыть (или не знает, что надо закрыть), переключился на программу, что-то изменил и опять захотел сохранить. Так вот надо, чтобы вместо ошибки "Нет доступа к ..." вышло заготовленное сообщение: "Закройте, пожалуйста ...".
Я много вариантов перепробовал. Уже устал с этим вопросом. Буду благодарен, если кто подскажет конкретную строчку (или 2-3), но не "многоэтажные" процедуры, которые в ссылке выше: пока что я не спец в Delphi. Если такого нет, то извиняюсь за беспокойство. Наверное, так и надо, но как это выглядит на языке Delphi? Отследить, открыт ли файл Excel можно ли в 1-2 строки? Если открыт, то попросить закрыть, иначе выполнить SaveAs. Добавлено через 27 минут Разработка системы противодействия Skynet'у
0
|
10.03.2020, 13:42 | 8 |
а поискать?
Проверить открыт ли файл excel, если да закрыть то есть если в решении больше 3х строк, то ты им не воспользуешься? как же ты будешь программы писать?
0
|
15.03.2020, 16:05 [ТС] | 11 | |||||
Решение найдено. Сделал через SaveDialog и OpenDialog. Вероятность подключения к запущенному excel отлавливаю через try-except. По крайней мере, ошибку не выдаёт. Как-то так:
После этого SaveAs, finally и т.д.
0
|
16.03.2020, 14:36 [ТС] | 13 |
qwertehok, это хорошо или плохо? Пустой except я нашёл на . Сам Excel остаётся в фоновых процессах.
И ещё. Что такое VarIsEmpty(Excel) доступными словами? Что означает, когда оно = true и когда = false? Добавлено через 55 секунд - здесь Пустой except Добавлено через 1 минуту Ссылки на чужие форумы запрещены? В общем нашёл где-то.
0
|
02.04.2020, 16:08 [ТС] | 15 | |||||
Решение я всё-таки нашёл. Ларчик просто открывался. Чтобы тема не «висела» без ответа, завершу – может ещё кому-то пригодится:
1. Заключить SaveAs в try-except.
2. Отключить реакцию системы Delphi на исключительные ситуации, тем самым давая возможность отработать операторам try/except/end. Пункт системного меню Delphi Tools -> Debugger Options. В появившемся окошке нужно снять галку в чекбоксе Stop on Delphi Exceptions, расположенном на вкладке Language Exceptions. Также потом советуют вернуть эту галочку. Теперь всё чётко работает.
0
|
02.04.2020, 16:45 | 16 |
это костыль, причем если раньше ты не обрабатывал исключения, теперь ты их отключил
код, который тебе дали выше, проверяет не открыт ли файл и прекрасно работает
0
|
02.04.2020, 16:45 | |
02.04.2020, 16:45 | |
Помогаю со студенческими работами здесь
16
Ошибка при сохранении dataGridView в Excel файл. Ошибка при сохранении после чтения-записи в Excel Возникает ошибка при записи в файл Excel При сохранении данных таблицы StringGrid в Excel появляется ошибка Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |