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

posted @ 2024-07-15 10:18  遇事修性遇人修心  阅读(149)  评论(0)    收藏  举报