求助:lisp读取excel单元格出问题
本帖最后由 gamexia 于 2024-11-21 16:11 编辑利用excel数据,插入块,cad 返回这个错误: no function definition: MSXL-GET-RANGE
是啥问题,帮看看
excel路径:
"C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE"
(defun c:mapan ()
(vl-load-com)
(setq exname "d:\\ABC.xls")
(setq *excel* (vlax-create-object "excel.application"))
(setq *xlapp* (vlax-invoke-method (vlax-get-property *excel* 'Workbooks) 'Open exname))
(vla-put-visible *excel* 1);;显示工作表
(setq *sheet* (vlax-get-property (vlax-get-property *xlapp* 'Worksheets) 'item "DEF"))
(setq pt (getpoint "\n选择需要插入块的基点:"))
(setq mm 2) ;mm从第二行开始
(repeat 1080
;;;从EXCEL的C列mm行读取块名
(setq km (Ljx-read-excel-data1"C" mm *sheet* ))
;;;从excel的B列mm行读取角度
(setq jiaodu (Ljx-read-excel-data1 "B" mm *sheet*))
(command "_insert" km pt 1 1 jiaodu );以pt为基点插入指定块,x比例1,y比例1,角度为指定jiaodu
(setq mm (1+ mm))
)
(vlax-invoke-method (vlax-get-property *excel* "ActiveWorkbook") 'Close 0)
(vlax-invoke-method *excel* 'QUIT)
(vlax-release-object *sheet*)
(vlax-release-object *xlapp*)
)
;;;;;读取数excel数据函数
(defun Ljx-read-excel-data1 (vv hor sh) ;;;vv为列数直接输入字母、hor为 第几行,直接输入数字,sh为工作表对象sheet
(vlax-variant-value (vlax-get-property (vlax-get-property sh 'Range (strcat vv (itoa hor))) 'Value2))
)
;;;;;读取数excel数据函数输出text格式
(defun Ljx-read-excel-text1 (vv hor sh /ru) ;;;vv为列数直接输入字母、hor为 第几行,直接输入数字,sh为工作表对象sheet
(vl-princ-to-string (vlax-variant-value (vlax-get-property (vlax-get-property sh 'Range (strcat vv (itoa hor))) 'Value2)))
)
(defun ljx-vlxls-get-range-value1 ( sheet rangeid / range value valuelist )
(setq range (vlax-get-property sheet 'Range rangeid))
(setq value (vlax-get-property range 'Value2))
(cond
((= (vlax-variant-type value)8204);;;为数组时,即为区域;
(progn
(setq value (vlax-safearray->list(vlax-variant-value value)))
(setq valuelist (mapcar (function (lambda (x) (mapcar 'vlax-variant-value x))) value))
)
)
( T;;;;为单个单元格;
(setq valuelist (vlax-variant-value value))
)
);;;;cond
valuelist
)
本帖最后由 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-"
)
翻译一下就知道是缺少这个函数了 第十五行
(setp km (Ljx-read-excel-data"C" mm *sheet* ))
setq好像打成step了 Scarlet2001 发表于 2024-11-20 17:31
第十五行
(setp km (Ljx-read-excel-data"C" mm *sheet* ))
setq好像打成step了
第十五行setq 我修改了,还是不行,报错: no function definition: MSXL-GET-RANGE 定位Excel.exe后
又显示 错误: 参数类型错误: VLA-OBJECT nil 我搜索了下,用活动的excel就可以了
(defun c:mapan ()
(vl-load-com)
;;简单示例lisp读取excel里的数据(没有判断容错功能)by snddd2000 2011-11-17
(setq excelapp0 (vlax-get-object "Excel.Application"))
;;excel程序对象,没开excel下边的都是白搭
(setq activeworkbook0 (vlax-get-property excelapp0 'ActiveWorkbook))
;;excel工作簿对象
(setq activesheet0 (vlax-get-property activeworkbook0 'ActiveSheet))
;;excel工作表对象
(setq cells0 (vlax-get-property activesheet0 'cells))
;;获取excel单元格对象的示例 (get-cell 3 2) ;;;3是指3横行,2是指B竖列
(setq mm 2) ;mm从第二行开始
(setq pt (getpoint "\n选择需要插入块的基点:"))
(setq mm 2) ;mm从第二行开始
(repeat 1080
(setq km (get-cell mm 3))
(setq km (rtos km));转字符串
(setq jiaodu (get-cell mm 2))
; (setq jiaodu (rtos jiaodu))
(command "_insert" km pt 1 1 jiaodu );以pt为基点插入指定块,x比例1,y比例1,角度为指定jiaodu
(setq mm (1+ mm))
)
)
(defun get-cell (row col)
(setq a1 (vlax-get-property cells0 'item row col))
;;A1单元格对象
(setqa1-value
(vlax-variant-value
(vlax-get-property (vlax-variant-value a1) 'value)
;;或者'value
)
)
;;单元格里面的值里的值
a1-value
) 我也遇到了这个问题 于是改用了c# 本帖最后由 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对象
.....
其它的如果不知道怎么写,可以录制宏来翻译,查看宏的时候主要关心对象及其属性或方法
页:
[1]