明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 18536|回复: 33

[求助(已解决)]用lisp读取Excel文件中指定单元格的数据

  [复制链接]
发表于 2009-5-7 16:11 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2009-5-25 20:33:40 编辑


通过在明经、晓东里边转了一圈又一圈之后终于能从Excel里边把单元格的数据读出来了。但是,还有个大问题解决不了:
1.
(vla-put-visible xlapp 1);1-可见,0-隐藏
这一句把所有打开的Excel文件都给隐藏掉了!!!!!

2.同样的
(vlax-invoke-method xlapp 'quit)
这一句把所有打开的Excel文件都给关掉了!!!!!!!!!!!!


如何处理,能够让我可以把数据读出来且不影响其它打开的Excel文件?或者这么说:是否可以不打开指定的Excel文件就能将其中的数据读出来?

各位大神给伸伸手指点下吧,谢谢啦……

(defun excel-get-data (/ xlapp xlfile fn H8)
  (vl-load-com)
  ;读取单元格数据
  (defun Excel-Get-CellValue(xlapp cell / xlsrng xlsval)
    (setq xlsrng (vlax-get-property xlapp "range" cell))
    (setq xlsval (vlax-variant-value (vlax-get-property xlsrng "Value")))
  )
  (setq xfile (getfiled "打开法兰计算文件" "" "xls" 8))
  (if (setq fn (findfile xfile))
    (if (setq xlapp (vlax-get-or-create-object "Excel.Application"))
      (progn
 (vlax-invoke-method
   (vlax-get-property xlapp 'WorkBooks)
   'Open
   fn
 )
 (vla-put-visible xlapp 0);1-可见,0-隐藏
 
 ;单元格数据读取
 (setq H8 (Excel-Get-CellValue xlapp "H8"))
 
 ;退出并关闭Excel进程
 (vlax-invoke-method xlapp 'quit)
 (vlax-release-object xlapp)
      )
     )
    )
  H8
)


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

问题已解决
下面是测试的程序:

;;;取出Excel文件中第一个工作表中指定单元格的数据
(defun c:ttt ()
  (Excel-Get-data)
)

(defun Excel-Get-data ( / xfile cell ADOCONNECT ADORECORDSET ConnectionString lst Sheet-name source cell-tmp cell-value)
  ;指定单元格的数据
  (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))) 
  )

  (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)
        )
     )
      )
      (setq Sheet-name (vlax-variant-value (car (caddr lst))));确定"第一个"工作表的名称
      (setq cell-value (Excel-Get-CellValue Sheet-name "H16"));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
)

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

不用ADO原来也是可以实现的

 ;退出并关闭Excel进程
 (vlax-invoke-method xlapp 'quit)
 (vlax-release-object xlapp)

上边两句改成以下内容即可

;退出并关闭Excel文件
 (vlax-invoke-method
   (vlax-get-property xlapp 'ActiveWorkbook)  
   'close
 )

 楼主| 发表于 2009-5-17 14:33 | 显示全部楼层
lkt209发表于2009-5-15 13:08:00注意隐藏的不是xlapp这是程序对象隐藏的是xfile打开的文件对象搞错了!

xfile为lisp下的文件名,怎么变成vl对象?

PS:感谢lzh741206版主

另,参照http://www.mjtd.com/bbs/dispbbs.asp?boardid=3&replyid=567&id=73343&page=1&skin=0&landlord=0&Star=2处的程序,我已经基本上写好我需要的“不打开指定的Excel文件就能将其中指定单元格的数据读出来”,程序在一楼,有兴趣的朋友可以去看看。

回复 支持 0 反对 1

使用道具 举报

发表于 2022-7-11 16:00 | 显示全部楼层
本帖最后由 渠辉 于 2022-7-16 15:16 编辑
  1. [code=lisp](defun Excel:ReadRange (range / array) (setq value (vlax-get-property range 'Value2)) (if (= (vlax-variant-type value) 8204) (mapcar '(lambda (x) (mapcar 'vlax-variant-value x)) (vlax-safearray->list (vlax-variant-value value)) ) (vlax-variant-value value) ) )
[/code]
发表于 2009-5-7 21:35 | 显示全部楼层

(SETQ AA(msxl-GET-value1
 (msxl-get-range *XLAPP*  "A1")

 ))

(vlax-variant-value AA)

提取A1单元格的数据

 楼主| 发表于 2009-5-7 23:18 | 显示全部楼层

能给出完整程序么?

msxl-GET-value1,这个函数貌似加载不了

 楼主| 发表于 2009-5-8 08:18 | 显示全部楼层

把二楼的程序修改了一下,可以执行了。本质上这个和http://www.mjtd.com/Develop/ArticleShow.asp?ArticleID=667 的程序是一样的,具体表现形式和我一楼的程序也是一样的。还是做不到“不打开指定的Excel文件就能将其中的数据读出来”。还请高手们指点指点。

(defun Excel-Get-CellValue (xlapp cell /)
    (vlax-variant-value (msxl-GET-value (msxl-get-range xlapp  cell)))
  )

发表于 2009-5-8 12:01 | 显示全部楼层

乍有可能不打开文件就能读取数据了?

谁都不能做的的!只是看你如何打开而已吧?

原来的excel程序是打开的,你就不要quit!

原来的文档是打开的你就不要close!

否则,就该乍的就乍的!这不就实现了不影响其它打开的Excel文件!

 楼主| 发表于 2009-5-8 13:02 | 显示全部楼层

咋就木有可能呢?

自己做不到不代表谁都做不到的,不然为啥上明经来问呢,不就是因为咱明经高人多么!

原来的文档不要close,我现在就是这么做的。

但是,做程序不就是要追求完美一些么?

老想着让用户该乍的就乍的,不再程序上下功夫是要不得的!!!!!!!

发表于 2009-5-8 13:36 | 显示全部楼层

如果楼主会VBA可以测试一下,VBA不用EXCEL.APPLICATION而是直接调用里的WORKSHEETS等对象,但只要调用了EXCEL类里的东西,就可以在任务管理器里看到EXCEL.EXE进程,所以如果不打开EXCEL文件而读取里面的内容应该是不可能的。

不过好像可以用数据库的SQL语句调用EXCEL数据库。具体怎么做就不是很清楚了。

 楼主| 发表于 2009-5-9 00:24 | 显示全部楼层

那就是说,应该还是有可能不打开EXCEL文件而读取里面的内容的~!只是会的人现在还没看到我的帖子罢了

发表于 2009-5-9 12:43 | 显示全部楼层
顶出个高手出来!
发表于 2009-5-9 13:05 | 显示全部楼层

不打开当然读写不了数据,只是可以打开但不显示,表面上是不打开。

(Defun vlxls-app-open(XLSFile UnHide / ExcelApp WorkSheet Sheets ActiveSheet Rtn)
  ;;;function: this program can open an excelfile
  (setq XLSFile (strcase XLSFile))
  (if (null (wcmatch XLSFile "*.XLS"))
  (setq XLSFile (strcat XLSFile ".XLS")))
  (if (and (findfile XLSFile)
       (setq Rtn (vlax-get-or-create-object "Excel.Application")))
    (progn (vlax-invoke-method (vlax-get-property Rtn 'WorkBooks)
        'Open XLSFile)
 (if UnHide
    (vla-put-visible Rtn 1)
    (vla-put-visible Rtn 0))))
  Rtn)

(setq *xlapp* (vlxls-app-open "C:/test.XLS"  nil))

(SETQ AA(msxl-GET-value1
 (msxl-get-range *XLAPP*  "A1")

 ))

(vlax-variant-value AA)

(vlax-invoke-method *xlapp*  'QUIT) 关闭程序

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-3 07:34 , Processed in 0.584960 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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