明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 117|回复: 6

[提问] 求助:lisp读取excel单元格出问题

[复制链接]
发表于 8 小时前 | 显示全部楼层 |阅读模式
本帖最后由 gamexia 于 2024-11-20 21:40 编辑

利用excel数据,插入块,cad 返回这个错误: no function definition: MSXL-GET-RANGE
是啥问题,帮看看
excel路径:
"C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE"
  1. (defun c:mapan ()
  2.   (vl-load-com)
  3.   (setq exname "d:\\ABC.xls")
  4.   (setq *excel* (vlax-create-object "excel.application"))
  5.   (setq *xlapp* (vlax-invoke-method (vlax-get-property *excel* 'Workbooks) 'Open exname))
  6.   (vla-put-visible *excel* 1)  ;;显示工作表
  7.   (setq *sheet* (vlax-get-property (vlax-get-property *xlapp* 'Worksheets) 'item "DEF"))


  8. (setq pt (getpoint "\n选择需要插入块的基点:"))
  9.   (setq mm 2) ;mm从第二行开始

  10. (repeat 1080
  11. ;;;从EXCEL的C列mm行读取块名
  12.   (setq    km (Ljx-read-excel-data  "C" mm *sheet* ))
  13. ;;;从excel的B列mm行读取角度
  14.   (setq jiaodu (Ljx-read-excel-data "B" mm *sheet*))
  15.    (command "_insert" km pt 1 1 jiaodu );以pt为基点插入指定块,x比例1,y比例1,角度为指定jiaodu

  16.    (setq mm (1+ mm))
  17.   )
  18.   
  19.   (vlax-invoke-method (vlax-get-property *excel* "ActiveWorkbook") 'Close 0)
  20.   (vlax-invoke-method *excel* 'QUIT)
  21.   (vlax-release-object *sheet*)
  22.   (vlax-release-object *xlapp*)
  23. )
  24. ;;;;;读取数excel数据函数
  25. (defun Ljx-read-excel-data1 (vv hor sh) ;;;vv为列数直接输入字母、hor为 第几行,直接输入数字,sh为工作表对象sheet
  26.   (vlax-variant-value (vlax-get-property (vlax-get-property sh 'Range (strcat vv (itoa hor))) 'Value2))
  27. )

  28. ;;;;;读取数excel数据函数输出text格式
  29. (defun Ljx-read-excel-text1 (vv hor sh /  ru) ;;;vv为列数直接输入字母、hor为 第几行,直接输入数字,sh为工作表对象sheet
  30.   (vl-princ-to-string (vlax-variant-value (vlax-get-property (vlax-get-property sh 'Range (strcat vv (itoa hor))) 'Value2)))
  31. )
  32. (defun ljx-vlxls-get-range-value1 ( sheet rangeid / range value valuelist )
  33.   (setq range (vlax-get-property sheet 'Range rangeid))
  34.   (setq value (vlax-get-property range 'Value2))
  35.   (cond
  36.     ((= (vlax-variant-type value)  8204);;;为数组时,即为区域;
  37.         (progn
  38.           (setq value (vlax-safearray->list(vlax-variant-value value)))
  39.           (setq valuelist (mapcar (function (lambda (x) (mapcar 'vlax-variant-value x))) value))
  40.         )
  41.     )
  42.     ( T;;;;为单个单元格;
  43.       (setq valuelist (vlax-variant-value value))
  44.     )
  45.   );;;;cond
  46.   valuelist
  47. )


回复

使用道具 举报

发表于 3 小时前 | 显示全部楼层
本帖最后由 kozmosovia 于 2024-11-20 20:18 编辑

这是因为没有加载Excel的 typelib导致的,不过可以找到错误代码位置,用vlax-get改写一下,就不需要msxl开头的函数了。我印象中不久之前有个帖子里我说过。你可以搜一下
要定位你的Excel.exe
(setq tlb  "d:\\Program Files\\Microsoft Office\\Office12\\Excel.exe")
(vlax-import-type-library
  :tlb-filename      tlb  :methods-prefix
  "msxl-"      :properties-prefix "msxl-"
  :constants-prefix  "msxl-"
)
回复 支持 1 反对 0

使用道具 举报

发表于 6 小时前 | 显示全部楼层
翻译一下就知道是缺少这个函数了
回复 支持 反对

使用道具 举报

发表于 6 小时前 | 显示全部楼层
第十五行
(setp    km (Ljx-read-excel-data  "C" mm *sheet* ))
setq好像打成step了
回复 支持 反对

使用道具 举报

 楼主| 发表于 5 小时前 | 显示全部楼层
Scarlet2001 发表于 2024-11-20 17:31
第十五行
(setp    km (Ljx-read-excel-data  "C" mm *sheet* ))
setq好像打成step了

第十五行setq 我修改了,还是不行,报错: no function definition: MSXL-GET-RANGE
回复 支持 反对

使用道具 举报

 楼主| 发表于 1 小时前 | 显示全部楼层
定位Excel.exe后
又显示 错误: 参数类型错误: VLA-OBJECT nil
回复 支持 反对

使用道具 举报

 楼主| 发表于 1 小时前 | 显示全部楼层
我搜索了下,用活动的excel就可以了

  1. (defun c:mapan ()
  2.   (vl-load-com)
  3.   ;;简单示例lisp读取excel里的数据(没有判断容错功能)by snddd2000 2011-11-17
  4.   (setq excelapp0 (vlax-get-object "Excel.Application"))
  5.   ;;excel程序对象,没开excel下边的都是白搭
  6.   (setq activeworkbook0 (vlax-get-property excelapp0 'ActiveWorkbook))
  7.   ;;excel工作簿对象
  8.   (setq activesheet0 (vlax-get-property activeworkbook0 'ActiveSheet))
  9.   ;;excel工作表对象
  10.   (setq cells0 (vlax-get-property activesheet0 'cells))

  11.   ;;获取excel单元格对象的示例 (get-cell 3 2) ;;;3是指3横行,2是指B竖列
  12.   (setq mm 2) ;mm从第二行开始
  13.   (setq pt (getpoint "\n选择需要插入块的基点:"))
  14.   (setq mm 2) ;mm从第二行开始
  15.   
  16.   (repeat 1080
  17.     (setq km (get-cell mm 3))
  18.     (setq km (rtos km));转字符串   
  19.     (setq jiaodu (get-cell mm 2))
  20.    ; (setq jiaodu (rtos jiaodu))
  21.     (command "_insert" km pt 1 1 jiaodu );以pt为基点插入指定块,x比例1,y比例1,角度为指定jiaodu
  22.     (setq mm (1+ mm))   
  23.   )
  24.           
  25. )


  26. (defun get-cell (row col)
  27.     (setq a1 (vlax-get-property    cells0   'item row col))
  28.     ;;A1单元格对象
  29.     (setq  a1-value
  30.        (vlax-variant-value
  31.          (vlax-get-property (vlax-variant-value a1) 'value)
  32.          ;;或者'value
  33.        )
  34.     )
  35.     ;;单元格里面的值里的值
  36.     a1-value
  37.   )
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-20 23:38 , Processed in 0.176952 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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