yxh1202 发表于 2015-6-26 08:44:02

内插查询excel工作表中数据用于计算,求修改

[ 本帖最后由 yxh1202 于 2015-6-29 08:14 编辑 ]\n\n工作中需要在制图中查询很多高程数据,本人参考前辈的有关资料编写了一个小代码,但运行出现数据类型错误问题,请高人指点:

(defun c:ttt ()
(setq lc (getreal "\n请输入里程(纯数字):"))
(setq        kgc(ty lc 6)                        ;查询excel参数求堤顶高程,8为列数可调
        hSgc (ty lc 5)                        ;查询excel参数求洪水高程
        ptgc (ty lc 4)                        ;查询excel参数求平台高程
        dgc(ty lc 3)                        ;查询excel参数求基础底高程
        h1   (- kgc hsgc 0.5)                ;超高线以上高度
        h2   (- hsgc ptgs -0.5)                ;超高线至平台高
        h3   (- ptgc dgc)
)
)

;;;=======读取excel文件数据,获得对应桩号的断面高程参数=====
(defun ty
          (lc col@ / excelapp0 activeworkbook0 activesheet0 cells0)
(vl-load-com)
;;;简单示例lisp读取excel里的数据(没有判断容错功能)by snddd2000 2011-11-17
;;;先打开excel文件,然后选定要查询的工作表(激活)
(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单元格对象
(setq        aLastcell (vlax-get-property
                  cells0
                  'item
                  (vlax-get-property
                      (vlax-get-property
                        (vlax-get-property cells0 'cells)
                        'rows
                      )
                      'count
                  )
                  1
                  )
)
(setq        endxluprow0 ;_A列有数据的最后一行的行号
       (vlax-get-property
           (vlax-get-property
             (vlax-variant-value aLastcell)
             'end
             -4162
           )
           'row
       )
)
(setq k 3)
;;;lc (getreal "\n请输入查询的桩号")
(repeat endxluprow0
    (setq vv
           (vlxls-get-cellvalue cells0 k 2)
    )
    (if        (> lc vv)
      (setq k (1+ k))
      (setq q k)
    )
)
(setq dd (vlxls-cell-leicha lc q col@))
(princ dd)
(mapcar 'vlax-release-object
          (list cells0 activesheet0 activeworkbook0 excelapp0)
)
(gc)                                        ;强制收集无用数据,释放不再使用的节点
(princ)
)

;;网上找的,返回一个单元格range地址
(defun vlxls-get-cell (obj row col / item cells)
(setq        item (vlax-get-property
             (setq cells (vlax-get-property obj "Cells"))
             "Item"
             (vlax-make-variant row)
             (vlax-make-variant col)
             )
)
(vlax-release-object cells)
(vlax-variant-value item)
)
;;=====返回单元格的值------
(defun vlxls-get-cellvalue (obj row col / item cells cellvalue)
(setq        item (vlax-get-property
             (setq cells (vlax-get-property obj "Cells"))
             "Item"
             (vlax-make-variant row)
             (vlax-make-variant col)
             )
)
(vlax-release-object cells)
(vlax-variant-value item)
(setq        cellvalue
       (vlax-variant-value
           (vlax-get-property
             (vlxls-get-cell obj row col)
             'value
             ;;或者'value
           )
       )
       ;;单元格里面的值

)
)

;;===内插求值函数=======
(defun vlxls-cell-leicha (lc row@ col@ / a1 a2 lc2)
(if (= lc (vlxls-get-cellvalue cells0 row@ 2))
    (setq a (vlxls-get-cellvalue cells0 row@ col@))
    (setq a1(vlxls-get-cellvalue cells0 row@ col@)
          a2(vlxls-get-cellvalue cells0 (- row@ 1) col@)
          lc1 (vlxls-get-cellvalue cells0 row@ 2)
          lc2 (vlxls-get-cellvalue cells0 (- row@ 1) 2)
          a   (+ (* (/ (- a1 a2) (- lc1 lc2)) (- lc lc2)) a2)
    )
)
)

yxh1202 发表于 2015-6-26 08:45:48

以下是文件。

yxh1202 发表于 2015-6-26 09:38:57

这是电子表格数据

迷失1786 发表于 2017-8-28 09:57:27

CAD插件管理程序

20060510412 发表于 2022-6-12 22:35:29

为什么不用excel自身的公式,反而要借助于lisp呢

yxh1202 发表于 2022-6-29 10:47:08

20060510412 发表于 2022-6-12 22:35
为什么不用excel自身的公式,反而要借助于lisp呢

想在CAD里面调用任意桩号的参数来绘图,所以要内插计算,请多指点
页: [1]
查看完整版本: 内插查询excel工作表中数据用于计算,求修改