lazybug 发表于 2009-5-7 16:11:00

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

通过在乐筑天下、晓东里边转了一圈又一圈之后终于能从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-methodADORecordset "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
)

lazybug 发表于 2009-5-17 14:33:00


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

渠辉 发表于 2022-7-11 16:00:00


(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) ) )

modernyoung 发表于 2009-5-7 21:35:00

(SETQ AA(msxl-GET-value1
(msxl-get-range *XLAPP*"A1")
))
(vlax-variant-value AA)
提取A1单元格的数据

lazybug 发表于 2009-5-7 23:18:00

能给出完整程序么?
msxl-GET-value1,这个函数貌似加载不了

lazybug 发表于 2009-5-8 08:18:00

把二楼的程序修改了一下,可以执行了。本质上这个和 的程序是一样的,具体表现形式和我一楼的程序也是一样的。还是做不到“不打开指定的Excel文件就能将其中的数据读出来”。还请高手们指点指点。
(defun Excel-Get-CellValue (xlapp cell /)
    (vlax-variant-value (msxl-GET-value (msxl-get-range xlappcell)))
)

飞诗(fsxm) 发表于 2009-5-8 12:01:00

乍有可能不打开文件就能读取数据了?
谁都不能做的的!只是看你如何打开而已吧?
原来的excel程序是打开的,你就不要quit!
原来的文档是打开的你就不要close!
否则,就该乍的就乍的!这不就实现了不影响其它打开的Excel文件!

lazybug 发表于 2009-5-8 13:02:00

咋就木有可能呢?
自己做不到不代表谁都做不到的,不然为啥上乐筑天下来问呢,不就是因为咱乐筑天下高人多么!
原来的文档不要close,我现在就是这么做的。
但是,做程序不就是要追求完美一些么?
老想着让用户该乍的就乍的,不再程序上下功夫是要不得的!!!!!!!

Saging 发表于 2009-5-8 13:36:00

如果楼主会VBA可以测试一下,VBA不用EXCEL.APPLICATION而是直接调用里的WORKSHEETS等对象,但只要调用了EXCEL类里的东西,就可以在任务管理器里看到EXCEL.EXE进程,所以如果不打开EXCEL文件而读取里面的内容应该是不可能的。
不过好像可以用数据库的SQL语句调用EXCEL数据库。具体怎么做就不是很清楚了。

lazybug 发表于 2009-5-9 00:24:00

那就是说,应该还是有可能不打开EXCEL文件而读取里面的内容的~!只是会的人现在还没看到我的帖子罢了
页: [1] 2
查看完整版本: [求助(已解决)]用lisp读取Excel文件中指定单元格的数据