明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4269|回复: 14

[提问] 难以逾越,变量取得excel单元格数据,请教高手

[复制链接]
发表于 2013-12-10 22:42 | 显示全部楼层 |阅读模式
本帖最后由 yxh1202 于 2013-12-26 08:15 编辑

从网上看到snnnod大侠的帖子,解决了读取指定单元格的数据(比较实用,没有类库连接、ADO这些高深的要求),但是有一个遗憾就是,单元格不能是(row col)这样的变量。经过修改代码如下,后面的是原来的,都可以用。但是有以下问题,请高手指点迷津
1、如何判断excel未打开,如果未打开,通过lisp打开excel文件
2、如何判断当前表格中最后一行或最后一列的数据

(defun c:ty ()
  (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 4 6)

  (defun get-cell (row col)
    (setq a1 (vlax-get-property    cells0   'item row col))
    ;;A1单元格对象
    (setq  a1-value
       (vlax-variant-value
         (vlax-get-property (vlax-variant-value a1) 'value)
         ;;或者'value
       )
    )
    ;;单元格里面的值里的值
    a1-value
  )

原来的代码,如下:
(defun c:ty ()
  (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单元格对象
  (setq a1 (vlax-get-property      cells0     'item   4 6 ))
    ;;A1单元格对象
    (setqa1-value
       (vlax-variant-value
         (vlax-get-property (vlax-variant-value a1) 'value)
         ;;或者'value
       )
    )
    ;;单元格里面的值里的值
    a1-value
  )
)


昨天晚上从一个国外的网站上看到这个,有所提示,但还是解决不了问题,求帮助:
;; Example demonstrating how to read the plain text content of all cells within
;; the UsedRange of the active worksheet of a supplied Excel file.
;; - Lee Mac  -  2013-10-29

(defun readexcel ( xls / rtn xlapp xlcls xlcol xlrng xlrow xlsht xlwbk xlwbs )
    (if
        (and
            (setq xls   (findfile xls))
            (setq xlapp (vlax-get-or-create-object "excel.application"))
        )
        (progn
            (setq rtn
                (vl-catch-all-apply
                   '(lambda ( / col lst row )
                        (setq xlwbs (vlax-get-property  xlapp 'workbooks)
                              xlwbk (vlax-invoke-method xlwbs 'open xls)
                              xlsht (vlax-get-property  xlapp 'activesheet)
                              xlrng (vlax-get-property  xlsht 'usedrange)
                              xlcls (vlax-get-property  xlrng 'cells)
                              xlrow (vlax-get-property  xlrng 'rows)
                              xlcol (vlax-get-property  xlrng 'columns)
                        )
                        (repeat (setq row (vlax-get-property xlrow 'count))
                            (repeat (setq col (vlax-get-property xlcol 'count))
                                (setq lst
                                    (cons
                                        (vlax-variant-value
                                            (vlax-get-property
                                                (vlax-variant-value
                                                    (vlax-get-property xlcls 'item row col)
                                                )
                                                'value
                                            )
                                        )
                                        lst
                                    )
                                )
                                (setq col (1- col))
                            )
                            (setq row (1- row))
                        )
                        lst
                    )
                )
            )
            (if (= 'vla-object (type xlwbk))
                (vl-catch-all-apply 'vlax-invoke-method (list xlwbk 'close :vlax-false))
            )
            (vl-catch-all-apply 'vlax-invoke-method (list xlapp 'quit))
            (foreach obj (list xlcol xlrow xlcls xlrng xlsht xlwbk xlwbs xlapp)
                (if (= 'vla-object (type obj))
                    (vlax-release-object obj)
                )
            )
            (gc)
            (if (vl-catch-all-error-p rtn)
                (prompt (strcat "\nError: " (vl-catch-all-error-message rtn)))
                rtn
            )
        )
        (prompt "\nUnable to interface with Excel Application.")
    )
)
(vl-load-com) (princ)

本帖被以下淘专辑推荐:

  • · excel|主题: 80, 订阅: 2
发表于 2022-7-26 07:26 | 显示全部楼层
  1. ;; (excel-getcell 1 2)
  2. (defun excel-getcell (row col)
  3.   (setq        excel (cond ((vlax-get-or-create-object "ket.application"))
  4.                     ((vlax-get-or-create-object "execl.application"))
  5.               )
  6.         sht   (vlax-get excel 'activesheet)
  7.   )
  8.   (variant-value
  9.     (vlax-get-property
  10.       (vlax-variant-value
  11.         (vlax-get-property
  12.           (vlax-get-property sht 'cells)
  13.           'item
  14.           row
  15.           col
  16.         )
  17.       )
  18.       'value2
  19.     )
  20.   )
  21. )
 楼主| 发表于 2022-7-27 22:41 | 显示全部楼层

谢谢你时隔几年还回帖指导
发表于 2013-12-11 09:26 | 显示全部楼层
(vlax-get-object "Excel.Application")返回nil表示excel没有打开。
  1. (if (null (setq excelapp0 (vlax-get-object "Excel.Application"))
  2.     )
  3.   (progn
  4.   (setq excelapp0 (vlax-create-object "Excel.Application"))
  5.   (vlax-put-property excelapp0 'Visible 1)
  6.   )
  7. )
  8. (setq excelworkbooks0 (vlax-get-property excelapp0 'Workbooks))
  9. (setq activeworkbook0 (vlax-invoke-method excelworkbooks0 'add))
  10. (setq activesheet0 (vlax-get-property activeworkbook0 'ActiveSheet))
  11. (setq cells0 (vlax-get-property activesheet0 'cells))
  12. (setq aLastcell        (vlax-get-property
  13.                   cells0
  14.                   'item
  15.                   (vlax-get-property
  16.                     (vlax-get-property
  17.                       (vlax-get-property cells0 'cells)
  18.                       'rows
  19.                     )
  20.                     'count
  21.                   )
  22.                   1
  23.                 )
  24. )
  25. (setq endxluprow0 ;_A列有数据的最后一行的行号
  26.        (vlax-get-property
  27.          (vlax-get-property
  28.            (vlax-variant-value aLastcell)
  29.            'end
  30.            -4162
  31.          )
  32.          'row
  33.        )
  34. )

 楼主| 发表于 2013-12-11 14:14 | 显示全部楼层
snddd2000 发表于 2013-12-11 09:26
(vlax-get-object "Excel.Application")返回nil表示excel没有打开。


呵呵,还是师傅出手了。我想对cell(row,col)设定为变量来查找数据,但是不成功,请教一下给把个脉
;;通过变量查找符合条件的单元格数据
defun c:ty ()
   (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单元格对象
  (setq k 1)
   (while (< 50 k)
     (if        (<= 300 (get-cell (vlax-variant-value k) 2))
       (setq k (+ k 1))
     )
   )
   (get-cell (vlax-variant-value k) 2)
)
(defun get-cell        (row col)
   (setq dy (vlax-get-property cells0 'item row col))
   ;;单元格对象
  (setq
     a1-value (vlax-variant-value
                (vlax-get-property (vlax-variant-value dy) 'value)
                ;;或者'value
              )
   )
   ;;单元格里面的值里的值
  a1-value
)
发表于 2013-12-12 10:10 | 显示全部楼层
yxh1202 发表于 2013-12-11 14:14
呵呵,还是师傅出手了。我想对cell(row,col)设定为变量来查找数据,但是不成功,请教一下给把个脉
...

  1. (defun c:ty
  2.        (/ excelapp0 activeworkbook0 activesheet0 cells0 k get-cell)
  3.   (vl-load-com)
  4.   (defun get-cell (row col / dy a1-value a1-value)
  5.     (setq dy (vlax-get-property cells0 'item row col))
  6.     ;;单元格对象
  7.     (setq
  8.       a1-value (vlax-variant-value
  9.                  (vlax-get-property (vlax-variant-value dy) 'value)
  10.                  ;;或者'value
  11.                )
  12.     )
  13.     ;;单元格里面的值里的值
  14.     a1-value
  15.   )
  16.   ;;简单示例lisp读取excel里的数据(没有判断容错功能)by snddd2000 2011-11-17
  17.   (setq excelapp0 (vlax-get-object "Excel.Application"))
  18.   ;;excel程序对象,没开excel下边的都是白搭
  19.   (setq activeworkbook0 (vlax-get-property excelapp0 'ActiveWorkbook))
  20.   ;;excel工作簿对象
  21.   (setq activesheet0 (vlax-get-property activeworkbook0 'ActiveSheet))
  22.   ;;excel工作表对象
  23.   (setq cells0 (vlax-get-property activesheet0 'cells))
  24.   ;;excel单元格对象
  25.   (setq k 1)
  26.   (while (< 50 k)
  27.     (if        (<= 300 (get-cell k 2))
  28.       (setq k (1+ k))
  29.     )
  30.   )
  31.   (get-cell k 2)
  32.   (mapcar 'vlax-release-object
  33.           (list cells0 activesheet0 activeworkbook0 excelapp0)
  34.   )
  35.   (gc)
  36.   (princ)
  37. )
 楼主| 发表于 2013-12-13 17:36 | 显示全部楼层
snddd2000 发表于 2013-12-12 10:10

谢谢你的帮忙,但是运行出现    ty ; 错误: 参数类型错误: VLA-OBJECT nil
发表于 2013-12-13 18:42 | 显示全部楼层
支持楼主!
发表于 2013-12-16 18:43 | 显示全部楼层
yxh1202 发表于 2013-12-13 17:36
谢谢你的帮忙,但是运行出现    ty ; 错误: 参数类型错误: VLA-OBJECT nil

我可以取到值,你自己调试下,看看是哪个变量没有得到值。
 楼主| 发表于 2013-12-17 13:24 | 显示全部楼层
本帖最后由 yxh1202 于 2013-12-17 13:40 编辑
snddd2000 发表于 2013-12-16 18:43
我可以取到值,你自己调试下,看看是哪个变量没有得到值。


我是  excel2010   cad2010,请指教。

发表于 2013-12-17 14:48 | 显示全部楼层
我是excel2007   cad2007,调试只能靠自己。
发表于 2013-12-17 15:10 | 显示全部楼层
谢谢众位坛友代码分享!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-3 12:00 , Processed in 0.523407 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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