cad与xlsx电子表格(wps/excel)接口autolisp程序设计之二——打开已有xlsx文件并写入数据
;程序的关键在于首先要明白xlsx文件的对象层级,app->workbooks->workbook->sheets->sheet->cells
;其次要了解对象的方法和属性,尤其是方法所需参数,这需要查阅MicroSoft官网的Office VBA参考 https://learn.microsoft.com/zh-cn/office/vba/api/overview/
;然后使用vlax-invoke-method、vlax-get-property、vlax-put-property函数操作excel各级对象,程序代码如下:
(defun c:open-xlsx ( / xlsx_name xlsxApp appShow wbs wb active_wb sheets newsheet
present_sheet list1 )
(setvar "cmdecho" 0)
(vl-load-com)
(if (setq xlsx_name (open-xlsx-filename))
(progn
(prompt (strcat "打开xlsx电子表格文件:" xlsx_name "并新建一个工作表。"))
(setq appShow 0)
;appshow,是否显示应用程序,0隐藏,1显示
(or
(setq xlsxApp (VL-CATCH-ALL-APPLY 'vlax-get-or-create-object '("Ket.Application")))
;黓认启动WPS
(setq xlsxApp (VL-CATCH-ALL-APPLY 'vlax-get-or-create-object '("Excel.Application")))
;没有安装WPS,则启动MSoffice
)
(if (and xlsxApp (not (vl-catch-all-error-p xlsxApp)))
;如果创建应用程序实例成功
(progn
(vl-catch-all-apply 'vlax-put-property (list xlsxApp 'DisplayAlerts :vlax-False))
;禁止弹出警告窗口
(vla-put-visible xlsxApp appShow)
;显示/隐藏WPS或office应用程序界面
(setq wbs (vlax-get-property xlsxApp 'WorkBooks))
;wbs,所有工作簿集合
(setq wb (vlax-invoke-method wbs 'open xlsx_name nil nil nil nil nil nil nil nil nil nil nil nil nil nil))
;wb,打开已存在的工作簿(xlsx文件)
;workbooks的open方法的参数含义请参阅MicroSoft官网Office VBA参考
;https://learn.microsoft.com/zh-cn/office/vba/api/overview/
(setq active_wb (vlax-get-property xlsxApp 'ActiveWorkbook))
;active_wb,当前工作簿
(setq sheets (vlax-get-property wb 'sheets))
;sheets,所有sheet的集合
(setq newsheet (vlax-invoke-method sheets 'Add nil nil 1 -4167))
;新建一个工作表,该表自动成为当前活动表格
;sheets的add方法的参数含义请参阅MicroSoft官网Office VBA参考
;(vlax-put-property newsheet "name" sheetName)
;命名为sheetName
(setq present_sheet (vlax-get-property active_wb 'activesheet))
;取得活动表格名称,即新建的文件自动生成的表格,本行无作用仅演示
(setq list1 (list (list 1 1 "China") (list 1 2 "is") (list 1 3 "our") (list 1 4 "motherland.")))
(foreach ele list1 (put-vlaue-to-cell newsheet (car ele) (cadr ele) (caddr ele)))
;将list的数据注入到xlsx文件中,list每个元素格式(行数 列数 数据)
(vlax-invoke-method wb 'Save)
;保存所做修改
(CloseExcelFile)
)
(princ "\n调用WPS或Excel失败,请先安装应用程序。" )
)
)
)
(princ "【需求与BUG:67686237@qq.com】")
(setvar "cmdecho" 1)
(princ)
)
;关闭excel文件
(defun CloseExcelFile ( )
(vlax-invoke-method wb 'Close "true" nil nil )
;关闭工作簿,workbook的close方法请参阅MicroSoft官网Office VBA参考
(vlax-invoke-method xlsxApp "Quit");退出excel对象
(vlax-release-object xlsxApp);释放excel对象
)
;给单元格赋值
(defun put-vlaue-to-cell (sheet_obj row column value / cells)
(setq cells (vlax-get-property sheet_obj 'cells))
;cells,当前表格的所有单元格
(vlax-put-property cells 'item row column value)
;cells对象的item属性第一参数代表行数,第二个参数代表列数,与range属性的用法不同
)
;xlsx文件名
(defun open-xlsx-filename ( / file_fullname )
(if (setq file_fullname (getfiled "打开xlsx电子表格文件" "" "xlsx" 4))
;打开标准对话框,提示新建CSV文件
file_fullname
nil
)
)
;异常处理函数
(defun *error* ( )
(princ "\n程序异常中止!!!")
(CloseExcelFile)
(princ "【需求与BUG:67686237@qq.com】")
(setvar "cmdecho" 1)
(princ)
)

浙公网安备 33010602011771号