| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как работать с Excel из LISP

Как работать с Excel из LISP

Ответ
Поиск в этой теме
Непрочитано 01.09.2006, 16:07 #1
Как работать с Excel из LISP
kolobrod
 
Москва
Регистрация: 01.09.2006
Сообщений: 12

Примеры Полещука и другие похожие видел... Но всетаки хочу спросить...

Подскажите пожалуйста как следующие строчки на VBA перевести на LISP?.. Не могу разобраться с vlax-invoke-method и vlax-get-property.

Код:
[Выделить все]
    Worksheets("Sheet1").Activate
    Range("A21").Select
    Range(Selection, Selection.End(xlDown)).Select
Просмотров: 18264
 
Непрочитано 01.09.2006, 16:23
#2
Кулик Алексей aka kpblc
Moderator

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


http://dwg.ru/forum/viewtopic.php?t=7640
http://dwg.ru/forum/viewtopic.php?t=9420
http://dwg.ru/forum/viewtopic.php?t=4927
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.09.2006, 14:58
#3
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Тут делать нужно примерно так:

Код:
[Выделить все]
(defun C:EXM ( / DESRNG EXCELAPP FILEPATH NEXTRNG SELRNG SHT SHTNUM WBK)
  
  (vl-load-com)
    (setq FilePath (getfiled	"Select Excel file to read :"
			(getvar "dwgprefix")
			"xls"
			16
	      )
  )
;;;  (setq FilePath (findfile "C:\\AUTOLISP\\TEST1.xls"));for debug only
  (setq ShtNum (getstring t "\nEnter sheet name OR sheet number <Лист1>: \n"))
  (if (eq ShtNum "")
      (setq ShtNum "Лист1"))
  (setq ExcelApp (vlax-get-or-create-object "Excel.Application"))
  (vla-put-visible ExcelApp :vlax-true)
  (setq Wbk (vl-catch-all-apply 'vla-open
		     (list (vlax-get-property ExcelApp "WorkBooks") FilePath)))
  (vlax-invoke-method Wbk 'Activate)
		 (setq Sht (vl-catch-all-apply 'vlax-get-property
			       (list (vlax-get-property Wbk "Sheets")
				     "Item" ShtNum)))
      (vlax-invoke-method Sht "Activate")
  (setq SelRng (vlax-get-property Sht 'Range "A21"))
  (vlax-invoke-method SelRng "Select")
  (setq NextRng (vlax-get-property ExcelApp "Selection"))
  
  (setq DesRng (vl-catch-all-apply 'vlax-get-property
			       (list NextRng
				     "End" -4121 ))) ; -4121 = xlDown
  
  (vlax-invoke-method DesRng "Select")
  ;;; <тут дальше делаешь чего тебе надо>
      (vl-catch-all-apply
	'vlax-invoke-method
	(list Wbk "Close" :vlax-true)
      )

	(vl-catch-all-apply
	  'vlax-invoke-method
	  (list ExcelApp "Quit")
	)

  (mapcar
    (function (lambda (x)
		(if (not (vlax-object-released-p x))
		
		  (vlax-release-object x)
		)
	      )
    )
    (list DesRng NextRng SelRng Sht Wbk ExcelApp); обязательно в обратном порядке
  )
  (setq	DesRng nil
	NextRng nil
	SelRng nil
	Sht nil
	Wbk nil
	ExcelApp nil
  )
  (gc)
  (gc)
  (gc)
  (prin1)
)
А свойства и методы просматривай с помощью:

Код:
[Выделить все]
(vlax-dump-object <объект> T)
Постоянные Экселя можно просмотреть в Браузере
в редакторе VBAIDE

Fatty

~'J'~
fixo вне форума  
 
Автор темы   Непрочитано 04.09.2006, 14:36
#4
kolobrod


 
Регистрация: 01.09.2006
Москва
Сообщений: 12


Спасибо! Оба ответа чень полезны. Буду разбираться...
kolobrod вне форума  
 
Непрочитано 28.08.2007, 09:35
#5
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Код:
[Выделить все]
;;; <тут дальше делаешь чего тебе надо>
Можно пример строки присвоения или считывания
Holon вне форума  
 
Непрочитано 28.08.2007, 10:24
#6
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Еще подборочка. Может кое-что повторяется.

1. http://www.theswamp.org/index.php?topic=18361.0
2. http://web2.airmail.net/terrycad/
3. http://www.jefferypsanders.com/autolisp.html
4. http://www.theswamp.org/index.php?topic=8127.0
5. Рекомендую! KozMos VLXLS Project. By using ActiveX, we can control Microsoft Excel from within Visual LISP. VLXLS is a fully open source project to demonstrate and execute the procedure of data IO (Input/Output) between Excel and AutoCAD.
6. http://forum.dwg.ru/showthread.php?p=244237#post244237
7. http://www.autocad.ru/cgi-bin/f1/board.cgi?t=15857AH
8. http://www.cadforyou.spb.ru/index.ph..._programs_page
9. http://www.cadforyou.spb.ru/index.ph...page%26sri%3D0

Для записи в Excel можно воспользоваться моей ф-цией xls. Брать отсюда http://www.autocad.ru/cgi-bin/f1/boa...31596eW&page=2 с поста VVA (2007-01-08 16:51:13) http://forum.dwg.ru/showpost.php?p=244237&postcount=7 Как пример смотри команды COOR и AREAS

*** Добавлено 2011-07-26 ***
Актуальные ссылки в этой теме

Последний раз редактировалось VVA, 20.09.2015 в 11:53. Причина: Новые адреса
VVA вне форума  
 
Непрочитано 08.09.2007, 15:21
#7
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Для полного сщастья нехватает функции возвращающей значение колонки и строки по значению

Код:
[Выделить все]
(defun value_xls ( ExcelFile$ SheetName$ FindValue$ / Column# Row#)
........................)
Holon вне форума  
 
Непрочитано 12.09.2007, 09:14
#8
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Цитата:
Сообщение от Holon
Для полного сщастья нехватает функции возвращающей значение колонки и строки по значению

Код:
[Выделить все]
(defun value_xls ( ExcelFile$ SheetName$ FindValue$ / Column# Row#)
........................)
С год назад я тут покрутил такой вариант,
измени значения по ситуации:

Код:
[Выделить все]
; by Fatty
(defun c:extest (/ adres filename hgt i iCol Row iRows sheetName
x xlApp xlBook xlCell xlRange xlSheet)
(vl-load-com)
(setq sheetName "OUTSIDE WALL"
hgt "93") ; test certain format in Excel
(setq fileName (strcat (getvar "dwgprefix") "shear sizes.xls"))
;;;--- Verify the path to the file
(setq fileName(findfile fileName)) 
(if (not (setq xlApp (vlax-get-object "Excel.Application")))
(setq xlApp (vlax-create-object "Excel.Application"))
)

(if xlApp
(progn
(vlax-put-property xlApp "Visible" :vlax-true)
(if
(not
(vl-catch-all-error-p
(vl-catch-all-apply
(function (lambda ()
(setq
xlBook (vlax-invoke-method
(vlax-get-property xlApp 'WorkBooks)
"Open"
fileName)
)
)
)
)
)
)
(progn
(vlax-invoke-method xlBook "Activate")
(setq xlSheet (vlax-get-property
(vlax-get-property xlBook "WorkSheets") "Item" sheetName))
(vlax-invoke-method xlSheet "Activate")
(setq xlRange (vlax-get-property xlSheet "Range" "B3:B999"))
(vlax-invoke-method xlRange "Select")
(setq iCol (vlax-get-property xlRange "Column"))
(setq iRows (vlax-get-property (vlax-get-property xlRange "Rows") "Count")
iRow (vlax-get-property xlRange "Row"))

(setq xlFRange (vlax-get-property xlsheet "Range" "B3"))
(if
(not
(vl-catch-all-error-p
(vl-catch-all-apply
(function (lambda () 
(setq xlCell (vlax-invoke-method xlRange "Find" (vlax-make-variant hgt)
xlFRange
-4163 1 1 1 nil nil)))))))
(progn
(vlax-invoke-method xlCell "Select") 

(setq acCell (vlax-get-property xlApp "ActiveCell"))
(setq iRow (vlax-get-property acCell "Row")
iCol (vlax-get-property acCell "Column"))
(alert (strcat "Given value " hgt " found at\n"
"column " (itoa iCol) ", row " (itoa iRow) )))
(alert (strcat "Nothing found" )))


(vlax-invoke-method xlBook "Close" :vlax-false)
(vlax-invoke-method xlApp "Quit")
)
)))
(mapcar (function (lambda (x)
(vl-catch-all-apply
(function (lambda ()
(progn
(vlax-release-object x)
(setq x nil)
)
)
)
)
)
)
(list acCell xlCell xlFrange xlRange xlSheet xlBook xlApp)
)

(gc)
(princ)
)
~'J'~
fixo вне форума  
 
Непрочитано 18.09.2007, 18:57
#9
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Функция c:extest отрабатывает нормально если в столбике имеется разыскиваемое значение, в случае если такого значения не сущетвует то функция вылетает на строке
Код:
[Выделить все]
(vlax-invoke-method xlCell "Select")
и ругается
Код:
[Выделить все]
Command: extest
; error: bad argument type: VLA-OBJECT nil
при этом файл Excel естественно остается открытым.
Holon вне форума  
 
Непрочитано 18.09.2007, 20:44
#10
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Я конечно могу предположить что можно
искать то, чего в помине нет, всяко бывает,
тогда используй эту конструкцию:

Код:
[Выделить все]
(if 
(not 
(vl-catch-all-error-p 
(vl-catch-all-apply 
(function (lambda () blah-blah-blah...
(progn
blah-blah-blah...
Самому переделать времени нет

~'J'~
fixo вне форума  
 
Непрочитано 18.09.2007, 20:50
#11
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Цитата:
Сообщение от Fatty
Я конечно могу предположить что можно
искать то, чего в помине нет
А разве ты непредпологал такого варианта заранее зачем тогда
Код:
[Выделить все]
(alert (strcat "Nothing found"))
Holon вне форума  
 
Непрочитано 18.09.2007, 22:00
#12
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Маштинально, по-привычке

~'J'~
fixo вне форума  
 
Непрочитано 19.09.2007, 00:30
#13
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Я всего три месяца как разбираюсь с LISP пoэтому мне ход мысли с vlx- функциями
несовсем понятен,
на днях заказал книгу Полищука, вот как дождусь, тогда исправлю код,
а то в сети про эти функции материала практически нет.
Holon вне форума  
 
Непрочитано 19.09.2007, 01:13
#14
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Завтра будет время - исправлю

~'J'~
fixo вне форума  
 
Непрочитано 19.09.2007, 09:11
#15
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Зарание большее спасибо
Holon вне форума  
 
Непрочитано 19.09.2007, 12:54
#16
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Попробуй этот вариант, не смог только решить
для случая повторяющихся одинаковых значений
Это должно работать в случае уникального значения
в искомом диапазоне
Тестировал в A2007eng/MS Office 2003eng/Win XP HE

Код:
[Выделить все]
(defun C:FINDEX	(/	  acCell   adres    filename hgt      i
		 iCol	  Row	   iRows    sheetName	      x
		 xlApp	  xlBook   xlCell   xlRange  xlSheet
		)
  (vl-load-com)
  (defun *error* (msg)
    (if
      (and msg
	   (not
	     (member
	       msg
	       '("console break"
		 "Function cancelled"
		 "quit / exit abort"
		 ""
		)
	     )
	   )
      )
       (princ (strcat "\nError: " msg))
    )

    (vl-catch-all-apply
      (function	(lambda	()
		  (vlax-invoke-method xlBook "Close" :vlax-false)
		)
      )
    )
    (vl-catch-all-apply
      (function	(lambda	()
		  (vlax-invoke-method xlApp "Quit")
		)
      )
    )
    (mapcar (function (lambda (x)
			(vl-catch-all-apply
			  (function (lambda ()
				      (progn
					(vlax-release-object x)
					(setq x nil)
				      )
				    )
			  )
			)
		      )
	    )
	    (list acCell xlCell xlFrange xlRange xlSheet xlBook xlApp)
    )
    (princ)
  ) ;_eof *error*

  ;;============================= main part =======================;; 
  (setq	sheetName "OUTSIDE WALL"
	hgt	  "903"
  )						  ; test certain format in Excel
  (setq fileName (strcat (getvar "dwgprefix") "shear sizes.xls"))
;;;--- Verify the path to the file
  (setq fileName (findfile fileName))
  (if (not (setq xlApp (vlax-get-object "Excel.Application")))
    (setq xlApp (vlax-create-object "Excel.Application"))
  )

  (if xlApp
    (progn
      (vlax-put-property xlApp "Visible" :vlax-true)
      (if
	(not
	  (vl-catch-all-error-p
	    (vl-catch-all-apply
	      (function	(lambda	()
			  (setq
			    xlBook (vlax-invoke-method
				     (vlax-get-property xlApp 'WorkBooks)
				     "Open"
				     fileName
				   )
			  )
			)
	      )
	    )
	  )
	)
	 (progn
	   (vlax-invoke-method xlBook "Activate")
	   (setq xlSheet (vlax-get-property
			   (vlax-get-property xlBook "WorkSheets")
			   "Item"
			   sheetName
			 )
	   )
	   (vlax-invoke-method xlSheet "Activate")
	   (setq xlRange (vlax-get-property xlSheet "Range" "B3:B999"))
	   (vlax-invoke-method xlRange "Select")
	   (setq iCol (vlax-get-property xlRange "Column"))
	   (setq iRows (vlax-get-property
			 (vlax-get-property xlRange "Rows")
			 "Count"
		       )
		 iRow  (vlax-get-property xlRange "Row")
	   )

	   (setq xlFRange (vlax-get-property xlsheet "Range" "B3"))
	   (if
	     (and
	       (not
		 (vl-catch-all-error-p
		   (vl-catch-all-apply
		     (function (lambda ()
				 (setq xlCell (vlax-invoke-method
						xlRange
						"Find"
						(vlax-make-variant hgt)
						xlFRange
						-4163
						1
						1
						1
						nil
						nil
					      )
				 )
			       )
		     )
		   )
		 )
	       )
	       xlCell
	     )
	      (progn
		(vlax-invoke-method xlCell "Select")

		(setq acCell (vlax-get-property xlApp "ActiveCell"))
		(setq iRow (vlax-get-property acCell "Row")
		      iCol (vlax-get-property acCell "Column")
		)
		(alert (strcat "Given value "
			       hgt
			       " found at\n"
			       "column "
			       (itoa iCol)
			       ", row "
			       (itoa iRow)
		       )
		)
	      )
	      (alert (strcat "Nothing found"))
	   )
	 )
      )
    )
    (alert (strcat "Problem with Excel running"))
  )
  (*error* nil)
  (gc)
  (princ)
)
(princ "\n\t\t  * Type FINDEX to execute... *")
(princ)
~'J'~
fixo вне форума  
 
Непрочитано 19.09.2007, 17:18
#17
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Цитата:
Сообщение от Fatty
не смог только решить
для случая повторяющихся одинаковых значений
я думаю, что для поиска одинаковых значений нужно будет добавить еще одну функцию,
а в этой функции перенести переменные hgt sheetName sheetName iCol iRow в аргументы,
новая функция будет запускать FINDEX и после получения результата, добавлять
к возвращенному значению колонки единицу и запускать функцию FINDEX с новыми
параметрами границ колонки.
Holon вне форума  
 
Непрочитано 24.03.2017, 16:21 создание и запись эксель в фоне
#18
tujn08


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


Привет.
Можно код с комментариями?
Не смог разобраться, что для чего.
Моя задача:
а) сущ экселька (шаблон) - остается вбить данные
б) нет эксельки - создать и в фоне(без открытия эксельки) записать данные в нужный лист и ячейку.

Литературу работы с экселькой я не нашел. На примерах практически не разобраться т.к. задачи разные.
tujn08 вне форума  
 
Непрочитано 13.10.2022, 14:24
#19
pad


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


Добрый день.
Ни как не получается достучаться до свойства Application.EnableEvents (Excel).
Пишу:
Код:
[Выделить все]
(vlax-put-property xlApp 'EnableEvents "False")
;или
(vlax-put-property xlApp 'EnableEvents :vlax-False")
что не так, есть мысли?
pad вне форума  
 
Непрочитано 13.10.2022, 14:46
#20
Кулик Алексей aka kpblc
Moderator

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


А по дампу объекта оно вообще видно?

----- добавлено через 49 сек. -----
И что вернет (vlax-get-property xlaapp 'enablevents) ?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как работать с Excel из LISP

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск