明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 694|回复: 2

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

[复制链接]
发表于 2019-7-4 16:29 | 显示全部楼层 |阅读模式
初学lisp 还不是太懂  在论坛搜到一个excel操作函数的合集  遇到一点问题

首先是一个初始化的
  1. ;0·初始化
  2. ;|
  3. Examples:
  4. (vlxls-app-init)  ==>  33
  5. |;
  6. (defun vlxls-app-Init
  7.    (/ OSVar GGG Olb8 Olb9 Olb10 TLB Out msg msg1 msg2)
  8.    (if *Chinese*
  9.       (setq msg "\n 初始化微软Excel "
  10.             msg1 "\042初始化Excel错误\042"
  11.             msg2 (strcat
  12.                      "\042 警告"
  13.                      "\n ===="
  14.                      "\n 无法在您的计算机上检测到微软Excel软件"
  15.                      "\n 如果您确认已经安装Excel, 请发送电子邮"
  16.                      "\n 件到kozmosovia@hotmail.com获取更多的解决方案\042"
  17.                   )
  18.       )
  19.       (setq msg "\n Initializing Microsoft Excel "
  20.             msg1 "\042Initialization Error\042"
  21.             msg2 (strcat
  22.                      "\042 WARNING"
  23.                      "\n ======="
  24.                      "\n Can NOT detect Excel97/200X/XP in your computer"
  25.                      "\n If you already have Excel installed, please email"
  26.                      "\n us to get more solution via kozmosovia@hotmail.com\042"
  27.                   )
  28.       )
  29.    )
  30.    (if (null msxl-xl24HourClock)
  31.       (progn
  32.          (if (and (setq GGG
  33.                         (vl-registry-read
  34.                            "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Excel.EXE"
  35.                            "Path"
  36.                         )
  37.                   )
  38.                   (setq GGG (strcase (strcat GGG "Excel.EXE" )))
  39.             )
  40.             (progn
  41.                (foreach OSVar (list "SYSTEMROOT" "WINDIR"
  42.                                  "WINBOOTDIR" "SYSTEMDRIVE"
  43.                                  "USERNAME" "COMPUTERNAME"
  44.                                  "HOMEDRIVE" "HOMEPATH"
  45.                                  "PROGRAMFILES"
  46.                               )
  47.                   (if (vl-string-search (strcat "%" OSVar "%" ) GGG)
  48.                      (setq GGG (vl-string-subst (strcase (getenv OSVar)) (strcat "%" OSVar "%" ) GGG))
  49.                   )
  50.                )
  51.                (setq Olb8 (findfile (vl-string-subst "EXCEL8.OLB" "EXCEL.EXE" GGG))
  52.                      Olb9 (findfile (vl-string-subst "EXCEL9.OLB" "EXCEL.EXE" GGG))
  53.                      Olb10 (findfile (vl-string-subst "EXCEL10.OLB" "EXCEL.EXE" GGG))
  54.                )
  55.                (cond
  56.                   ((= (vl-filename-base (vl-filename-directory GGG)) "OFFICE16")
  57.                      (setq TLB GGG Out "2016")
  58.                   )
  59.                   ((= (vl-filename-base (vl-filename-directory GGG)) "OFFICE11")
  60.                      (setq TLB GGG Out "2003")
  61.                   )
  62.                   ((= (vl-filename-base (vl-filename-directory GGG)) "OFFICE10")
  63.                      (setq TLB GGG Out "XP")
  64.                   )
  65.                   (Olb9 (setq TLB Olb9 Out "2000"))
  66.                   (Olb8 (setq TLB Olb8 Out "97"))
  67.                   (T (setq Out "Version Unknown" ))
  68.                )
  69.                (if TLB
  70.                   (progn
  71.                      (princ (strcat MSG Out "..." ))
  72.                      (vlax-import-type-library
  73.                         :tlb-filename TLB :methods-prefix
  74.                         "msxl-" :properties-prefix
  75.                         "msxl-" :constants-prefix "msxl-"
  76.                      )
  77.                   )
  78.                )
  79.             )
  80.             (progn
  81.                (if vldcl-msgbox
  82.                   (vldcl-msgbox "x" msg1 msg2)
  83.                   (alert (read msg2))
  84.                )
  85.                (exit)
  86.             )
  87.          )
  88.       )
  89.    )
  90.    msxl-xl24HourClock
  91. )





我在我电脑上执行这个程序是返回nil的  在另一台电脑上可以  看程序示例应该要返回33  不是很清楚那个OSVar是什么变量  希望有大神解答下   
然后还有个 另一台电脑上执行后  然后打开xls  无法赋值
  1. ;0·从指定单元格开始赋值
  2. ;|
  3. Examples:
  4. (vlxls-cell-put-value *xlapp* "C12" "xx")  ==>  #<VLA-OBJECT Range 093a7764>
  5. (vlxls-cell-put-value *xlapp* "C12:F3" "xx")  ==>  #<VLA-OBJECT Range 43c5ac64>
  6. (vlxls-cell-put-value *xlapp* "C12:D13" ‘ (("zz" "xx") ("xx" "zz")))  ==>  #<VLA-OBJECT Range 1b8f2a64>
  7. |;
  8. (defun vlxls-cell-put-value
  9.    (xl id Data / vllist-explode idx xx yy ary Rtn)
  10.    (defun vllist-explode (lst)
  11.       (cond
  12.          ((not lst) nil)
  13.          ((atom lst) (list lst))
  14.          ((append (vllist-explode (car lst))
  15.                         (vllist-explode (cdr lst))
  16.                )
  17.          )
  18.       )
  19.    )
  20.    (if (null id) (setq id "A1" ))
  21.    (if (= (type id) 'list) (setq id (vlxls-rangeid id)))
  22.    (if (= (type (car Data)) 'LIST)
  23.       (setq   ARY    (vlax-make-safearray
  24.                      vlax-vbstring
  25.                      (cons 0 (1- (length Data)))
  26.                      (cons 1 (length (car Data)))
  27.                   )
  28.             XX (1- (length (car Data)))
  29.             YY (1- (length Data))
  30.       )
  31.       (setq   ARY    (vlax-make-safearray
  32.                      vlax-vbstring
  33.                      (cons 0 1)
  34.                      (cons 1 (length Data))
  35.                   )
  36.             XX (1- (length Data))
  37.             YY 0
  38.       )
  39.    )
  40.    (if (= xx yy 0)
  41.       (msxl-put-value2
  42.          (setq Rtn (msxl-get-range xl id))
  43.          (car (vllist-explode data))
  44.       )
  45.       (progn
  46.          (setq id (vlxls-cellid-calc id xx yy))
  47.          (msxl-put-value2
  48.             (setq Rtn (msxl-get-range xl id))
  49.             (vlax-safearray-fill ary data)
  50.          )
  51.       )
  52.    )
  53.    Rtn
  54. )
我直接按照程序示例 输入(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"是要输入什么类型的参数  希望大神能帮我解答
发表于 2019-7-5 09:30 | 显示全部楼层
1、低版本CAD可能需要加一句(vl-load-com)
2、你仔细看,OSVar其实是foreach的变量
3、需要的应该是GGG,GGG代表的应该是包含Excel.EXE可执行程序路径和版本的字符串
4、从 错误: 参数类型错误: consp "xx"  这个错误看,需要list类型的参数,比如:(vlxls-cell-put-value *xlapp* "C12" '("123"))
回复 支持 2 反对 0

使用道具 举报

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

谢谢大神  第一个程序的问题我找到了 好像是excel版本的问题 我用的是2019的版本 我把"OFFICE11" 改成"OFFICE19"可以正常用了  
第二个程序也感谢大神解答
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-19 13:18 , Processed in 0.197986 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表