明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 552|回复: 6

[提问] 如何使用lisp得到excel文件的有效数据行

[复制链接]
发表于 2023-11-13 18:26 | 显示全部楼层 |阅读模式
求大佬指点一下怎么使用lisp得到一个excel文件的有效数据行数


利用gpt写了一个这样的

(defun Get_Row_Count(ss / excel ws sht)
  (setq excel (vlax-get-or-create-object "excel.application"))
  (setq vg vlax-get-property )
  (setq ws (vg excel 'Workbooks))
  (setq sht(vg (vg (vlax-invoke ws 'Open ss) 'Worksheets) 'item 1))


   ; 获取表格范围
  (setq col (vg sht 'Columns))
  (princ col)
  ; 过滤非空单元格
  (setq used_range (vlax-invoke col 'SpecialCells 4))
  (princ used_range)
  (setq range (vg used_range 'Rows))
  (princ range)

  (setq row_count (vg range 'Count))

  ; 输出行数
  (princ row_count)

  ; 关闭 Excel
  (vlax-invoke ws 'Close)

  ; 释放 COM 对象
  (vlax-release-object excel)
  row_count
)



但是这个总是输出2,明显不对劲,但是不过滤就会输出1048576更不对了,应该怎么写呀
发表于 2023-11-13 20:44 | 显示全部楼层
回复 支持 1 反对 0

使用道具 举报

发表于 2023-11-13 19:10 | 显示全部楼层
来源于网络开源内库
  1. ;;;名称:BF-Excel-getUsedRange
  2. ;;;说明:获取已使用的range区域
  3. ;;;参数:XLApp:已打开的excel文件对象
  4. ;;;参数:Name:工作表名
  5. ;;;返回:成功返回range对象
  6. ;;;示例BF-Excel-getUsedRange exobj "345")
  7. (Defun BF-Excel-getUsedRange (XLApp Name / Rtn sh)
  8.   (if (null Name)
  9.     (setq Name (BF-Excel-getActiveSheet XLApp))
  10.   )
  11.   (vlax-for sh (vlax-get-property XLApp "sheets")
  12.     (if        (= (vlax-get-property sh "Name") Name)
  13.       (setq Rtn (vlax-get-property sh "UsedRange"))
  14.     )
  15.   )
  16.   Rtn
  17. )
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-11-13 18:55 | 显示全部楼层
直接得到有效行没找到,只好这样写了,
;;功能:载入工作表指定区域数据为 VisualLisp 数组
;;参数:ss 路径及文件名; n 工作表的下标或名称; usg 指定的数据区域
;;返回:VL数组
;;示例:(Get_Sheet_arry "d:\\cpp\\data.xlsx" 1 "a2:e2000")
;;VisualLisp 数组用法,查找第 2 行,第 3 列数据,转 lisp 表用 mapcar
;;(vlax-variant-value(vlax-safearray-get-element arr 2 3))

(defun Get_Sheet(ss n usg / vg ws sht)
(setq excel (vlax-get-or-create-object "excel.application")
    vg vlax-get-property ws (vg excel 'Workbooks)
    sht(vg (vg (vlax-invoke ws 'Open ss) 'Worksheets) 'item n)
    arr (vlax-variant-value (vg (vg sht 'Range usg) 'Formula)))

  (setq row_count 1)
  (while (not (= (vlax-variant-value(vlax-safearray-get-element arr row_count 1)) ""))
    (setq row_count (+ row_count 1))
    (if (> row_count 2000)
      (progn
        (princ "文件数据太多,为保证性能,不应超出2000行")
        (exit)
        )
      )
    )
(vlax-invoke ws 'close)
(list arr row_count)
)

(princ (Get_Sheet "C:\\Users\\86155\\Desktop\\埋件数据模板.xlsx" 1 "a1:q2000"))

循环判断一下
发表于 2023-11-14 10:49 | 显示全部楼层
飞雪神光 发表于 2023-11-13 19:10
来源于网络开源内库

感谢大佬分享

点评

MXS
@lisp的函数库里面有好多关于excel的函数你可以去看看,学习一下。  发表于 2023-11-15 09:52
发表于 2023-11-16 16:22 | 显示全部楼层

好的好的,我去看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-2 14:49 , Processed in 0.166638 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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