乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 284|回复: 11

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

[复制链接]

29

主题

197

帖子

12

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
308
发表于 2009-5-7 16:11:00 | 显示全部楼层 |阅读模式
通过在乐筑天下、晓东里边转了一圈又一圈之后终于能从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
)
回复

使用道具 举报

29

主题

197

帖子

12

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
308
发表于 2009-5-17 14:33:00 | 显示全部楼层

xfile为lisp下的文件名,怎么变成vl对象?
PS:感谢lzh741206版主
另,参照处的程序,我已经基本上写好我需要的“不打开指定的Excel文件就能将其中指定单元格的数据读出来”,程序在一楼,有兴趣的朋友可以去看看。
回复

使用道具 举报

8

主题

44

帖子

13

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
68
发表于 2022-7-11 16:00:00 | 显示全部楼层
  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]
回复

使用道具 举报

7

主题

16

帖子

5

银币

初来乍到

Rank: 1

铜币
42
发表于 2009-5-7 21:35:00 | 显示全部楼层
(SETQ AA(msxl-GET-value1
(msxl-get-range *XLAPP*  "A1")
))
(vlax-variant-value AA)
提取A1单元格的数据
回复

使用道具 举报

29

主题

197

帖子

12

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
308
发表于 2009-5-7 23:18:00 | 显示全部楼层
能给出完整程序么?
msxl-GET-value1,这个函数貌似加载不了
回复

使用道具 举报

29

主题

197

帖子

12

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
308
发表于 2009-5-8 08:18:00 | 显示全部楼层
把二楼的程序修改了一下,可以执行了。本质上这个和 的程序是一样的,具体表现形式和我一楼的程序也是一样的。还是做不到“不打开指定的Excel文件就能将其中的数据读出来”。还请高手们指点指点。
(defun Excel-Get-CellValue (xlapp cell /)
    (vlax-variant-value (msxl-GET-value (msxl-get-range xlapp  cell)))
  )
回复

使用道具 举报

18

主题

174

帖子

11

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
244
发表于 2009-5-8 12:01:00 | 显示全部楼层
乍有可能不打开文件就能读取数据了?
谁都不能做的的!只是看你如何打开而已吧?
原来的excel程序是打开的,你就不要quit!
原来的文档是打开的你就不要close!
否则,就该乍的就乍的!这不就实现了不影响其它打开的Excel文件!
回复

使用道具 举报

29

主题

197

帖子

12

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
308
发表于 2009-5-8 13:02:00 | 显示全部楼层
咋就木有可能呢?
自己做不到不代表谁都做不到的,不然为啥上乐筑天下来问呢,不就是因为咱乐筑天下高人多么!
原来的文档不要close,我现在就是这么做的。
但是,做程序不就是要追求完美一些么?
老想着让用户该乍的就乍的,不再程序上下功夫是要不得的!!!!!!!
回复

使用道具 举报

7

主题

63

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
90
发表于 2009-5-8 13:36:00 | 显示全部楼层
如果楼主会VBA可以测试一下,VBA不用EXCEL.APPLICATION而是直接调用里的WORKSHEETS等对象,但只要调用了EXCEL类里的东西,就可以在任务管理器里看到EXCEL.EXE进程,所以如果不打开EXCEL文件而读取里面的内容应该是不可能的。
不过好像可以用数据库的SQL语句调用EXCEL数据库。具体怎么做就不是很清楚了。
回复

使用道具 举报

29

主题

197

帖子

12

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
308
发表于 2009-5-9 00:24:00 | 显示全部楼层
那就是说,应该还是有可能不打开EXCEL文件而读取里面的内容的~!只是会的人现在还没看到我的帖子罢了
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-1-31 15:54 , Processed in 0.160451 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表