gamexia 发表于 2024-11-20 14:57:13

求助: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: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-"
)

烟盒迷唇 发表于 2024-11-20 17:16:51

翻译一下就知道是缺少这个函数了

Scarlet2001 发表于 2024-11-20 17:31:00

第十五行
(setp    km (Ljx-read-excel-data"C" mm *sheet* ))
setq好像打成step了

gamexia 发表于 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

gamexia 发表于 2024-11-20 22:08:46

定位Excel.exe后
又显示 错误: 参数类型错误: VLA-OBJECT nil

gamexia 发表于 2024-11-20 22:11:48

我搜索了下,用活动的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
)

笔墨纸砚 发表于 2024-11-22 09:46:41

我也遇到了这个问题 于是改用了c#

llsheng_73 发表于 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对象

.....
其它的如果不知道怎么写,可以录制宏来翻译,查看宏的时候主要关心对象及其属性或方法
页: [1]
查看完整版本: 求助:lisp读取excel单元格出问题