LISP. Обращение к Excel'y и смена адреса ячейки - Страница 2
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Обращение к Excel'y и смена адреса ячейки

LISP. Обращение к Excel'y и смена адреса ячейки

Ответ
Поиск в этой теме
Непрочитано 28.04.2006, 12:22
LISP. Обращение к Excel'y и смена адреса ячейки
Кулик Алексей aka kpblc
Moderator
 
LISP, C# (ACAD 200[9,12,13,14])
 
С.-Петербург
Регистрация: 25.08.2003
Сообщений: 40,411

Задача - прочитать весь лист Excel'a в лисповой список. Указатели на Excel, Workbook, Worksheet получены. Дальше делаю примерно следующее:
Код:
[Выделить все]
(vlax-for cell (vlax-get-property xls_sheet 'cells)
  (if (vlax-variant-value (vlax-get-property cell 'value))
    ;; Данные есть, их попробуем распечатать
    (princ
      (strcat "\nCol : "
	      (vl-princ-to-string (vlax-get-property cell 'column))
	      "; Row : "
	      (vl-princ-to-string (vlax-get-property cell 'row))
	      "; Value : "
	      (vl-princ-to-string
		(vlax-variant-value (vlax-get-property cell 'value))
		) ;_ end of vl-princ-to-string
	      ) ;_ end of strcat
      ) ;_ end of princ
    ;; Данных нет, меняем row и col
    (progn
      ;; Вот здесь будут ошибки - свойства ReadOnly
      (vlax-put-property cell 'column 1)
      (vlax-put-property cell 'row (1+ (vlax-get-property cell 'row)))
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of vlax-for
Количество строк и столбцов заранее не известно, гарантированно только, что если значения в столбце А нет, то строку не читать (в принципе и дальше проходить не надо). Я понимаю, что представленный вариант будет идти по всем строкам, соответственно скорость выполнения этого куска будет отвратительной, но как выйти из цикла я не представляю. Если еще и с этим подскажете, будет совсем здорово
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Просмотров: 14005
 
Непрочитано 25.09.2008, 16:57
#21
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Пока нашел такое тупое решение
Код:
[Выделить все]
(startapp "cmd /C taskkill /IM excel.exe /F /T")
работает...
Но хотелось бы как-то изящней.
Makswell вне форума  
 
Непрочитано 25.09.2008, 16:58
#22
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Если честно, я не стал связываться с процессом Excel'a. Использую другие пути.
Я так понял ADODB?
Makswell вне форума  
 
Непрочитано 25.09.2008, 23:43
#23
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 179


Цитата:
Сообщение от Makswell Посмотреть сообщение
Алексей, хочу тебя спросить: решена ли эта проблема, т.е. убивание процесса Excel именно посредством лиспа.
Всё таки больше 2-х лет прошло с момента написания того поста - может ты за это время что-то придумал?..
можно два раза
Vov.Ka вне форума  
 
Автор темы   Непрочитано 26.09.2008, 00:36
#24
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411


Цитата:
Сообщение от Makswell Посмотреть сообщение
Я так понял ADODB?
И это тоже. Excel (как мне сейчас кажется) не есть панацея.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.09.2008, 08:25
#25
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Цитата:
Сообщение от Vov.Ka Посмотреть сообщение
можно два раза
Это не помогает. И ко всему прочему с определённого момента начинает тормозить...
Makswell вне форума  
 
Непрочитано 26.09.2008, 12:04
#26
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 179


Цитата:
Сообщение от Makswell Посмотреть сообщение
Это не помогает. И ко всему прочему с определённого момента начинает тормозить...
убить все процессы Excell, перезапустить Acad
проверим
Код:
[Выделить все]
(vl-load-com)
(defun test (/ ExcelObj *error*)
  (setq ExcelObj (vlax-get-or-create-object "Excel.Application"))
  (vl-catch-all-apply
    'vlax-invoke-method
    (list ExcelObj "Quit")
  )
  (vlax-release-object ExcelObj)
;;;  (gc) ;;; не обязательно
)
убился процес? у меня убивается нормально даже без (gc)
Vov.Ka вне форума  
 
Непрочитано 26.09.2008, 13:33
#27
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Продолжим твой код. Ведь мало получить указатель на Excel. Главное - открыть в нём xls-файл и продолжить работу с ним.
Код:
[Выделить все]
(defun test (/ ExcelObj xlsFileObj)
  (setq ExcelObj (vlax-get-or-create-object "Excel.Application"))
  (vlax-put-property ExcelObj "Visible" :vlax-false)
  (setq	xlsFileObj
	 (vlax-invoke-method
	   (vlax-get-property ExcelObj "Workbooks")
	   "Open"
	   "D:\\test.xls"
	 )
  )
  (vlax-release-object xlsFileObj)
  (vl-catch-all-apply
    'vlax-invoke-method
    (list ExcelObj "Quit")
  )
  (vlax-release-object ExcelObj)
;;;  (gc) ;;; не обязательно
)
После этого кода процесс не убивается. Но если потом сделать (gc) - то всё проходит нормально.

Т.е. получаются выводы такие:
1. Если где либо пропущен vlax-release-object, то (gc) не поможет - процесс Excel останется висеть в памяти.
2. Если нигде не забыли сделать vlax-release-object, то после этого надо обязательно сделать (gc).

В итоге - во всём опять оказались виноваты мои кривые руки.
... да и Алексей получается оказался не прав в своем посте №13.

ЗЫ Хотя это был простой случай. Всего 2 vlax-release-object. А уменя в лиспе открывается n-е кол-во xls-файлов (точнее один закрывается, другой открывается), и для каждого файла формируются указатели на книгу, лист, ячейки там всякие и т.п. (даже BuiltinDocumentProperties у каждого файла читается). И всё это надо отследить и в нужных местах расставить vlax-release-object. Жесть...

ЗЗЫ И всё равно - иногда (gc) жутко тормозит.
Makswell вне форума  
 
Непрочитано 14.05.2009, 15:33
#28
vladmobile


 
Регистрация: 14.05.2009
Сообщений: 3


А зачем убивать процесс excel, если он при закрытии када убивается сам?
vladmobile вне форума  
 
Автор темы   Непрочитано 14.05.2009, 15:37
#29
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411


Запустив несколько раз подряд (например, 10 раз) лисп, в памяти будет болтаться 10 экземпляров excel.exe, отнимая ресурсы. Или память бездонная?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.05.2009, 16:15
#30
vladmobile


 
Регистрация: 14.05.2009
Сообщений: 3


А я перед тем как запускать Excel, проверяю не запущен ли он. Тогда у меня в памяти только один процесс.
vladmobile вне форума  
 
Автор темы   Непрочитано 14.05.2009, 23:27
#31
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411


Не всегда годится такой подход.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.10.2009, 00:49 Try this
#32
vladmobile


 
Регистрация: 14.05.2009
Сообщений: 3


(defun Exit_excel ()
(vlax-put-property (Excel-object) 'DisplayAlerts "False")
; Diasble notification
(vlax-invoke-method (Active-workbook) 'Close)
; Close active workbook
(vlax-invoke-method (Excel-object) 'Quit); Close Excel application
(vlax-release-object (Excel-object)); Release Excel object
)
vladmobile вне форума  
 
Непрочитано 01.10.2009, 08:54
#33
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Попробовал.
Всё равно этот процесс-сволочь висит.

В принципе я давно уже об этом не думаю. У меня процесс Excel'а только один висит в списке процессов (как ты и писал в посте №30). И меня это в общем-то не напрягает.

Последний раз редактировалось Makswell, 01.10.2009 в 08:59.
Makswell вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Обращение к Excel'y и смена адреса ячейки