明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8963|回复: 47

[函数] vlisp以数组读写excel 超快

    [复制链接]
发表于 2022-9-6 22:05:29 | 显示全部楼层 |阅读模式
本帖最后由 和尚777 于 2022-12-16 16:56 编辑
  • 论坛里有很多读写Excel数据的代码,大多是循环逐个读写,速度很慢
  • Excel vba操作数组是非常方便快速的
  • vlisp操作数组或许可以做到像Excel vba那样快速操作数据
  • 附件有我写的几个函数以数组读写Excel数据,百万数据3秒左右

    下面是源码
         不缺函数! ket是WPS的app名,改成Excel就行!
;vlisp读写excel 超快
;类库函数我注释了,不需要加载,兼容WPS

  1. ; 2022-9-6 hs777
  2. (defun c:tt (/ lst time)

  3.         (setq time(hs-jsq))
  4.         (princ "\n数据构建时间")
  5.         (setq lst(tt-t1 10 50));
  6.         (hs-jsq-end time)

  7.         (setq e(vlax-get-object "Excel.Application")) ;ket.Application
  8.         ;(setq sht(E-Get-ActiveSheet e))
  9.         (setq sht(vlax-get-property e "ActiveSheet"))
  10.         (princ "\n数据写入excel时间")
  11.         (setq time(hs-jsq))
  12.         (E-Lst-2-Range sht "a1" lst)
  13.         (hs-jsq-end time)

  14.         (setq time(hs-jsq))
  15.         (princ "\n读取excel数据时间")
  16.         (setq newlst(E-Get-Range-Value (vlax-get-property  sht "UsedRange")))
  17.         (hs-jsq-end time)
  18.         (princ)
  19. )
;读取
  1. (vl-load-com)
  2. (defun c:tt2()
  3.         (setq time(hs-jsq))
  4.         (princ "\n读取excel数据时间")
  5.         (setq e(vlax-get-object "Excel.Application")) ;ket.Application
  6.         (setq sht(vlax-get-property e "ActiveSheet"))
  7.         (setq newlst(E-Get-Range-Value (vlax-get-property sht "UsedRange")))
  8.         (hs-jsq-end time)
  9. )
;写入函数
  1. ;(E-Lst-2-Range sht "a1" (tt-t1 1 1))
  2. ;(E-Lst-2-Range sht "c2" (tt-t1 10 10000));百万数据
  3. ;(E-Lst2Range 工作表对象 "c2" lst)
  4. ;二维lst表数据写入Excel单元格,写入成功返回T
  5. (defun E-Lst-2-Range(sht a1 lst / arr c r range)
  6.         ;可以不加载Excel类库函数,
  7.         ;注释部分get,put,invoke 3个函数 完全代替类库
  8.         (if(and sht a1 lst
  9.                          (setq arr(hs-lst2arr2 lst))
  10.                          ;(setq a1(E-Get-Range sht a1))
  11.                          (setq a1(vlax-get-property sht "range" a1))
  12.                          (setq r(length lst))
  13.                          (setq c(length (car lst)))
  14.                          ;(setq range (E-Get-Resize a1 r c))
  15.                          (setq range(vlax-get-property a1 "resize" r c))
  16.                  )
  17.                 (progn
  18.                         ;(E-Put-Value2 range arr)
  19.                         (vlax-put-property range "value2" arr)
  20.                         t
  21.                 )
  22.         )
  23. )
;转换函数
  1. ;(setq lst '((1 5 6)(1 2 3)))
  2. ;二维lst表转二维变体数组
  3. ;返回数组
  4. (defun hs-Lst2Arr2(lst / a c r)
  5.         (if (and lst (car(setq a(car lst)))
  6.                                 (listp a)(setq c(length a))
  7.                                 (vl-every '(lambda(x)(= c x))(mapcar 'length lst))
  8.                         )
  9.                 (vlax-safearray-fill
  10.                         (vlax-make-safearray
  11.                                 vlax-vbVariant
  12.                                 (cons 0 (1- (length lst)))(cons 1 c)
  13.                         ) lst)
  14.         )
  15. )
;读取函数
  1. ;获取Excel单元格区域的值
  2. ;一个单元格返回一个值,一片区域返回二维lst表
  3. (defun E-Get-Range-Value(range / a arr)
  4.         (if(and range
  5.                          ;(setq arr(e-get-value range))
  6.                          (setq arr(vlax-get-property range "value" nil))
  7.                  )
  8.                 (progn
  9.                         (if (< 8000(vlax-variant-type arr))
  10.                                 (progn
  11.                                         (setq a(vlax-safearray->list(vlax-variant-value arr)))
  12.                                         (mapcar '(lambda(x)(mapcar 'vlax-variant-value x))a)
  13.                                 )
  14.                                 (progn
  15.                                         (vlax-variant-value arr)
  16.                                 )
  17.                         )
  18.                 )
  19.         )
  20. )
;测试函数
  1. ;构建二维lst表
  2. (defun tt-t1(r c / a i s)
  3.         (setq i 0 s nil)
  4.         (repeat c
  5.                 (setq a nil)
  6.                 (repeat r
  7.                         (setq a(cons (setq i(1+ i)) a))
  8.                 )
  9.                 (setq s(cons (reverse a) s))
  10.         )(setq s(reverse s))
  11. )

  12. (defun hs-jsq ()(setq $timebe(getvar "millisecs")))
  13. (defun hs-jsq-end (time / tt) ;计时器结束
  14.         (or time (setq time $timebe))
  15.         (setq tt(- (getvar "millisecs") time))
  16.         (print(strcat"程序运行时间为:"(rtos(* 0.00000001(* tt 86400))2 4)"秒"))
  17.         tt
  18. )

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

帖子里面的代码测试成功  发表于 2022-9-8 14:11

评分

参与人数 11明经币 +11 收起 理由
ssyfeng + 1 赞一个!
lostbalance + 1 很给力!
freedom_ice + 1 优秀,向你学习!
悟沧 + 1 赞一个!和尚给力。
Yruz + 1 和尚大佬很给力!
USER2128 + 1 很给力!
tigcat + 1 很给力!
caoliu023 + 1 楼主666,但是缺少一些函数
vitalgg + 1 666+111
dtucad + 1 和尚666 +1

查看全部评分

本帖被以下淘专辑推荐:

发表于 2022-9-7 00:22:58 | 显示全部楼层
本帖最后由 nyistjz 于 2022-9-7 00:24 编辑

e-xl24HourClock
e-xl24HourClock
e-AccrInt
E-Get-ActiveSheet
E-Get-Range
E-Get-Resize
E-Put-Value2
e-get-value


缺少一些关键函数的定义!
回复 支持 1 反对 0

使用道具 举报

发表于 2023-1-9 12:57:54 | 显示全部楼层
本帖最后由 vip-happy 于 2023-1-10 11:44 编辑

现学没学会,写入不成功,麻烦看一下怎么回事

(defun Lst2Range (fn lst / e rg sh tp ws)
  (setq e(vlax-get-object "excel.Application")
        ws(vlax-invoke-method (vlax-get-property e "workbooks") "open"(findfile fn))
        sh(vlax-get-property (vlax-get-property ws "sheets") "item" 1)
        tp(vlax-get-property sh "range" "a1")
        rg(vlax-get-property tp "resize" (length lst) (length(car lst)))
  )(vlax-put-property rg "value2" (hs-Lst2Arr2 lst))
(vlax-invoke-method ws "close" :vlax-true)
)
发表于 2022-10-9 20:44:11 | 显示全部楼层
cchessbd 发表于 2022-10-9 20:36
老大太牛了。但是我看不懂额。。。我测了一下,可以读取,也可以写入。
能不能提供一个调用列子,比方说读 ...

哦,我明白了,这个已经全部读取到newlst表了,现在只需要对newlst表处理就行了。
感谢大大!感谢大大!感谢大大!感谢大大!感谢大大!
发表于 2022-9-6 22:16:10 | 显示全部楼层
很厉害,感谢楼主分享,学习了
发表于 2022-9-6 23:35:42 | 显示全部楼层
支持一下,看着速度确实很快,是用多维度数组做的吗?
发表于 2022-9-7 06:18:43 | 显示全部楼层
能够支持WPS嘛
发表于 2022-9-7 08:25:23 | 显示全部楼层
收藏成功66666
发表于 2022-9-7 08:27:27 | 显示全部楼层
很厉害,感谢楼主分享,学习了
发表于 2022-9-7 10:19:19 | 显示全部楼层
感谢共享资料!
 楼主| 发表于 2022-9-7 11:16:41 | 显示全部楼层

"ket.Application" 应该支持,有些属性方法参数可能不一样
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-27 06:39 , Processed in 0.194790 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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