找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 186|回复: 1

[函数] vlisp操作Excel百万数据

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-3-29 22:41:55 | 显示全部楼层 |阅读模式
;以数组+字典 技术可以实现对数据的增删改查等;这些数据可以转换成lisp数据
;这样就可以用Excel成为你的数据库,速度还是很快的
  1. (defun c:tt1(/ a e)
  2.   (vl-load-com)
  3.   (if(setq e(vlax-get-object "excel.Application"))
  4.     (tt4 e)
  5.   )
  6.   (if(setq a(vlax-get-object "ket.Application"))
  7.     (tt4 a)
  8.   )
  9. )
  10. ; 2022-9-9 和尚777 QQ 1765102082
  11. (defun tt4 (e / arr brr colm dic e i j k key range row sht v)
  12.   (setq time(hs-jsq))
  13.   (setq dic (vlax-get-or-create-object "scripting.dictionary"))
  14.   (setq sht(vlax-get-property e "ActiveSheet"))
  15.   (setq range(vlax-get-property sht "UsedRange"));用户已使用区域
  16.   (setq arr(vlax-variant-value (vlax-get-property range "value" nil)))
  17.   (setq row(vlax-safearray-get-u-bound arr 1))
  18.   (setq colm(vlax-safearray-get-u-bound arr 2))
  19.   (setq brr(ReDim-arr row colm))
  20.   (setq i 0 k 0)
  21.   (repeat row
  22.     (setq i (1+ i))(setq j 0)
  23.     (setq key(vlax-variant-value(vlax-safearray-get-element arr i 1)))
  24.     (if(= :vlax-false (vlax-invoke-method dic "exists" key))
  25.       (progn
  26.         (setq k(1+ k))
  27.         (vlax-invoke-method dic "add" key "1")
  28.         (repeat colm
  29.           (setq j(1+ j))
  30.           (setq v(vlax-variant-value
  31.                  (vlax-safearray-get-element arr i j)))
  32.           (vlax-safearray-put-element brr k j v)
  33.         )
  34.       )
  35.     )
  36.   )
  37.   (vlax-put-property range "value2" brr)
  38.   (vlax-invoke-method dic "removeall")
  39.   (vlax-release-object dic)
  40. (hs-jsq-end time)  (princ)
  41. )
  42. (defun ReDim-arr(r c)
  43.   (vlax-make-safearray
  44.     vlax-vbVariant
  45.     (cons 1 (1+ r))(cons 1 (1+ c))
  46.   )
  47. )
  48. (defun c:tt2 (/ aw e p p1 path s w ws)
  49.   (setq e(vlax-get-object "excel.Application"))
  50.   (vlax-put-property e "DisplayAlerts" :vlax-False);关闭警告弹窗,如果程序运行中断自己想办法恢复哦
  51.   (setq ws(vlax-get-property e "workbooks"))
  52.   (setq aw(vlax-get-property e "activeworkbook"))
  53.   (setq path(vlax-get-property aw "path"))
  54.   (setq p(vlax-invoke
  55.     (vlax-create-object "scripting.filesystemobject" )
  56.     'getfolder path ))
  57.   (vlax-for x (vlax-get-property p "files")
  58.     (setq s(vlax-get-property x "name"))
  59.     (if(not(wcmatch s "*副本*"))
  60.       (progn
  61.         (setq w(vlax-invoke-method ws "open" x))
  62.         (setq p1(vlax-get-property w "name"));a1单元格写入文件名
  63.         (vlax-put-property
  64.           (vlax-get-property
  65.             (vlax-get-property
  66.               (vlax-get-property w "sheets" )
  67.               "item" 1
  68.             )
  69.             "range" "a1"
  70.           )
  71.           "value2" p1
  72.         )
  73.         (vlax-invoke-method w "close" :vlax-true)
  74.       )
  75.     )
  76.   )
  77.   (vlax-put-property e "DisplayAlerts" :vlax-true);恢复警告弹窗
  78. )
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-3-29 22:42:26 | 显示全部楼层
  1. ;xls文件只能存6w多行数据
  2. ;xlsx能存100w行
  3. ;vlisp操作Excel百万数据
  4. ;以数组+字典 技术实现对数据的增删改查,让Excel成为数据库
  5. ;最重要的是这些数据可以转换成lisp数据
  6. ;附件中有测试文件
  7. ;测试前需要先用Excel打开hs777副本.xlsm文件,
  8. ;此例是对A列去重,保留同一行的数据
  9. (defun c:tt1(/ a e)
  10.         (vl-load-com)
  11.         (if(setq e(vlax-get-object "excel.Application"))
  12.                 (tt4 e)
  13.         )
  14.         (if(setq a(vlax-get-object "ket.Application"))
  15.                 (tt4 a)
  16.         )
  17. )
  18. ; 2022-9-9 和尚777 QQ 1765102082
  19. (defun tt4 (e / arr brr colm dic e i j k key range row sht v)
  20.         (setq time(hs-jsq))
  21.         (setq dic (vlax-get-or-create-object "scripting.dictionary"))
  22.         (setq sht(vlax-get-property e "ActiveSheet"))
  23.         (setq range(vlax-get-property sht "UsedRange"));用户已使用区域
  24.         (setq arr(vlax-variant-value (vlax-get-property range "value" nil)))
  25.         (setq row(vlax-safearray-get-u-bound arr 1))
  26.         (setq colm(vlax-safearray-get-u-bound arr 2))
  27.         (setq brr(ReDim-arr row colm))
  28.         (setq i 0 k 0)
  29.         (repeat row
  30.                 (setq i (1+ i))(setq j 0)
  31.                 (setq key(vlax-variant-value(vlax-safearray-get-element arr i 1)))
  32.                 (if(= :vlax-false (vlax-invoke-method dic "exists" key))
  33.                         (progn
  34.                                 (setq k(1+ k))
  35.                                 (vlax-invoke-method dic "add" key "1")
  36.                                 (repeat colm
  37.                                         (setq j(1+ j))
  38.                                         (setq v(vlax-variant-value
  39.                                                                  (vlax-safearray-get-element arr i j)))
  40.                                         (vlax-safearray-put-element brr k j v)
  41.                                 )
  42.                         )
  43.                 )
  44.         )
  45.         (vlax-put-property range "value2" brr)
  46.         (vlax-invoke-method dic "removeall")
  47.         (vlax-release-object dic)
  48. (hs-jsq-end time)        (princ)
  49. )
  50. (defun ReDim-arr(r c)
  51.         (vlax-make-safearray
  52.                 vlax-vbVariant
  53.                 (cons 1 (1+ r))(cons 1 (1+ c))
  54.         )
  55. )
  56. ;批量操作excel文件
  57. (defun c:tt2 (/ aw e p p1 path s w ws)
  58.         (setq e(vlax-get-object "excel.Application"))
  59.         (vlax-put-property e "DisplayAlerts" :vlax-False);关闭警告弹窗,如果程序运行中断自己想办法恢复哦
  60.         (setq ws(vlax-get-property e "workbooks"))
  61.         (setq aw(vlax-get-property e "activeworkbook"))
  62.         (setq path(vlax-get-property aw "path"))
  63.         (setq p(vlax-invoke
  64.                 (vlax-create-object "scripting.filesystemobject" )
  65.                 'getfolder path ))
  66.         (vlax-for x (vlax-get-property p "files")
  67.                 (setq s(vlax-get-property x "name"))
  68.                 (if(not(wcmatch s "*副本*"))
  69.                         (progn
  70.                                 (setq w(vlax-invoke-method ws "open" x))
  71.                                 (setq p1(vlax-get-property w "name"));a1单元格写入文件名
  72.                                 (vlax-put-property
  73.                                         (vlax-get-property
  74.                                                 (vlax-get-property
  75.                                                         (vlax-get-property w "sheets" )
  76.                                                         "item" 1
  77.                                                 )
  78.                                                 "range" "a1"
  79.                                         )
  80.                                         "value2" p1
  81.                                 )
  82.                                 (vlax-invoke-method w "close" :vlax-true)
  83.                         )
  84.                 )
  85.         )
  86.         (vlax-put-property e "DisplayAlerts" :vlax-true);恢复警告弹窗
  87. )
  88. (defun hs-jsq ()(setq $timebe(getvar "millisecs")))
  89. (defun hs-jsq-end (time / tt) ;计时器结束
  90.         (or time (setq time $timebe))
  91.         (setq tt(- (getvar "millisecs") time))
  92.         (print(strcat"程序运行时间为:"(rtos(* 0.00000001(* tt 86400))2 4)"秒"))
  93.         tt
  94. )
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-28 02:36 , Processed in 0.145448 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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