[求助(已解决)]用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
)
xfile为lisp下的文件名,怎么变成vl对象?
PS:感谢lzh741206版主
另,参照处的程序,我已经基本上写好我需要的“不打开指定的Excel文件就能将其中指定单元格的数据读出来”,程序在一楼,有兴趣的朋友可以去看看。
(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) ) )
(SETQ AA(msxl-GET-value1
(msxl-get-range *XLAPP*"A1")
))
(vlax-variant-value AA)
提取A1单元格的数据
能给出完整程序么?
msxl-GET-value1,这个函数貌似加载不了
把二楼的程序修改了一下,可以执行了。本质上这个和 的程序是一样的,具体表现形式和我一楼的程序也是一样的。还是做不到“不打开指定的Excel文件就能将其中的数据读出来”。还请高手们指点指点。
(defun Excel-Get-CellValue (xlapp cell /)
(vlax-variant-value (msxl-GET-value (msxl-get-range xlappcell)))
)
乍有可能不打开文件就能读取数据了?
谁都不能做的的!只是看你如何打开而已吧?
原来的excel程序是打开的,你就不要quit!
原来的文档是打开的你就不要close!
否则,就该乍的就乍的!这不就实现了不影响其它打开的Excel文件!
咋就木有可能呢?
自己做不到不代表谁都做不到的,不然为啥上乐筑天下来问呢,不就是因为咱乐筑天下高人多么!
原来的文档不要close,我现在就是这么做的。
但是,做程序不就是要追求完美一些么?
老想着让用户该乍的就乍的,不再程序上下功夫是要不得的!!!!!!!
如果楼主会VBA可以测试一下,VBA不用EXCEL.APPLICATION而是直接调用里的WORKSHEETS等对象,但只要调用了EXCEL类里的东西,就可以在任务管理器里看到EXCEL.EXE进程,所以如果不打开EXCEL文件而读取里面的内容应该是不可能的。
不过好像可以用数据库的SQL语句调用EXCEL数据库。具体怎么做就不是很清楚了。
那就是说,应该还是有可能不打开EXCEL文件而读取里面的内容的~!只是会的人现在还没看到我的帖子罢了
页:
[1]
2