明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3288|回复: 4

求助,lisp查找指定excel单元格数据

[复制链接]
发表于 2013-12-6 16:59:21 | 显示全部楼层 |阅读模式
本帖最后由 yxh1202 于 2013-12-10 11:20 编辑

;;;取出Excel文件中第一个工作表中指定单元格的数据
(defun c:ttt ()
  (vl-load-com)
  (setq appxls (vlax-get-or-create-object "excel.application"))
  (Excel-Get-data)
  (vlxls-sheet-put-active (appxls "xl"))
  (setq sheet-name vlxls-Sheet-Get-Active)
  ;;(setq Sheet-name (vlax-variant-value (car (caddr lst))))
  ;;确定"第一个"工作表的名称
  (setq cell-value (Excel-Get-CellValue sheet-name "C16"))
  ;;H16单元格
  (vlax-invoke-method ADORecordset "Close")
  (vlax-invoke-method ADOConnect "Close")

  (progn
    (princ "\n打开Excel数据文件出错")
    (vl-catch-all-apply
      'vlax-invoke-method
      (list ADOConnect "Close")
    )
    (setq cell-value nil)
  )
  (vlax-release-object ADORecordset)
  (vlax-release-object ADOConnect)
  cell-value
)

(defun Excel-Get-data (/             xfile           cell
                       ADOCONNECT    ADORECORDSET  ConnectionString
                       lst             Sheet-name           source
                       cell-tmp             cell-value
                      )
  (setq xfile (getfiled "打开纵断面文件" "" "xls" 8))
  (setq ADOConnect (vlax-get-or-create-object "ADODB.Connection"))
  (setq ADORecordset (vlax-get-or-create-object "ADODB.Recordset"))
  (setq        ConnectionString
         (strcat
           "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
           xfile
           ";Extended Properties=;Excel 8.0;HDR=No"
         )
  )
  (if (not
        (vl-catch-all-error-p
          (vl-catch-all-apply
            (function vlax-invoke-method)
            (list ADOConnect "Open" ConnectionString "admin" "" nil)
          )
        )
      )
    (progn
      (setq lst
             (vlax-safearray->list
               (vlax-variant-value
                 (vlax-invoke-method
                   (vlax-invoke-method ADOConnect "OpenSchema" 4)
                   "GetRows"
                   1
                 )
               )
             )
      )
    )
    ;;end progn
  )
  ;;end  if
)
;;end excel-get-data

;;----获得所有表格名称-----
(Defun vlxls-sheet-get-all (xlapp / SH Rtn)
  (vlax-for SH (vlax-get-property Xlapp "sheets")
    (setq Rtn (cons (vlax-get-property sh "Name") Rtn))
  )
  (reverse Rtn)
)

;;函数--指定单元格的数据----------------------------------------
(defun Excel-Get-CellValue (Sheet-name cell)
  (setq
    source
     (strcat "SELECT * FROM [" Sheet-name cell ":" cell "]")
  )
  (vlax-invoke-method
    ADORecordset "Open"        source ADOConnect 1 3 nil)
  (setq
    cell-tmp (vlax-safearray->list
               (vlax-variant-value
                 (vlax-invoke-method ADORecordset "GetRows" 1)
               )
             )
  )
  (vlax-variant-value (car (car cell-tmp)))
)
;;--------返回激活的表格名称---------
(Defun vlxls-Sheet-Get-Active (/ xlapp name)
  (vlax-get-property
    (vlxls-sheet-put-active xlapp name)
  )
)

;;-------设定激活的工作表名称--------
(Defun vlxls-sheet-put-active (xlapp Name / sh)
  (if (null (vlxls-sheet-add xlapp name))
    (vlax-for sh (vlax-get-property Xlapp "sheets")
      (if (= (vlax-get-property sh "Name") Name)
        (vlax-invoke-method sh "Activate")
      )
    )
  )
  (equal (vlxls-sheet-get-active) name)
)
;;------添加新工作表sheet-----------------
(Defun vlxls-sheet-add (xlapp Name / Rtn)
  (if (member name (vlxls-sheet-get-all xlapp))
    (setq Rtn nil)
    (progn
      (vlax-put-property
        (vlax-invoke-method
          (vlax-get-property Xlapp "sheets")
          "Add"
        )
        "name"
        Name
      )
      (setq Rtn (equal (vlxls-sheet-get-active xlapp) name))
    )
  )
  Rtn
)


加载运行后出现    错误: 函数错误: #<VLA-OBJECT _Application 175d7514>
请高人指点

本帖被以下淘专辑推荐:

  • · excel|主题: 80, 订阅: 2
 楼主| 发表于 2013-12-6 23:09:44 | 显示全部楼层
难道说调用excel2010类库无法
发表于 2013-12-7 01:52:07 | 显示全部楼层
(vl-registry-read "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Excel.EXE" "Path") 试试这个
 楼主| 发表于 2013-12-7 09:12:42 | 显示全部楼层
1993063 发表于 2013-12-7 01:52
(vl-registry-read "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Exce ...

谢谢你,请问有完整的lisp与excel2010通讯的例子吗。
 楼主| 发表于 2013-12-9 18:26:11 | 显示全部楼层
1993063 发表于 2013-12-7 01:52
(vl-registry-read "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Exce ...

1楼的是不是用ado方法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-23 10:53 , Processed in 0.181135 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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