本帖最后由 Gaudi 于 2024-4-29 15:53 编辑
第三篇 第三部分 读取指定excel表数据
这部分很重要,因为它自身的耦合性很高,可以用到其他任何函数里面。
同时这部分的代码确实理解起来有点难度,所以我先把代码放出来,不太想去理解的朋友,可以直接用。
- (defun ReadExcelData ()
- (setq defaultPath (getvar "DWGPREFIX"))
- (setq selectedExcelFile (getfiled "选择外业数据" defaultPath "xlsx;xls" 0))
- (setq application (vlax-get-or-create-object "Excel.Application"))
- (setq workbooks (vlax-get-property application "WorkBooks"))
- (setq workbook (vlax-invoke-method workbooks "Open" selectedExcelFile))
- (setq sheets (vlax-get-property workbook "Sheets"))
- (setq worksheet (vlax-get-property sheets "Item" "标志牌"))
- (setq range (vlax-get-property worksheet "Range" "A2:E100"))
- (setq variantValues (vlax-get-property range 'Value))
- (setq listValues (vlax-safearray->list (vlax-variant-value variantValues)))
- (vlax-invoke-method workbook "Close")
- (vlax-invoke-method application "Quit")
- (vlax-release-object application)
- listValues
- )
整体分为以下板块:
A 定义默认路径
B 选择excel程序,建立联系
C 选择工作簿
D 选择工作表
E 选择单元格
F 读取数据
G 改变格式,传递数据
H 关闭工作表、关闭工作簿
I 断开联系
J 重申数据返还
今天有点忙,先放,有空了再解释。
1 思维理解
对于 cad 和 excel 数据交互来说,每一步都需要两个操作:选择、打开。
程序是很笨的嘛,所有操作都得写清楚高速它。
而对于一份 excel 数据来说,这样的步骤需要重复三次:工作簿、工作表、单元格。
理解完成。
2 工作簿
- (setq application (vlax-get-or-create-object "Excel.Application"))
vlax-get-or-create-object,定义 - 获取 - 或者 - 创建 - 对象。
理解起来其实很容易,就是创建或者获取一个 VLA 对象,这里定义具体为 excel。
- (setq workbooks (vlax-get-property application "WorkBooks"))
vlax-get-property,定义 - 获取 - 属性。
针对已经创建的 VLA 对象,获得其属性,属性定义具体为 workbooks ,工作簿。
将工作簿对象集合传递下去。
3 工作表
- (setq workbook (vlax-invoke-method workbooks "Open" selectedExcelFile))
vlax-invoke-method,熟悉的函数,上次是这么使用的:
- (setq folder (vlax-invoke-method sh 'BrowseForFolder 0 "选择块文件夹" 0))
上次是用来选择文件夹。
这次是用来在工作簿对象中,将选择的文件打开,将工作表对象集合传递个下一个参数。
- (setq worksheet (vlax-get-property sheets "Item" "标志牌"))
在所有的工作表对象集合中,选择特定的工作表,将工作表作为对象传递个下一个参数。
4 单元格
- (setq range (vlax-get-property worksheet "Range" "A2:E100"))
在特定的工作表中,选定特定的范围,将单元格范围传递给下一个参数。
- (setq variantValues (vlax-get-property range 'Value))
在特定的单元格中,选择参数 value,将数值传递给下个参数。
5
到这里理论上就结束了。
但是会报错。
因为到目前为止,所谓的“value”仍然是一个VLA对象。
所以需要一个函数,将这个 VLA 对象,转为 cad 可返回的参数。
- (setq listValues (vlax-safearray->list (vlax-variant-value variantValues)))
这里有两个函数,一个是vlax-variant-value,定义-变体-数值;一个是vlax-safearray->list,定义-安全数组 转为 列表。
这里面有两个很拗口的概念:变体和安全数组。
先不聊,能理解就理解,半理解就这么
总归这两个函数的意思就是,先将读取的变体数值转为安全数组,再将安全数组转为列表。
|