明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3938|回复: 32

[函数] 函数共享-----用数组的方法将lisp的列表转到Excel中

[复制链接]
发表于 2023-1-17 15:02:15 | 显示全部楼层 |阅读模式
本帖最后由 guosheyang 于 2023-1-17 15:16 编辑

       给朋友们分享一个用数组将列表转到Excel的函数,有别于传统的princ方法。其中lst2array列表转数组为本人所写,将数字转为Excel字母列号的函数为李迈克大神的,lst2excel主函数函数部分格式设置内容参考了st788796网友的代码 ,请大家测试并反馈,谢谢!  
;测试代码
(lst2excel(setq lst'( ("第一列""第二列""第三列""第四列""第五列""第六列""第七列""第八列""第九列""第十列" "第十一列""第十二列""第十三列""第十四列""第十五列""第十六列""第十七列""第十八列""第十九列""第二十列" "第二十一列""第二十二列""第二十三列""第二十四列""第二十五列""第二十六列""第二十七列""第二十八列""第二十九列""第三十列")
                       (1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 )
                       (4 5.89 6 4 5.89 6 4 5.89 6 4 5.89 6 4 5.89 6 4 5.89 6 4 5.89 6 4 5.89 6 4 5.89 6 4 5.89 6 )
                       ("11\n2S" 2.67 "3" "11\n2S" 2.67 "3" "11\n2S" 2.67 "3" "11\n2S" 2.67 "3" "11\n2S" 2.67 "3" "11\n2S" 2.67 "3" "11\n2S" 2.67 "3" "11\n2S" 2.67 "3" "11\n2S" 2.67 "3" "11\n2S" 2.67 "3")
                       ("c" 77.45 "t" "c" 77.45 "t" "c" 77.45 "t" "c" 77.45 "t" "c" 77.45 "t" "c" 77.45 "t" "c" 77.45 "t" "c" 77.45 "t" "c" 77.45 "t" "c" 77.45 "t")
                       (7 "pp" "t" 7 "pp" "t" 7 "pp" "t" 7 "pp" "t" 7 "pp" "t" 7 "pp" "t" 7 "pp" "t" 7 "pp" "t" 7 "pp" "t" 7 "pp" "t" ))))

;列表转到excel  
;(lst2excel lst);注意 列表lst的每个子表长度必须相同
;----------------------------------------------------------------
;将数字转为Excel表的字母列号(数字转字母)
;; Number to Column  -  Lee Mac           
;; n - [int] positive non-zero integer   
;(LM:num->col 800) "ABC"
(defun LM:num->col( n )
    (if (< n 27)
        (chr (+ 64 n))
        (strcat (LM:num->col(/ (1- n) 26)) (LM:num->col (1+ (rem (1- n) 26))))
    )
)
;----------------------------------------------------------------
;列表转安全数组

(defun lst2array(lst / ARRAY BC ZBC)

  (setq bc(length lst) zbc(length (car lst)));表长 子表长

  (setq array(vlax-make-safearray vlax-vbvariant (cons 0 (1- bc))(cons 1 zbc)))

  (vlax-safearray-fill array lst);(vlax-safearray->list array)

)

(defun lst2excel (lst / EXCEL RANGE ROW SHT WKS)

(if(setq excel(vlax-get-or-create-object "Excel.Application"));改成KET就可以专门针对WPS

    (progn

      (vlax-put excel 'visible 1)

      (setq wks (vlax-get excel 'Workbooks))

      (if (zerop (vlax-get wks 'Count))

        (vlax-invoke wks 'add)

      )

      (setq sht (vlax-get excel 'ActiveSheet))

      (if lst  

        (progn

          (setq lk(length(car lst)))

          (setq rn(LM:num->col lk))

          (setq     

                row (length lst)

                range (vlax-get-property

                        sht

                        'Range

                        (strcat "A1:" rn (itoa row))

                      )

          )

          (vlax-put-property range 'HorizontalAlignment 3)  

          (vlax-put-property

            range

            'Value2

            (lst2array lst)

          )

          (vlax-invoke (vlax-get range 'Columns) 'AutoFit)

        )

      )

    )

  )

  (vlax-release-object excel)

  (princ)

)

评分

参与人数 1明经币 +1 收起 理由
VBALISPER + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2023-1-18 08:49:08 | 显示全部楼层
e2002 发表于 2023-1-17 17:32
"lst的每个子表长度必须相同"

这个是不必要的,实际上二维数组list,可以按列/按行的方式来写入xlsx文件 ...

老大  定义数组   那样好像不行哦

点评

实际上之前因为一个需求,顺便写了一个AutoLISP操作excel的函数库(有参考Koz提供的源码,再次对Koz表示感谢!)。  发表于 2023-1-18 09:20
 楼主| 发表于 2023-1-29 10:46:06 | 显示全部楼层
yshf 发表于 2023-1-29 09:11
(LM:num->col 800) ;应该返回 "ADT"
(LM:num->col 731) ;则返回 "ABC"

是这样的  好像没问题
发表于 2023-1-17 17:32:45 | 显示全部楼层
"lst的每个子表长度必须相同"

这个是不必要的,实际上二维数组list,可以按列/按行的方式来写入xlsx文件的cell,至于对齐方式,给定相应的参数即可。
发表于 2023-1-17 16:17:54 | 显示全部楼层
支持一下看看
发表于 2023-1-17 18:01:04 | 显示全部楼层
支持一下看看
发表于 2023-1-17 21:29:02 | 显示全部楼层

支持一下看看
发表于 2023-1-17 22:41:22 | 显示全部楼层
回帖看全景
发表于 2023-1-17 22:50:22 | 显示全部楼层
支持一下看看!!!!!
发表于 2023-1-18 07:41:25 | 显示全部楼层
支持一下看看
发表于 2023-1-18 08:44:05 | 显示全部楼层
看本帖隐藏内容
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 10:17 , Processed in 0.209524 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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