明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 985|回复: 5

[源码] VLISP获取EXCEL_XLS文件对象

  [复制链接]
发表于 2024-8-31 15:25:08 | 显示全部楼层 |阅读模式
  1. (defun xtjd:openxls(xls / exappstr fn fn2 fnv newopen)
  2.   ;返回xls文件对象名称 如xls文件不在支持目录里需加上路径
  3.   ;全局变量
  4.   ;*openapp*   excel程序开启标记
  5.   ;*openxls*   xls文件开启标记
  6.   ;*excelapp*  excel程序对象
  7.   ;*xlswbs*    xls对象称
  8.   (defun newopen()
  9.     ;新开XLS文档,并返回打开的xls文件对象名称
  10.     (setq *openxls* t) ;xls文件开启标记
  11.     (vla-put-visible *excelapp* :vlax-False) ;程序对象不显示
  12.     (vlax-invoke-method *xlswbs* "open" fn)  ;打开xls文件
  13.   )
  14.   (if(setq fn(findfile xls))
  15.     (progn
  16.       (setq  exappstr "Excel.Application")          ;excel程序,下述简称EX
  17.       (if(setq *excelapp*(vlax-get-object exappstr)) ;EX已打开 返回对象名称
  18.         (progn ;EX已打开
  19.           (setq ;fn2 = 与实际文件名称大小写一致
  20.             fn2(car(vl-directory-files(vl-filename-directory fn)(strcat(vl-filename-base fn)(vl-filename-extension fn))1))
  21.             *xlswbs*(vlax-get-property *excelapp* "workbooks") ;已打开的文档集合
  22.           )
  23.           (if(zerop(vla-get-count *xlswbs*))
  24.             (setq fnv(newopen)) ;打开的文档数目=0 则新开xls文件并返回xls对象名
  25.             ;打开的文档数目>0 获取xls文件的对象名失败 则新开xls文件并返回xls对象名
  26.             (if(vl-catch-all-error-p(setq fnv(vl-catch-all-apply 'vlax-get-property(list *xlswbs* "item" fn2))))
  27.               (setq fnv(newopen))
  28.               (setq *openxls* nil)
  29.             )
  30.           )
  31.         )
  32.         (setq                                   
  33.           *openapp* t                                                               ;EX开启标记
  34.           *excelapp*(vlax-create-object exappstr)                     ;创建EX对象
  35.           *xlswbs*(vlax-get-property *excelapp* "workbooks")  ;workbooks
  36.           fnv(newopen)                                                             ;新开xls文件并返回xls对象名
  37.         )
  38.       )
  39.     )
  40.   )
  41.   fnv
  42. )

  43. ;例
  44. ;(setq newbook(xtjd:openxls "Xtjd_Pgp.Xls"))

  45. ;关闭excel
  46. (defun xtjd:CloseExcel()
  47.   ;如需保存建议先用(vla-save newbook)
  48.   (if *openxls*(vlax-invoke-method newbook 'Close  :vlax-False)) ;不保存关闭XLS文件
  49.   (if *openapp*(vlax-invoke-method *excelapp* 'QUIT))               ;EX新开,则关闭EX
  50.   (mapcar 'vlax-release-object (list *excelapp* *xlswbs*))             ;释放对象
  51. )
VLISP获取EXCEL_XLS文件对象
xls文件已经打开,直接返回xls对象
xls文件未打开,则打开并返回对象


评分

参与人数 1明经币 +1 收起 理由
统一网名 + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-9-9 11:44:48 | 显示全部楼层
这么好的帖子.没人回复..
 楼主| 发表于 2024-9-10 14:54:41 | 显示全部楼层
  1. (defun xtjd:openxls(xls / exappstr fn fn2 fnv newopen)
  2.   ;返回xls文件对象名称 如xls文件不在支持目录里需加上路径
  3.   ;全局变量
  4.   ;*openapp*   excel程序开启标记
  5.   ;*openxls*   xls文件开启标记
  6.   ;*excelapp*  excel程序对象
  7.   ;*xlswbs*    xls对象
  8.   (defun newopen(file)
  9.     ;新开XLS文档,并返回打开的xls文件对象名称
  10.     (setq *openxls* t) ;xls文件开启标记
  11.     (vla-put-visible *excelapp* :vlax-False) ;程序对象不显示
  12.     (vlax-invoke-method *xlswbs* "open" file)  ;打开xls文件
  13.   )
  14.   
  15.   (if(setq fn(findfile xls))
  16.     (progn
  17.       ;excel程序,下述简称EX
  18.       (setq  exappstr "Excel.Application")
  19.       ;判断EX是否打开,打开则返回对象名称
  20.       (if(setq *excelapp*(vlax-get-object exappstr))
  21.         
  22.         ;EX已打开
  23.         (progn
  24.           (setq
  25.             ;获取fn真实对应的文件名称fn2(大小写与实际显示一致)
  26.             fn2(car(vl-directory-files(vl-filename-directory fn)(strcat(vl-filename-base fn)(vl-filename-extension fn))1))
  27.             ;已打开的文档集合
  28.             *xlswbs*(vlax-get-property *excelapp* "workbooks")
  29.           )
  30.           ;判断文档数目是否为0
  31.           (if(zerop(vla-get-count *xlswbs*))
  32.             ;为0,新开xls文件fn并返回fn的xls对象名
  33.             (setq fnv(newopen fn))
  34.             ;不为0 且获取fn文件对象名失败 则新开fn文件并返回xls对象名
  35.             (if(vl-catch-all-error-p(setq fnv(vl-catch-all-apply 'vlax-get-property(list *xlswbs* "item" fn2))))
  36.               (setq fnv(newopen fn))
  37.               (setq *openxls* nil)
  38.             )
  39.           )
  40.         )
  41.         
  42.         ;EX未打开
  43.         (setq
  44.           *openapp* t ;EX开启标记
  45.           *excelapp*(vlax-create-object exappstr) ;创建EX对象
  46.           *xlswbs*(vlax-get-property *excelapp* "workbooks") ;workbooks
  47.           fnv(newopen fn) ;新开xls文件并返回xls对象名
  48.         )
  49.         
  50.       )
  51.     )
  52.   )
  53.   fnv
  54. )


  55. (defun xtjd:openxls-2(xls / exappstr fn fn2 fnv newopen)
  56.   ;返回xls文件对象名称 如xls文件不在支持目录里需加上路径
  57.   ;全局变量
  58.   ;*openapp*   excel程序开启标记
  59.   ;*openxls*   xls文件开启标记
  60.   ;*excelapp*  excel程序对象
  61.   ;*xlswbs*    xls对象
  62.   (defun newopen(file)
  63.     ;新开XLS文档,并返回打开的xls文件对象名称
  64.     (setq *openxls* t) ;xls文件开启标记
  65.     (vla-put-visible *excelapp* :vlax-False) ;程序对象不显示
  66.     (vlax-invoke-method *xlswbs* "open" file)  ;打开xls文件
  67.   )
  68.   
  69.   (if(setq fn(findfile xls))
  70.     (progn
  71.       ;excel程序,下述简称EX
  72.       (setq  exappstr "Excel.Application")
  73.       ;判断EX是否打开,打开则返回对象名称
  74.       (if(setq *excelapp*(vlax-get-object exappstr))
  75.         
  76.         ;EX已打开
  77.         (progn
  78.           ;已开文档集合
  79.           (setq *xlswbs*(vlax-get-property *excelapp* "workbooks"))
  80.           ;判断文档数目是否为0
  81.           (if(zerop(vla-get-count *xlswbs*))
  82.             ;为0,新开xls文件fn并返回fn的xls对象名
  83.             (setq fnv(newopen fn))
  84.             ;如果文档数目不为0,则对比文档中文件全名(含路径大写)
  85.             (progn
  86.               ;函数应用到所有集合对象
  87.               (vlax-map-collection
  88.                 *xlswbs*
  89.                 '(lambda(x)
  90.                    ;如果比对成功,则获取fn的xls对象名
  91.                    (if(eq(strcase(vla-get-FullName x))(strcase fn))
  92.                      (setq *openxls* nil fnv x)
  93.                    )
  94.                  )
  95.               )
  96.               ;如果集中合未找到fn,则新开fn并返回对象名称
  97.               (or fnv(setq fnv(newopen fn)))
  98.             )
  99.           )
  100.         )
  101.         
  102.         ;EX未打开
  103.         (setq
  104.           *openapp* t ;EX开启标记
  105.           *excelapp*(vlax-create-object exappstr) ;创建EX对象
  106.           *xlswbs*(vlax-get-property *excelapp* "workbooks") ;workbooks
  107.           fnv(newopen fn) ;新开xls文件并返回xls对象名
  108.         )
  109.         
  110.       )
  111.     )
  112.   )
  113.   fnv
  114. )

  115. ;例
  116. ;(setq newbook(xtjd:openxls "Xtjd_Pgp.Xls"))
  117. ;(setq newbook(xtjd:openxls-2 "Xtjd_Pgp.Xls"))


评分

参与人数 1明经币 +1 收起 理由
yanshengjiang + 1

查看全部评分

发表于 2024-9-12 14:51:40 | 显示全部楼层
其他xls文件如有打开,关闭时也会跟着一起关闭
发表于 2024-9-13 10:06:12 | 显示全部楼层
有没有lisp读取写入已经打开的excel文件的示例,指教一下。
每次要关掉excel太麻烦
发表于 2024-9-14 22:42:29 | 显示全部楼层
  1. (defun c:aa ()
  2.   (if (setq xls (vlax-create-object "excel.application"))
  3.     (progn
  4.       (vlax-invoke-method (vlax-get-property xls 'WorkBooks) 'Add)
  5.       (vla-put-visible xls 1)
  6.       (setq aw (vlax-get xls 'ActiveWorkbook)
  7.             as (vlax-get aw 'ActiveSheet)
  8.             aa (vlax-get-property as "range" "D4")
  9.       )
  10.       (vlax-put aa 'Formula "中秋节快乐!")
  11.       (vlax-put (vlax-get aa 'Borders) 'Value 1) ; 单元格加边框
  12.       (vlax-put (vlax-get aa 'Font) 'ColorIndex 3) ; 单元格字体颜色 0自动1红色3绿色6黄
  13.       (vlax-put (vlax-get aa 'Interior) 'ColorIndex 6) ; 单元格背景颜色 0自动1红色3绿色6黄
  14.       (setq bb (vlax-get (vlax-get (vlax-get as 'usedrange) 'cells)'columns))
  15.       (vlax-invoke-method bb 'autofit); 自动调整宽度
  16.     )
  17.   )
  18.   (princ)
  19. )

评分

参与人数 1明经币 +1 收起 理由
yanshengjiang + 1

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-1-15 16:50 , Processed in 0.157322 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表