Eltrion 发表于 2019-7-4 16:29:32

关于在论坛里搜到的excel相关函数的问题

初学lisp 还不是太懂在论坛搜到一个excel操作函数的合集遇到一点问题

首先是一个初始化的
;0·初始化
;|
Examples:
(vlxls-app-init)==>33
|;
(defun vlxls-app-Init
   (/ OSVar GGG Olb8 Olb9 Olb10 TLB Out msg msg1 msg2)
   (if *Chinese*
      (setq msg "\n 初始化微软Excel "
            msg1 "\042初始化Excel错误\042"
            msg2 (strcat
                     "\042 警告"
                     "\n ===="
                     "\n 无法在您的计算机上检测到微软Excel软件"
                     "\n 如果您确认已经安装Excel, 请发送电子邮"
                     "\n 件到kozmosovia@hotmail.com获取更多的解决方案\042"
                  )
      )
      (setq msg "\n Initializing Microsoft Excel "
            msg1 "\042Initialization Error\042"
            msg2 (strcat
                     "\042 WARNING"
                     "\n ======="
                     "\n Can NOT detect Excel97/200X/XP in your computer"
                     "\n If you already have Excel installed, please email"
                     "\n us to get more solution via kozmosovia@hotmail.com\042"
                  )
      )
   )
   (if (null msxl-xl24HourClock)
      (progn
         (if (and (setq GGG
                        (vl-registry-read
                           "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Excel.EXE"
                           "Path"
                        )
                  )
                  (setq GGG (strcase (strcat GGG "Excel.EXE" )))
            )
            (progn
               (foreach OSVar (list "SYSTEMROOT" "WINDIR"
                                 "WINBOOTDIR" "SYSTEMDRIVE"
                                 "USERNAME" "COMPUTERNAME"
                                 "HOMEDRIVE" "HOMEPATH"
                                 "PROGRAMFILES"
                              )
                  (if (vl-string-search (strcat "%" OSVar "%" ) GGG)
                     (setq GGG (vl-string-subst (strcase (getenv OSVar)) (strcat "%" OSVar "%" ) GGG))
                  )
               )
               (setq Olb8 (findfile (vl-string-subst "EXCEL8.OLB" "EXCEL.EXE" GGG))
                     Olb9 (findfile (vl-string-subst "EXCEL9.OLB" "EXCEL.EXE" GGG))
                     Olb10 (findfile (vl-string-subst "EXCEL10.OLB" "EXCEL.EXE" GGG))
               )
               (cond
                  ((= (vl-filename-base (vl-filename-directory GGG)) "OFFICE16")
                     (setq TLB GGG Out "2016")
                  )
                  ((= (vl-filename-base (vl-filename-directory GGG)) "OFFICE11")
                     (setq TLB GGG Out "2003")
                  )
                  ((= (vl-filename-base (vl-filename-directory GGG)) "OFFICE10")
                     (setq TLB GGG Out "XP")
                  )
                  (Olb9 (setq TLB Olb9 Out "2000"))
                  (Olb8 (setq TLB Olb8 Out "97"))
                  (T (setq Out "Version Unknown" ))
               )
               (if TLB
                  (progn
                     (princ (strcat MSG Out "..." ))
                     (vlax-import-type-library
                        :tlb-filename TLB :methods-prefix
                        "msxl-" :properties-prefix
                        "msxl-" :constants-prefix "msxl-"
                     )
                  )
               )
            )
            (progn
               (if vldcl-msgbox
                  (vldcl-msgbox "x" msg1 msg2)
                  (alert (read msg2))
               )
               (exit)
            )
         )
      )
   )
   msxl-xl24HourClock
)





我在我电脑上执行这个程序是返回nil的在另一台电脑上可以看程序示例应该要返回33不是很清楚那个OSVar是什么变量希望有大神解答下   
然后还有个 另一台电脑上执行后然后打开xls无法赋值
;0·从指定单元格开始赋值
;|
Examples:
(vlxls-cell-put-value *xlapp* "C12" "xx")==>#<VLA-OBJECT Range 093a7764>
(vlxls-cell-put-value *xlapp* "C12:F3" "xx")==>#<VLA-OBJECT Range 43c5ac64>
(vlxls-cell-put-value *xlapp* "C12:D13" ‘ (("zz" "xx") ("xx" "zz")))==>#<VLA-OBJECT Range 1b8f2a64>
|;
(defun vlxls-cell-put-value
   (xl id Data / vllist-explode idx xx yy ary Rtn)
   (defun vllist-explode (lst)
      (cond
         ((not lst) nil)
         ((atom lst) (list lst))
         ((append (vllist-explode (car lst))
                        (vllist-explode (cdr lst))
               )
         )
      )
   )
   (if (null id) (setq id "A1" ))
   (if (= (type id) 'list) (setq id (vlxls-rangeid id)))
   (if (= (type (car Data)) 'LIST)
      (setq   ARY    (vlax-make-safearray
                     vlax-vbstring
                     (cons 0 (1- (length Data)))
                     (cons 1 (length (car Data)))
                  )
            XX (1- (length (car Data)))
            YY (1- (length Data))
      )
      (setq   ARY    (vlax-make-safearray
                     vlax-vbstring
                     (cons 0 1)
                     (cons 1 (length Data))
                  )
            XX (1- (length Data))
            YY 0
      )
   )
   (if (= xx yy 0)
      (msxl-put-value2
         (setq Rtn (msxl-get-range xl id))
         (car (vllist-explode data))
      )
      (progn
         (setq id (vlxls-cellid-calc id xx yy))
         (msxl-put-value2
            (setq Rtn (msxl-get-range xl id))
            (vlax-safearray-fill ary data)
         )
      )
   )
   Rtn
)我直接按照程序示例 输入(vlxls-cell-put-value *xlapp* "C12" "xx")提示返回 错误: 参数类型错误: consp "xx"
如果删除XX的双引号 改成 (vlxls-cell-put-value *xlapp* "C12" xx)提示返回 错误: SAFEARRAYBOUND 中的上界小于下界。
如果把XX改成数字 改成 (vlxls-cell-put-value *xlapp* "C12" 1)   提示返回 错误: 参数类型错误: consp 1
那么这个"XX"是要输入什么类型的参数希望大神能帮我解答:loveliness:

satan421 发表于 2019-7-5 09:30:59

1、低版本CAD可能需要加一句(vl-load-com)
2、你仔细看,OSVar其实是foreach的变量
3、需要的应该是GGG,GGG代表的应该是包含Excel.EXE可执行程序路径和版本的字符串
4、从 错误: 参数类型错误: consp "xx"这个错误看,需要list类型的参数,比如:(vlxls-cell-put-value *xlapp* "C12" '("123"))

Eltrion 发表于 2019-7-5 11:12:25

satan421 发表于 2019-7-5 09:30
1、低版本CAD可能需要加一句(vl-load-com)
2、你仔细看,OSVar其实是foreach的变量
3、需要的应该是GGG, ...

谢谢大神第一个程序的问题我找到了 好像是excel版本的问题 我用的是2019的版本 我把"OFFICE11" 改成"OFFICE19"可以正常用了
第二个程序也感谢大神解答 :lol
页: [1]
查看完整版本: 关于在论坛里搜到的excel相关函数的问题