关于在论坛里搜到的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:
1、低版本CAD可能需要加一句(vl-load-com)
2、你仔细看,OSVar其实是foreach的变量
3、需要的应该是GGG,GGG代表的应该是包含Excel.EXE可执行程序路径和版本的字符串
4、从 错误: 参数类型错误: consp "xx"这个错误看,需要list类型的参数,比如:(vlxls-cell-put-value *xlapp* "C12" '("123")) satan421 发表于 2019-7-5 09:30
1、低版本CAD可能需要加一句(vl-load-com)
2、你仔细看,OSVar其实是foreach的变量
3、需要的应该是GGG, ...
谢谢大神第一个程序的问题我找到了 好像是excel版本的问题 我用的是2019的版本 我把"OFFICE11" 改成"OFFICE19"可以正常用了
第二个程序也感谢大神解答 :lol
页:
[1]