一只傲娇喵 发表于 2023-11-13 18:26:01

如何使用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更不对了,应该怎么写呀

sandyvs 发表于 2023-11-13 20:44:08

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
正好这两天也在找

飞雪神光 发表于 2023-11-13 19:10:14

来源于网络开源内库;;;名称: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
)

一只傲娇喵 发表于 2023-11-13 18:55:59

直接得到有效行没找到,只好这样写了,
;;功能:载入工作表指定区域数据为 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:29

飞雪神光 发表于 2023-11-13 19:10
来源于网络开源内库

感谢大佬分享

菜鸟初来乍到 发表于 2023-11-16 16:22:23

菜鸟初来乍到 发表于 2023-11-14 10:49
感谢大佬分享

好的好的,我去看看
页: [1]
查看完整版本: 如何使用lisp得到excel文件的有效数据行