明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 803|回复: 8

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

[复制链接]
发表于 2024-11-20 14:57:13 | 显示全部楼层 |阅读模式
本帖最后由 gamexia 于 2024-11-21 16:11 编辑

利用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-data1  "C" mm *sheet* ))
  13. ;;;从excel的B列mm行读取角度
  14.   (setq jiaodu (Ljx-read-excel-data1 "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. )


回复

使用道具 举报

发表于 2024-11-20 20:14:57 | 显示全部楼层
本帖最后由 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

使用道具 举报

发表于 2024-11-20 17:16:51 | 显示全部楼层
翻译一下就知道是缺少这个函数了
回复 支持 反对

使用道具 举报

发表于 2024-11-20 17:31:00 | 显示全部楼层
第十五行
(setp    km (Ljx-read-excel-data  "C" mm *sheet* ))
setq好像打成step了
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

 楼主| 发表于 2024-11-20 22:08:46 | 显示全部楼层
定位Excel.exe后
又显示 错误: 参数类型错误: VLA-OBJECT nil
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-20 22:11:48 | 显示全部楼层
我搜索了下,用活动的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.   )
回复 支持 反对

使用道具 举报

发表于 2024-11-22 09:46:41 | 显示全部楼层
我也遇到了这个问题 于是改用了c#
回复 支持 反对

使用道具 举报

发表于 2024-11-22 10:04:43 | 显示全部楼层
本帖最后由 llsheng_73 于 2024-11-22 10:12 编辑

一是象二楼那样通过lax-import-type-library连接EXCEL库,二是通过vlax-get-property vlax-put-property vlax-invoke-method这三大神器来处理,彻底避坑

(setq xls(vlax-get-or-create-object"excel.application"));获取EXCEL对象
#<VLA-OBJECT _Application 0c13458c>
_$ (setq books(vlax-get-property xls'workbooks));;EXCEL表
#<VLA-OBJECT Workbooks 0c0405bc>
_$ (setq book(vlax-invoke-method books 'add));新建空表
#<VLA-OBJECT _Workbook 0c040184>
_$ (setq sheet(vlax-get-property book 'activesheet));;;当面页;;;
#<VLA-OBJECT _Worksheet 08f70b74>
_$ (vlax-put-property(vlax-get-property sheet'range"A1")'value2 123.45);;给"A1"设置数值
nil
_$ (vlax-put-property xls 'visible 1);;;显示excel对象

.....
其它的如果不知道怎么写,可以录制宏来翻译,查看宏的时候主要关心对象及其属性或方法
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-19 07:05 , Processed in 0.152074 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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