如何使用lisp得到excel文件的有效数据行
求大佬指点一下怎么使用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更不对了,应该怎么写呀
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=180165&highlight=%C8%A1%2B%B1%ED
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=186202&highlight=%B0%D9%CD%F2
正好这两天也在找 来源于网络开源内库;;;名称:BF-Excel-getUsedRange
;;;说明:获取已使用的range区域
;;;参数:XLApp:已打开的excel文件对象
;;;参数:Name:工作表名
;;;返回:成功返回range对象
;;;示例:(BF-Excel-getUsedRange exobj "345")
(Defun BF-Excel-getUsedRange (XLApp Name / Rtn sh)
(if (null Name)
(setq Name (BF-Excel-getActiveSheet XLApp))
)
(vlax-for sh (vlax-get-property XLApp "sheets")
(if (= (vlax-get-property sh "Name") Name)
(setq Rtn (vlax-get-property sh "UsedRange"))
)
)
Rtn
) 直接得到有效行没找到,只好这样写了,
;;功能:载入工作表指定区域数据为 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-13 19:10
来源于网络开源内库
感谢大佬分享 菜鸟初来乍到 发表于 2023-11-14 10:49
感谢大佬分享
好的好的,我去看看
页:
[1]