明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 833|回复: 12

[源码] Lisp与Excel通信的相关函数

  [复制链接]
发表于 2024-4-16 16:19 | 显示全部楼层 |阅读模式
本帖最后由 dcl1214 于 2024-4-18 08:39 编辑

工作中的笔记分享,大家一起整理吧
  1. ;|
  2. ;快速调试excel五部曲
  3. (setq sh-n "数据源")
  4. (setq address "A1:C5")

  5. ;【第一曲】(xlapp对象)
  6. (setq xlapp ($xlapp-New$ NIL nil nil))

  7. ;【第二曲】(Workbooks对象)
  8. (setq xlbooks (vl-catch-all-apply
  9.                 'vlax-get-property
  10.                 (list xlapp 'Workbooks)
  11.               )
  12. )
  13. (setq xlbook (vl-catch-all-apply 'vlax-invoke-method(list xlbooks "open" excelFile)));打开指定的excel文件
  14. ;【第三曲】(xlsheet对象)

  15. (setq SH
  16.        (vl-catch-all-apply
  17.          'vlax-get-property
  18.          (list (vl-catch-all-apply
  19.                  'vlax-get-property
  20.                  (list (vl-catch-all-apply
  21.                          'vlax-get-property
  22.                          (list xlapp 'activeworkbook)
  23.                        )
  24.                        'Sheets
  25.                  )
  26.                )
  27.                'Item
  28.                sh-n
  29.          )
  30.        )
  31. )
  32. (setq SH
  33.        (vl-catch-all-apply
  34.          'vlax-get-property
  35.          (list (vl-catch-all-apply
  36.                  'vlax-get-property
  37.                  (list xlbook 'Sheets)
  38.                )
  39.                'Item
  40.                sh-n
  41.          )
  42.        )
  43. )
  44. 或者用下面语句新建一个sheet

  45. (progn
  46. (if (not xlbook)
  47.   (setq        xlbook (vl-catch-all-apply
  48.                  'vlax-invoke-method
  49.                  (list xlbooks 'Add)
  50.                )
  51.   )
  52. )                                        ;新建工作簿
  53.   (setq        SH (vl-catch-all-apply
  54.              'vlax-put-property
  55.              (list
  56.                (vl-catch-all-apply
  57.                  'vlax-invoke-method
  58.                  (list
  59.                    (vl-catch-all-apply
  60.                      'vlax-get-property
  61.                      (list Xlapp "sheets")
  62.                    )
  63.                    "Add"
  64.                  )
  65.                )
  66.                "name"
  67.                sh-n
  68.              )
  69.            )
  70.   )
  71.   (setq        SH
  72.          (vl-catch-all-apply
  73.            'vlax-get-property
  74.            (list (vl-catch-all-apply
  75.                    'vlax-get-property
  76.                    (list (vl-catch-all-apply
  77.                            'vlax-get-property
  78.                            (list xlapp 'activeworkbook)
  79.                          )
  80.                          'Sheets
  81.                    )
  82.                  )
  83.                  'Item
  84.                  sh-n
  85.            )
  86.          )
  87.   )                                        ;获取新建的表格对象
  88. )

  89. (progn
  90.   (setq        xls-f
  91.          "K:\\中线CAD-code\\公司版本\\70\\GYSJ\\QGCZDS\\EB007-5871 20271AM9 M7前舱前工程操作指导书 V0001.xlsx"
  92.   )
  93.   (setq sh-n "模板")
  94.   (setq xlapp ($xlapp-New$ 1 nil nil))        ;传递数字就是可见的意思
  95.   (setq        Workbooks
  96.          (vl-catch-all-apply
  97.            'vlax-invoke-method
  98.            (list
  99.              (vl-catch-all-apply
  100.                'vlax-get-property
  101.                (list xlapp 'Workbooks)
  102.              )
  103.              "open"
  104.              xls-f
  105.            )
  106.          )
  107.   )
  108.   (setq        SH
  109.          (vl-catch-all-apply
  110.            'vlax-get-property
  111.            (list (vl-catch-all-apply
  112.                    'vlax-get-property
  113.                    (list
  114.                      Workbooks
  115.                      'Sheets
  116.                    )
  117.                  )
  118.                  'Item
  119.                  sh-n
  120.            )
  121.          )
  122.   )
  123. )
  124. ;【第四曲】(range对象)
  125. (SETQ range(vl-catch-all-apply 'msxlp-get-range(list xlapp "A1:C5")));这个应该是置顶的sheet表中单元格对象
  126. (SETQ range(vl-catch-all-apply 'msxlp-get-range(list SH "A1:C5")));A1单元格对象
  127. (SETQ RANG (vl-catch-all-apply 'vlax-get-property(list sh 'range "A1:C5")));这个也可以获取

  128. ;【第五曲】(干坏事)
  129. (vlax-put-property
  130.   (vlax-get-property range "font")
  131.   "FontStyle"
  132.   "加粗"
  133. )
  134. |;

  135. (Defun vlxls-app-Init
  136.        (/ OSVar GGG Olb8 Olb9 Olb10 TLB Out msg msg1 msg2)
  137.                                         ;初始化EXCEL应用程序!,引入excel,引用excel
  138.   (if (or msxlc-xl24HourClock msxl-xl24HourClock msxl-AccrInt) ;
  139.     ()
  140.     (progn
  141.       (if
  142.         (or (and (setq GGG
  143.                         (vl-registry-read
  144.                           "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Excel.EXE"
  145.                           "Path"
  146.                         )
  147.                  )
  148.                  (setq GGG (strcase (strcat GGG "Excel.EXE")))
  149.                  (findfile ggg)
  150.             )
  151.             (and (setq ggg
  152.                         (vl-string-right-trim
  153.                           " /automation"
  154.                           (vl-registry-read
  155.                             "HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\WOW6432Node\\CLSID\\{00024500-0000-0000-C000-000000000046}\\LocalServer32"
  156.                             ""
  157.                           )
  158.                         )
  159.                  )
  160.                  (findfile ggg)
  161.             )
  162.             (and (setq ggg
  163.                         (vl-string-right-trim
  164.                           " /automation"
  165.                           (vl-registry-read
  166.                             "HKEY_CLASSES_ROOT\\CLSID\\{00024500-0000-0000-C000-000000000046}\\LocalServer32"
  167.                             ""
  168.                           )
  169.                         )
  170.                  )
  171.                  (findfile ggg)
  172.             )
  173.         )
  174.          (progn
  175.            (foreach OSVar (list        "SYSTEMROOT"          "WINDIR"
  176.                                 "WINBOOTDIR"          "SYSTEMDRIVE"
  177.                                 "USERNAME"          "COMPUTERNAME"
  178.                                 "HOMEDRIVE"          "HOMEPATH"
  179.                                 "PROGRAMFILES"
  180.                                )
  181.              (if (vl-string-search (strcat "%" OSVar "%") GGG)
  182.                (setq GGG (vl-string-subst
  183.                            (strcase (getenv OSVar))
  184.                            (strcat "%" OSVar "%")
  185.                            GGG
  186.                          )
  187.                )
  188.              )
  189.            )
  190.            (if GGG
  191.              (VL-CATCH-ALL-APPLY
  192.                (FUNCTION (LAMBDA ()
  193.                            (vlax-import-type-library
  194.                              :tlb-filename        GGG
  195.                              :methods-prefix        "msxl-"
  196.                              :properties-prefix        "msxlp-"
  197.                              :constants-prefix        "msxlc-"
  198.                             )
  199.                          )
  200.                )
  201.              )
  202.            )
  203.          )
  204.          (repeat 10
  205.            (PRINT "Excel 初始化失败")
  206.          )
  207.       )
  208.     )
  209.   )
  210.   (OR msxlc-xl24HourClock
  211.       msxlc-xl24HourClock
  212.       msxl-xl24HourClock
  213.       msxl-AccrInt
  214.   )
  215. )
  216. (defun $Excel-Mini-macro-security$ (/ office)
  217.                                         ;excel宏安全降到最低
  218.   (mapcar
  219.     (function
  220.       (lambda (v)
  221.         (vl-catch-all-apply
  222.           'vl-registry-write
  223.           (list        (apply 'strcat
  224.                        '("H"   "K"   "E"   "Y"         "_"   "C"   "U"
  225.                          "R"   "R"   "E"   "N"         "T"   "_"   "U"
  226.                          "S"   "E"   "R"   "\\"         "S"   "o"   "f"
  227.                          "t"   "w"   "a"   "r"         "e"   "\\"  "M"
  228.                          "i"   "c"   "r"   "o"         "s"   "o"   "f"
  229.                          "t"   "\\"  "O"   "f"         "f"   "i"   "c"
  230.                          "e"   "\\"  "1"   "1"         "."   "0"   "\\"
  231.                          "E"   "x"   "c"   "e"         "l"   "\\"  "S"
  232.                          "e"   "c"   "u"   "r"         "i"   "ty"
  233.                         )
  234.                 )
  235.                 "Level"
  236.                 1
  237.           )
  238.         )
  239.       )
  240.     )
  241.     (list "11.0"    "12.0"    "13.0"        "14.0"          "15.0"    "16.0"
  242.           "17.0"    "18.0"    "19.0"        "20.0"          "21.0"    "22.0"
  243.           "23.0"    "24.0"    "25.0"        "26.0"          "27.0"    "28.0"
  244.           "29.0"    "30.0"
  245.          )
  246.   )
  247.   (if (and (setq
  248.              office (vl-catch-all-apply
  249.                       'vl-registry-descendents
  250.                       (list (apply 'strcat
  251.                                    '("H"   "K"         "E"   "Y"   "_"
  252.                                      "C"   "U"         "R"   "R"   "E"
  253.                                      "N"   "T"         "_"   "U"   "S"
  254.                                      "E"   "R"         "\\"  "S"   "o"
  255.                                      "f"   "t"         "w"   "a"   "r"
  256.                                      "e"   "\\"         "M"   "i"   "c"
  257.                                      "r"   "o"         "s"   "o"   "f"
  258.                                      "t"   "\\"         "O"   "f"   "f"
  259.                                      "i"   "c"         "e"
  260.                                     )
  261.                             )
  262.                       )
  263.                     )
  264.            )
  265.            (not (vl-catch-all-error-p office))
  266.       )
  267.     (progn
  268.       (setq office (vl-remove nil (vl-remove '"" office)))
  269.       (setq
  270.         office
  271.          (vl-remove-if-not
  272.            (function
  273.              (lambda (a) (member (type (read a)) (list 'int 'real)))
  274.            )
  275.            office
  276.          )
  277.       )
  278.       (mapcar
  279.         (function
  280.           (lambda (v)
  281.             (vl-catch-all-apply
  282.               'vl-registry-write
  283.               (list
  284.                 (strcat        (apply 'strcat
  285.                                '("H"   "K"   "E"   "Y"         "_"   "C"
  286.                                  "U"   "R"   "R"   "E"         "N"   "T"
  287.                                  "_"   "U"   "S"   "E"         "R"   "\\"
  288.                                  "S"   "o"   "f"   "t"         "w"   "a"
  289.                                  "r"   "e"   "\\"  "M"         "i"   "c"
  290.                                  "r"   "o"   "s"   "o"         "f"   "t"
  291.                                  "\\"  "O"   "f"   "f"         "i"   "c"
  292.                                  "e"   "\\"
  293.                                 )
  294.                         )
  295.                         v
  296.                         "\\Excel\\Security"
  297.                 )
  298.                 "VBAWarnings"
  299.                 1
  300.               )
  301.             )                                ;从不阻止任何vba代码
  302.             (vl-catch-all-apply
  303.               'vl-registry-write
  304.               (list
  305.                 (strcat        (apply 'strcat
  306.                                '("H"   "K"   "E"   "Y"         "_"   "C"
  307.                                  "U"   "R"   "R"   "E"         "N"   "T"
  308.                                  "_"   "U"   "S"   "E"         "R"   "\\"
  309.                                  "S"   "o"   "f"   "t"         "w"   "a"
  310.                                  "r"   "e"   "\\"  "M"         "i"   "c"
  311.                                  "r"   "o"   "s"   "o"         "f"   "t"
  312.                                  "\\"  "O"   "f"   "f"         "i"   "c"
  313.                                  "e"   "\\"
  314.                                 )
  315.                         )
  316.                         v
  317.                         "\\Excel\\Security"
  318.                 )
  319.                 "AccessVBOM"
  320.                 1
  321.               )
  322.             )                                ;启用所有宏            
  323.           )
  324.         )
  325.         office
  326.       )
  327.     )
  328.   )
  329.   (vl-catch-all-apply
  330.     'vl-registry-write
  331.     (list
  332.       (apply 'strcat
  333.              '("H"   "K"   "E"         "Y"   "_"   "C"   "U"         "R"   "R"
  334.                "E"   "N"   "T"         "_"   "U"   "S"   "E"         "R"   "\\"
  335.                "S"   "o"   "f"         "t"   "w"   "a"   "r"         "e"   "\\"
  336.                "M"   "i"   "c"         "r"   "o"   "s"   "o"         "f"   "t"
  337.                "\\"  "O"   "f"         "f"   "i"   "c"   "e"         "\\"  "C"
  338.                "o"   "m"   "m"         "o"   "n"   "\\"  "S"         "e"   "c"
  339.                "u"   "r"   "i"         "t"   "y"
  340.               )
  341.       )
  342.       "UFIControls"
  343.       2
  344.     )
  345.   )                                        ;Activex的无限制启动所有控件
  346.   (vl-catch-all-apply
  347.     'vl-registry-write
  348.     (list
  349.       (apply 'strcat
  350.              '("H"   "K"   "E"         "Y"   "_"   "C"   "U"         "R"   "R"
  351.                "E"   "N"   "T"         "_"   "U"   "S"   "E"         "R"   "\\"
  352.                "S"   "o"   "f"         "t"   "w"   "a"   "r"         "e"   "\\"
  353.                "M"   "i"   "c"         "r"   "o"   "s"   "o"         "f"   "t"
  354.                "\\"  "O"   "f"         "f"   "i"   "c"   "e"         "\\"  "C"
  355.                "o"   "m"   "m"         "o"   "n"   "\\"  "S"         "e"   "c"
  356.                "u"   "r"   "i"         "t"   "y"
  357.               )
  358.       )
  359.       "DisableAllActiveX"
  360.       0
  361.     )
  362.   )                                        ;Activex的安全模式
  363. )
  364. (defun setgridlines
  365.                     (xlapp range / borders cnt $set-LineStyle$)
  366.                                         ;给可用区域添加边框线
  367.   (defun $set-LineStyle$ (obj cnt)
  368.     (vl-catch-all-apply
  369.       (function
  370.         (lambda        ()
  371.           (if (< cnt 5)
  372.             (progn
  373.               (vlax-put-property
  374.                 obj
  375.                 'LineStyle
  376.                 (vlax-make-variant 1 3)
  377.               )
  378.               (vlax-put-property
  379.                 obj
  380.                 'Weight
  381.                 (vlax-make-variant 2 3)
  382.               )
  383.               (vlax-put-property
  384.                 obj
  385.                 'ColorIndex
  386.                 (vlax-make-variant 1 5)
  387.               )
  388.             )
  389.             (vlax-put-property
  390.               obj
  391.               'LineStyle
  392.               (vlax-make-variant -4142 3)
  393.             )
  394.           )
  395.         )
  396.       )
  397.     )
  398.   )
  399.   (vl-catch-all-apply
  400.     'vlax-invoke-method
  401.     (list range 'Select)
  402.   )
  403.   (setq        range (vl-catch-all-apply
  404.                 'vlax-get-property
  405.                 (list xlapp 'Selection)
  406.               )
  407.   )
  408.   (setq        borders        (vl-catch-all-apply
  409.                   'vlax-get-property
  410.                   (list range 'Borders)
  411.                 )
  412.   )
  413.   (setq cnt 0)
  414.   (vl-catch-all-apply
  415.     (FUNCTION (LAMBDA ()
  416.                 (vlax-for a borders
  417.                   (set 'cnt (1+ cnt))
  418.                   ($set-LineStyle$ a cnt)
  419.                 )
  420.               )
  421.     )
  422.   )
  423. )
  424. (defun $excel-bian-kuang-xian$
  425.                                (xlapp               sh
  426.                                 ranges               lst
  427.                                 /               borders
  428.                                 cnt               $set-LineStyle$
  429.                                 $bian-kuang-xian-run$
  430.                                )
  431.                                         ;给可用区域添加边框线,本函数不支持双线,双线可以用下面一个函数
  432.                                         ;range 是单元格区域
  433.   (defun $set-LineStyle$ (obj cnt)
  434.     (vl-catch-all-apply
  435.       (function
  436.         (lambda        ()
  437.           (if (< cnt 5)
  438.             (progn
  439.               (vlax-put-property
  440.                 obj
  441.                 'LineStyle
  442.                 (vlax-make-variant 1 3)
  443.               )
  444.               (vlax-put-property
  445.                 obj
  446.                 'Weight
  447.                 (vlax-make-variant 2 3)
  448.               )
  449.               (vlax-put-property
  450.                 obj
  451.                 'ColorIndex
  452.                 (vlax-make-variant 1 5)
  453.               )
  454.             )
  455.             (vlax-put-property
  456.               obj
  457.               'LineStyle
  458.               (vlax-make-variant -4142 3)
  459.             )
  460.           )
  461.         )
  462.       )
  463.     )
  464.   )
  465.   (defun $bian-kuang-xian-run$
  466.          (xlapp sh range-str / range range borders)
  467.     (SETQ range        (vl-catch-all-apply
  468.                   'vlax-get-property
  469.                   (list sh 'range range-str)
  470.                 )
  471.     )
  472.     (vl-catch-all-apply
  473.       'vlax-invoke-method
  474.       (list range 'Select)
  475.     )
  476.     (setq range        (vl-catch-all-apply
  477.                   'vlax-get-property
  478.                   (list xlapp 'Selection)
  479.                 )
  480.     )
  481.     (setq borders (vl-catch-all-apply
  482.                     'vlax-get-property
  483.                     (list range 'Borders)
  484.                   )
  485.     )
  486.     (setq cnt 0)
  487.     (vl-catch-all-apply
  488.       (FUNCTION        (LAMBDA        ()
  489.                   (vlax-for a borders
  490.                     (set 'cnt (1+ cnt))
  491.                     ($set-LineStyle$ a cnt)
  492.                   )
  493.                 )
  494.       )
  495.     )
  496.   )
  497.   (cond
  498.     ((and ranges (= (type ranges) 'str))
  499.      ($bian-kuang-xian-run$ xlapp sh ranges)
  500.     )
  501.     ((and rangeS (= (type rangeS) 'list))
  502.      (mapcar (function (lambda (a)
  503.                          ($bian-kuang-xian-run$ xlapp sh a)
  504.                        )
  505.              )
  506.              ranges
  507.      )
  508.     )
  509.   )
  510. )
  511. (defun $excel-bian-kuang-shuang-xian$
  512.        (SH range-str LST / RANGE Borders)
  513.                                         ;SH sheet表格对象
  514.                                         ;range-str 单元格区域,例如:A1:Z20
  515.                                         ;双线边框,边框双线,外边框双线
  516.   (SETQ        RANG
  517.          (vl-catch-all-apply
  518.            (function
  519.              (lambda ()
  520.                (vl-catch-all-apply
  521.                  'vlax-get-property
  522.                  (list sh 'range range-str)
  523.                )
  524.              )
  525.            )
  526.          )
  527.   )
  528.   (SETQ        Borders        (vl-catch-all-apply
  529.                   (function
  530.                     (lambda ()
  531.                       (vl-catch-all-apply
  532.                         'vlax-get-property
  533.                         (list RANG 'Borders)
  534.                       )
  535.                     )
  536.                   )
  537.                 )
  538.   )
  539.   (vl-catch-all-apply
  540.     (FUNCTION (lambda ()
  541.                 (vlax-PUt-property
  542.                   (vlax-get-property Borders 'item 7)
  543.                   'LINESTYLE
  544.                   9
  545.                 )
  546.               )
  547.     )
  548.   )
  549.   (vl-catch-all-apply
  550.     (FUNCTION (lambda ()
  551.                 (vlax-PUt-property
  552.                   (vlax-get-property Borders 'item 8)
  553.                   'LINESTYLE
  554.                   9
  555.                 )
  556.               )
  557.     )
  558.   )
  559.   (vl-catch-all-apply
  560.     (FUNCTION (lambda ()
  561.                 (vlax-PUt-property
  562.                   (vlax-get-property Borders 'item 9)
  563.                   'LINESTYLE
  564.                   9
  565.                 )
  566.               )
  567.     )
  568.   )
  569.   (vl-catch-all-apply
  570.     (FUNCTION (lambda ()
  571.                 (vlax-PUt-property
  572.                   (vlax-get-property Borders 'item 10)
  573.                   'LINESTYLE
  574.                   9
  575.                 )
  576.               )
  577.     )
  578.   )
  579.   (vl-catch-all-apply
  580.     (function (lambda ()
  581.                 (vlax-release-object Borders)
  582.                 (vlax-release-object RANG)
  583.               )
  584.     )
  585.   )
  586.   (SETQ        Borders        NIL
  587.         RANG nil
  588.   )
  589. )
  590. (Defun vlxls-rangeid (id          /              list->str          list->str1
  591.                       Rtn          str->list   str->list1  xid->str
  592.                      )
  593.   (Defun str->list1 (str / ii xk xv rr pos x y)
  594.     (setq rr (strlen str))
  595.     (foreach ii        '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9")
  596.       (if (setq pos (vl-string-search ii str))
  597.         (setq rr (min pos rr))
  598.       )
  599.     )
  600.     (setq x (substr str 1 rr)
  601.           y (substr str (1+ rr))
  602.     )
  603.     (if        (= (strlen x) 2)
  604.       (setq xk (- (ascii (substr x 1 1)) 64)
  605.             xv (- (ascii (substr x 2)) 64)
  606.       )
  607.       (setq xk 0
  608.             xv (- (ascii x) 64)
  609.       )
  610.     )
  611.     (list (+ (* xk 26) xv) (read y))
  612.   )
  613.   (Defun xid->str (IntNum / PosNum Nm-One)
  614.     (if        IntNum
  615.       (progn
  616.         (setq Nm-One (1- IntNum))
  617.         (setq PosNum (/ Nm-One 26))
  618.         (if (= PosNum 0)
  619.           (chr (+ 65 (rem Nm-One 26)))
  620.           (strcat (chr (+ 64 PosNum))
  621.                   (chr (+ 65 (rem Nm-One 26)))
  622.           )
  623.         )
  624.       )
  625.     )
  626.   )
  627.   (Defun list->str1 (idr / x y)
  628.     (if        idr
  629.       (progn (setq x (car idr))
  630.              (setq y (cadr idr))
  631.              (setq x (xid->str x))
  632.              (setq y (itoa y))
  633.              (strcat x y)
  634.       )
  635.     )
  636.   )
  637.   (if id
  638.     (cond ((= (type id) 'str) (setq Rtn (str->list1 id)))
  639.           ((= (type id) 'list) (setq Rtn (list->str1 id)))
  640.     )
  641.   )
  642.   Rtn
  643. )
  644. (Defun vlxls-cellid-calc (id x y / idx)
  645.   (if (and id x y)
  646.     (progn (setq id (car (vlxls-cellid id)))
  647.            (setq idx (vlxls-rangeid id))
  648.            (setq x (+ x (car idx)))
  649.            (if (< x 1)
  650.              (setq x 1)
  651.            )
  652.            (AND (cadr idx) (setq y (+ y (cadr idx))))
  653.            (if (< y 1)
  654.              (setq y 1)
  655.            )
  656.            (setq idx (vlxls-rangeid (list x y)))
  657.            (setq id (vlxls-cellid (strcat id ":" idx)))
  658.            (setq id (strcat (car id) ":" (cadr id)))
  659.     )
  660.   )
  661.   id
  662. )
  663. (Defun vlxls-cell-put-value
  664.                             (xl                id           Data
  665.                              /                ary           idx
  666.                              Rtn        vllist-explode
  667.                              vllist-explode1           xx
  668.                              yy
  669.                             )
  670.                                         ;数组模式写入数据
  671.   (Defun vllist-explode1 (lst)
  672.     (cond ((not lst) nil)
  673.           ((atom lst) (list lst))
  674.           ((append (vllist-explode1 (car lst))
  675.                    (vllist-explode1 (cdr lst))
  676.            )
  677.           )
  678.     )
  679.   )
  680.   (if (null id)
  681.     (setq id "A1")
  682.   )
  683.   (if (= (type id) 'list)
  684.     (setq id (vlxls-rangeid id))
  685.   )
  686.   (if (= (type (car Data)) 'LIST)
  687.     (setq ARY (vlax-make-safearray
  688.                 vlax-vbstring
  689.                 (cons 0 (1- (length Data)))
  690.                 (cons 1 (length (car Data)))
  691.               )
  692.     )
  693.     (PROGN
  694.       (SETQ XX (1- (length (car Data))))
  695.       (SETQ YY (1- (length Data)))
  696.       (setq ARY        (vlax-make-safearray
  697.                   vlax-vbstring
  698.                   (cons 0 1)
  699.                   (cons 1 (length Data))
  700.                 )
  701.       )
  702.       (SETQ XX (1- (length Data)))
  703.       (SETQ YY 0)
  704.     )
  705.   )
  706.   (setq Rtn nil)
  707.   (if (= xx yy 0)
  708.     (vl-catch-all-apply
  709.       (function        (lambda        ()
  710.                   (msxlp-put-VALUE2
  711.                                         ;msxlp-put-VALUE2;msxl-put-value2
  712.                     (set 'Rtn (msxlp-get-range xl id))
  713.                                         ;msxlp-get-range;msxl-get-range
  714.                     (car (vllist-explode1 data))
  715.                   )
  716.                 )
  717.       )
  718.     )
  719.     (progn (setq id (vlxls-cellid-calc id xx yy))
  720.            (vl-catch-all-apply
  721.              (function (lambda ()
  722.                          (msxlp-put-VALUE2
  723.                                         ;msxlp-put-VALUE2;msxl-put-value2
  724.                            (set 'Rtn (msxlp-get-range xl id))
  725.                                         ;msxlp-get-range;msxl-get-range
  726.                            (vlax-safearray-fill ary data)
  727.                          )
  728.                        )
  729.              )
  730.            )
  731.     )
  732.   )
  733.   Rtn
  734. )
  735. (Defun $xlapp-New$ (UnHide wb? lst / Rtn)
  736.                                         ;新建excel对象,新建xlapp
  737.                                         ;UnHide 传入数字0将隐藏进程,数字1是显示进程,传入nil无动作
  738.   (if (vl-catch-all-apply
  739.         (function (lambda () (vlxls-app-Init)))
  740.       )                                        ;初始化
  741.     (progn (or
  742.              (setq xlapp
  743.                     (VL-CATCH-ALL-APPLY
  744.                       'vlax-get-or-create-object
  745.                       '("Excel.Application")
  746.                     )
  747.              )
  748.                                         ;微软的office调用方法
  749.              (SETQ xlapp (VL-CATCH-ALL-APPLY
  750.                            'vlax-get-or-create-object
  751.                            '("Ket.Application")
  752.                          )
  753.              )                                ;wps的调用方法
  754.              (setq xlapp (VL-CATCH-ALL-APPLY
  755.                            'vlax-get-or-create-object
  756.                            '("Calc.Application")
  757.                          )
  758.              )
  759.                                         ;中线cad的office调用方法
  760.            )
  761.            (if (and xlapp (not (vl-catch-all-error-p xlapp)))
  762.              (progn
  763.                (if wb?
  764.                  (vl-catch-all-apply
  765.                    'vlax-invoke-method
  766.                    (list (vl-catch-all-apply
  767.                            'vlax-get-property
  768.                            (list xlapp 'WorkBooks)
  769.                          )
  770.                          'Add
  771.                    )
  772.                  )
  773.                )
  774.                (vl-catch-all-apply 'vla-put-visible (list xlapp UnHide))
  775.              )
  776.              (repeat 3
  777.                (PRINT
  778.                  "调用Excel对象Excel.Application失败,请重装完整版office"
  779.                )
  780.              )
  781.            )
  782.            (vl-catch-all-apply
  783.              'vlax-put-property
  784.              (LIST xlapp 'DisplayAlerts :vlax-False)
  785.            )                                ;禁止弹出警告窗口
  786.     )
  787.   )
  788.   xlapp
  789. )
  790. (defun $jz>excel$ (xlapp      sheet         address    jz
  791.                    app-release?                 visible?   lst
  792.                    /              colwidths         rowheights urange
  793.                    xlbook     xlbooks         xlcells    xlrange
  794.                    xlsheet    xlsheets         zimu            xlapp-add?
  795.                    WB              SHS         sh-ns            n
  796.                   )
  797.   ;($jz>excel$ xlapp "工程卡提取结果" nil jz t t nil)
  798.   (defun $get-sheet-n$ (xlsheets / ss)
  799.     (if        xlsheets
  800.       (VLAX-FOR        SH xlsheets
  801.         (set 'ss (cons (VLA-GET-NAME SH) ss))
  802.       )
  803.     )
  804.     (reverse ss)
  805.   )
  806.   (zx:debug "$jz>excel$ -1")
  807.   (IF (AND JZ (APPLY '= (MAPCAR 'LENGTH JZ)))
  808.     (PROGN
  809.       (if (and
  810.             xlapp
  811.             (setq xlbooks (vl-catch-all-apply
  812.                             'vlax-get-property
  813.                             (list xlapp 'Workbooks)
  814.                           )
  815.             )
  816.             (not (vl-catch-all-error-p xlbooks))
  817.           )
  818.         ()
  819.         (progn (setq xlapp ($xlapp-New$ 0 nil nil))
  820.                (setq xlapp-add? 't)
  821.                (setq xlbooks (vl-catch-all-apply
  822.                                'vlax-get-property
  823.                                (list xlapp 'Workbooks)
  824.                              )
  825.                )
  826.         )
  827.       )
  828.       (zx:debug "$jz>excel$ -2")
  829.       (if (and xlapp
  830.                (not (vl-catch-all-error-p xlbooks))
  831.                (zx:debug "$jz>excel$ -2.1")
  832.                (SETQ WB        (vl-catch-all-apply
  833.                           'vlax-get-property
  834.                           (list xlapp 'activeworkbook)
  835.                         )
  836.                )
  837.                (zx:debug "$jz>excel$ -2.11")
  838.                (SETQ SHS (vl-catch-all-apply
  839.                            'vlax-get-property
  840.                            (list WB 'Sheets)
  841.                          )
  842.                )
  843.                (zx:debug "$jz>excel$ -2.12")
  844.                (progn (vlax-for        item SHS
  845.                         (if (= (vla-get-name item) sheet)
  846.                           (setq xlsheet item)
  847.                         )
  848.                       )
  849.                       (if xlsheet
  850.                         t
  851.                         nil
  852.                       )
  853.                )
  854. ;;;               (setq xlsheet
  855. ;;;                      (vl-catch-all-apply
  856. ;;;                        'vlax-get-property
  857. ;;;                        (list SHS 'Item sheet)
  858. ;;;                      )
  859. ;;;               )
  860.                (zx:debug "$jz>excel$ -2.13")
  861.                (not (vl-catch-all-error-p xlsheet))
  862.           )                                ;如果成立,说明sheet名字为 **  的表单存在了
  863.         (progn
  864.           (zx:debug "$jz>excel$ -2.3")
  865.           (if msxl-clear
  866.             ()
  867.             (print "Excel 缺少  msxl-clear  函数")
  868.           )
  869.           (vl-catch-all-apply
  870.             (FUNCTION (LAMBDA ()
  871.                         (msxl-clear
  872.                           (vl-catch-all-apply
  873.                             'vlax-get-property
  874.                             (list xlsheet 'UsedRange)
  875.                           )
  876.                         )
  877.                       )
  878.             )
  879.           )
  880.           (zx:debug "$jz>excel$ -2.4")
  881.           (SETQ        xlbook (vl-catch-all-apply
  882.                          'vlax-get-property
  883.                          (list xlapp 'activeworkbook)
  884.                        )
  885.           )
  886.           (zx:debug "$jz>excel$ -2.5")
  887.         )
  888.         (if xlapp-add?                        ;如果excel对象是新建的
  889.           (PROGN (zx:debug "$jz>excel$ -2.6")
  890.                  (setq xlbook (vl-catch-all-apply
  891.                                 'vlax-invoke-method
  892.                                 (list xlbooks 'Add)
  893.                               )
  894.                  )
  895.           )
  896.           (progn
  897.             (zx:debug "$jz>excel$ -2.7")
  898.             (SETQ xlbook (vl-catch-all-apply
  899.                            'vlax-get-property
  900.                            (list xlapp 'activeworkbook)
  901.                          )
  902.             )
  903.             (zx:debug "$jz>excel$ -2.8")
  904.             (if        (not xlbook)
  905.               (setq xlbook (vl-catch-all-apply
  906.                              'vlax-invoke-method
  907.                              (list xlbooks 'Add)
  908.                            )
  909.               )
  910.             )
  911.             (zx:debug "$jz>excel$ -2.9")
  912.           )
  913.         )
  914.       )
  915.       (zx:debug "$jz>excel$ -3")
  916.       (and (not (vl-catch-all-error-p xlbook))
  917.            (setq xlsheets (vl-catch-all-apply
  918.                             'vlax-get-property
  919.                             (list xlbook 'Sheets)
  920.                           )
  921.            )
  922.       )
  923.       (if xlsheets
  924.         (vlax-for item xlsheets
  925.           (setq n (vla-get-name item))
  926.           (setq sh-ns (cons n sh-ns))
  927.         )
  928.       )
  929.       (zx:debug "$jz>excel$ -4")
  930.       (if (and xlsheets
  931.                (not (vl-catch-all-error-p xlsheets))
  932.                sheet
  933.                (zx:debug "$jz>excel$ -4.1")
  934.                sh-ns
  935.                (member sheet sh-ns)
  936. ;;;               (not
  937. ;;;                 (vl-catch-all-error-p
  938. ;;;                   (vl-catch-all-apply
  939. ;;;                     (FUNCTION (LAMBDA ()
  940. ;;;                                 (vlax-get-property xlsheets 'Item sheet)
  941. ;;;                               )
  942. ;;;                     )
  943. ;;;                   )
  944. ;;;                 )
  945. ;;;               )
  946.                (zx:debug "$jz>excel$ -4.2")
  947.           )
  948.         (PROGN (zx:debug "$jz>excel$ -4.4"))
  949.         (progn
  950.           (zx:debug "$jz>excel$ -4.5")
  951.           (vl-catch-all-apply
  952.             'vlax-put-property
  953.             (list
  954.               (vl-catch-all-apply
  955.                 'vlax-invoke-method
  956.                 (list
  957.                   (vl-catch-all-apply
  958.                     'vlax-get-property
  959.                     (list Xlapp "sheets")
  960.                   )
  961.                   "Add"
  962.                 )
  963.               )
  964.               "name"
  965.               sheet
  966.             )
  967.           )
  968.           (zx:debug "$jz>excel$ -4.6")
  969.           (and sheet
  970.                (vl-catch-all-apply
  971.                  'vlax-get-property
  972.                  (list xlsheets 'Item sheet)
  973.                )
  974.           )
  975.         )
  976.       )
  977.       (zx:debug "$jz>excel$ -5")
  978.       (or (and (not (vl-catch-all-error-p xlsheets))
  979.                sheet
  980.                (setq xlsheet (vl-catch-all-apply
  981.                                'vlax-get-property
  982.                                (list xlsheets 'Item sheet)
  983.                              )
  984.                )
  985.           )
  986.           (and (not (vl-catch-all-error-p xlsheets))
  987.                (setq xlsheet (vl-catch-all-apply
  988.                                'vlax-get-property
  989.                                (list xlsheets 'Item 1)
  990.                              )
  991.                )
  992.           )
  993.       )
  994.       (zx:debug "$jz>excel$ -6")
  995.       (and (not (vl-catch-all-error-p xlsheet))
  996.            (setq xlcells (vl-catch-all-apply
  997.                            'vlax-get-property
  998.                            (list xlsheet 'Cells)
  999.                          )
  1000.            )
  1001.       )
  1002.       (zx:debug "$jz>excel$ -7")
  1003.       (if
  1004.         (and xlcells
  1005.              (not (vl-catch-all-error-p xlcells))
  1006.         )
  1007.          ()
  1008.          (progn
  1009.            (alert
  1010.              "
  1011.     启动Excel错误,请检查微软的OFFICE的Excel是否正确安装
  1012.     "
  1013.            )
  1014.                                         ;(exit)
  1015.          )
  1016.       )
  1017.       (zx:debug "$jz>excel$ -8")
  1018.       (and jz (car jz) (setq colwidths (length (car jz))))
  1019.       (and jz (setq rowheights (length jz)))
  1020.       (if (not address)
  1021.         (progn
  1022.           (setq zimu ($26个字母任意组合$ colwidths))
  1023.           (AND zimu
  1024.                rowheights
  1025.                (SETQ address
  1026.                       (strcat "A1:"
  1027.                               (last zimu)
  1028.                               (vl-princ-to-string rowheights)
  1029.                       )
  1030.                )
  1031.           )
  1032.         )
  1033.       )
  1034.       (zx:debug "$jz>excel$ -9")
  1035.       (SETQ
  1036.         JZ
  1037.          (MAPCAR (FUNCTION
  1038.                    (LAMBDA (A)
  1039.                      (MAPCAR (FUNCTION (LAMBDA (B)
  1040.                                          (IF (= (TYPE B) 'STR)
  1041.                                            B
  1042.                                            (VL-PRINC-TO-STRING B)
  1043.                                          )
  1044.                                        )
  1045.                              )
  1046.                              A
  1047.                      )
  1048.                    )
  1049.                  )
  1050.                  JZ
  1051.          )
  1052.       )
  1053.       (zx:debug "$jz>excel$ -10")
  1054.       (progn
  1055. ;;;        (setq urange (vl-catch-all-apply
  1056. ;;;                       'vlax-get-property
  1057. ;;;                       (list xlsheet 'UsedRange)
  1058. ;;;                     )
  1059. ;;;        );可用区域
  1060.         (IF (or msxlp-get-range msxl-get-range)
  1061.           ()
  1062.           (PRINT "当前excel的vba相关dll调用失败了")
  1063.         )                                ;msxlp-get-range;msxl-get-range
  1064.         (SETQ urange
  1065.                (vl-catch-all-apply
  1066.                  (function
  1067.                    (lambda () (msxlp-get-range xlapp address))
  1068.                                         ;msxlp-get-range;msxl-get-range
  1069.                  )
  1070.                )
  1071.         )                                ;单元格对象
  1072.         (setq xlrange (vl-catch-all-apply
  1073.                         'vlax-get-property
  1074.                         (list urange 'Range address)
  1075.                       )
  1076.         )
  1077.         (vl-catch-all-apply
  1078.           'vlax-put-property
  1079.           (list        xlrange
  1080.                 'NumberFormat
  1081.                 (vlax-make-variant
  1082.                   "@"
  1083.                   8
  1084.                 )
  1085.           )
  1086.         )
  1087.         (vl-catch-all-apply
  1088.           'vlax-put-property
  1089.           (list urange 'HorizontalAlignment -4108)
  1090.         )
  1091.                                         ;水平对齐方式居中
  1092.         (vl-catch-all-apply
  1093.           'vlax-put-property
  1094.           (list urange "VerticalAlignment" -4108)
  1095.         )
  1096.                                         ;垂直水平方式对齐
  1097.         (setgridlines xlapp urange)        ;加边框线
  1098.       )
  1099.       (zx:debug "$jz>excel$ -11")
  1100.       (vlxls-cell-put-value xlapp address JZ) ;数组写入
  1101.       (IF visible?
  1102.         (vl-catch-all-apply
  1103.           'vla-put-visible
  1104.           (list xlapp :vlax-true)
  1105.         )
  1106.       )                                        ;聚焦显示
  1107.       (if xlapp
  1108.         (if (member (cdr (assoc "平铺" lst)) (list "否" "0"))
  1109.           ()
  1110.           (vl-catch-all-apply
  1111.             (function (lambda () (CAD-excel-ping-pu xlapp)))
  1112.           )
  1113.         )
  1114.       )
  1115.       (zx:debug "$jz>excel$ -12")
  1116.       (if app-release?                        ;如果传入了释放excel对象
  1117.         (mapcar
  1118.           (function (lambda (x)
  1119.                       (vl-catch-all-apply
  1120.                         (function (lambda ()
  1121.                                     (vlax-release-object x)
  1122.                                   )
  1123.                         )
  1124.                       )
  1125.                     )
  1126.           )
  1127.           (list xlcells xlsheet xlsheets xlbook xlbooks xlapp)
  1128.         )
  1129.       )
  1130.       (zx:debug "$jz>excel$ -13")
  1131.     )
  1132.   )
  1133.   xlapp
  1134. )
  1135. (DEFUN CAD-excel-ping-pu (ee                /              aa
  1136.                           eheight-max        ewidth-max    viewheight-max
  1137.                           viewwidth-max
  1138.                          )
  1139.                                         ;窗口平铺,并排显示
  1140.   (setq aa (vlax-get-acad-object))
  1141.   (vla-put-WindowState aa acMax)
  1142.   (setq        viewWidth-max
  1143.          (+ (vla-get-width aa) (* 2 (vla-get-windowleft aa)))
  1144.   )
  1145.   (setq        viewHeight-max
  1146.          (+ (vla-get-Height aa) (* 2 (vla-get-windowtop aa)))
  1147.   )
  1148.   (vla-put-WindowState aa acNorm)
  1149.   (vla-put-windowleft aa 0)
  1150.   (vla-put-windowtop aa 0)
  1151.   (vla-put-width aa (/ viewWidth-max 2))
  1152.   (vla-put-Height aa viewHeight-max)
  1153.   (vl-catch-all-apply
  1154.     'vlax-put-property
  1155.     (list ee 'WindowState -4137)
  1156.   )
  1157.   (setq        eWidth-max
  1158.          (vl-catch-all-apply
  1159.            'vlax-get-property
  1160.            (list ee 'width)
  1161.          )
  1162.   )
  1163.   (setq        eHeight-max
  1164.          (vl-catch-all-apply
  1165.            'vlax-get-property
  1166.            (list ee 'Height)
  1167.          )
  1168.   )
  1169.   (vl-catch-all-apply
  1170.     'vlax-put-property
  1171.     (list ee 'WindowState -4143)
  1172.   )
  1173.   (vl-catch-all-apply 'vlax-put-property (list ee 'top 0.0))
  1174.   (vl-catch-all-apply
  1175.     'vlax-put-property
  1176.     (list ee
  1177.           'left
  1178.           (vl-catch-all-apply
  1179.             '-
  1180.             (list (vl-catch-all-apply '* (list 0.5 eWidth-max)) 3)
  1181.           )
  1182.     )
  1183.   )
  1184.   (vl-catch-all-apply
  1185.     'vlax-put-property
  1186.     (list ee
  1187.           'width
  1188.           (vl-catch-all-apply
  1189.             '-
  1190.             (list (vl-catch-all-apply '* (list 0.5 eWidth-max)) 3)
  1191.           )
  1192.     )
  1193.   )
  1194.   (vl-catch-all-apply
  1195.     'vlax-put-property
  1196.     (list ee
  1197.           'Height
  1198.           (vl-catch-all-apply '- (list eHeight-max 6))
  1199.     )
  1200.   )
  1201. )
  1202. (Defun vlxls-app-saveas
  1203.                         (xlapp          Filename quit?    lst             /
  1204.                          Rtn          save           kzm            wjm             f
  1205.                          wb          XlFileFormat
  1206.                         )
  1207.                                         ;保存工作薄
  1208.   (if (and xlapp
  1209.            (setq wb (vl-catch-all-apply
  1210.                       'vlax-get-property
  1211.                       (list xlapp 'activeworkbook)
  1212.                     )
  1213.            )
  1214.            (not (vl-catch-all-error-p wb))
  1215.       )
  1216.     ()
  1217.     (setq xlapp        (vl-catch-all-apply
  1218.                   (function (lambda () ($xlapp-New$ 0 t nil)))
  1219.                 )
  1220.     )
  1221.   )
  1222.   (setq        wb (vl-catch-all-apply
  1223.              'vlax-get-property
  1224.              (list xlapp 'activeworkbook)
  1225.            )
  1226.   )
  1227.   (OR (and Filename
  1228.            (setq kzm (vl-filename-extension Filename))
  1229.            (wcmatch kzm "[,*.xls,*.XLS,*.xlsx,*.XLSX,]")
  1230.       )                                        ;扩展名
  1231.       (SETQ KZM ".xls")
  1232.   )
  1233.   (or (and Filename
  1234.            (setq wjm (vl-filename-base Filename))
  1235.            (> (strlen wjm) 0)
  1236.       )
  1237.       (setq wjm "data")
  1238.   )
  1239.   (or (and Filename
  1240.            (setq f (vl-filename-directory Filename))
  1241.            (setq f (vl-string-right-trim "\\" f))
  1242.       )
  1243.       (and (setq f (getvar "dwgprefix"))
  1244.            (setq f (vl-string-right-trim "\\" f))
  1245.       )
  1246.   )
  1247.   (cond
  1248.     ((and kzm (wcmatch (STRCASE kzm) "[,*.XLS,]"))
  1249.      (SETQ XlFileFormat msxlc-xlNormal)
  1250.     )
  1251.     ((and kzm (wcmatch (STRCASE kzm) "[,*.XLSX,]"))
  1252.      (SETQ XlFileFormat msxlc-xlOpenXMLStrictWorkbook)
  1253.     )
  1254.     (T (SETQ XlFileFormat msxlc-xlAddIn))
  1255.   )                                        ;https://learn.microsoft.com/zh-c ... /excel.xlfileformat有详细说明
  1256.   (setq Filename (strcat f "\\" wjm kzm))
  1257.   (vl-catch-all-apply
  1258.     'vlax-put-property
  1259.     (LIST xlapp 'DisplayAlerts :vlax-False)
  1260.   )                                        ;保存的时候不弹出警告的窗口  
  1261.   (setq        save (vl-catch-all-apply
  1262.                (function (lambda ()
  1263.                            (vlax-invoke-method
  1264.                              wb                 "SaveAs"    Filename
  1265.                              XlFileFormat             ""
  1266.                              ""                 :vlax-False :vlax-False
  1267.                              nil
  1268.                             )
  1269.                          )
  1270.                )
  1271.              )
  1272.   )
  1273.   (if (vl-catch-all-error-p save)
  1274.     (progn (setq save nil)
  1275.            (setq Filename (vl-filename-mktemp Filename))
  1276.            (setq save (vl-catch-all-apply
  1277.                         (function (lambda ()
  1278.                                     (vlax-invoke-method
  1279.                                       wb          "SaveAs"
  1280.                                       Filename          XlFileFormat
  1281.                                       ""          ""
  1282.                                       :vlax-False :vlax-False
  1283.                                       nil
  1284.                                      )
  1285.                                   )
  1286.                         )
  1287.                       )
  1288.            )
  1289.     )
  1290.   )
  1291.   (if quit?
  1292.     (progn
  1293.       (vlax-invoke-method
  1294.         (vlax-get-property xlapp 'activeworkbook)
  1295.         'Close
  1296.       )
  1297.       (vl-catch-all-apply 'vlax-invoke-method (list xlapp 'Quit))
  1298.       (gc)
  1299.     )
  1300.   )
  1301.   (if (vl-catch-all-error-p save)
  1302.     nil
  1303.     (findfile Filename)
  1304.   )
  1305. )
  1306. (defun $get-excel-sheet-v-app$ (xlapp-old excelFile sheetName RangeStr
  1307.                                 lst          /            arr              col
  1308.                                 col-zms          cs            DATA      fullname
  1309.                                 nm          nms            open?     rg
  1310.                                 row          sh            sheets-morens
  1311.                                 shs          ttt            usedrange vvv
  1312.                                 wb          wbs            xl              xlsheet
  1313.                                 release?
  1314.                                )
  1315.                                         ;读取excel数据
  1316.                                         ;excelFile xls文件路径
  1317.                                         ;xlapp-old app对象
  1318.                                         ;sheetName 表名字
  1319.                                         ;RangeStr 数据区域
  1320.                                         ;lst 很多参数可以放这里面
  1321.                                         ;($get-excel-sheet-v$ "C:\\Users\\Administrator\\Desktop\\11.20v1.1.xls" "Sheet1" "A1:B6")
  1322.   (if (and xlapp-old
  1323.            (vl-catch-all-error-p
  1324.              (vl-catch-all-apply
  1325.                'vlax-get-property
  1326.                (list xlapp-old 'activeworkbook)
  1327.              )
  1328.            )
  1329.       )
  1330.     (setq xlapp-old nil)
  1331.   )
  1332.   (if (and (not xlapp-old)                ;没有excel对象
  1333.            (not excelFile)                ;没有传入路径
  1334.            sheetName                        ;但是,有seet的表名字
  1335.       )
  1336.     (if        (and (setq xl ($xlapp-New$ nil nil nil))
  1337.              (not (vl-catch-all-error-p xl))
  1338.              (setq xlsheet
  1339.                     (vl-catch-all-apply
  1340.                       'vlax-get-property
  1341.                       (list (vl-catch-all-apply
  1342.                               'vlax-get-property
  1343.                               (list (vl-catch-all-apply
  1344.                                       'vlax-get-property
  1345.                                       (list xl 'activeworkbook)
  1346.                                     )
  1347.                                     'Sheets
  1348.                               )
  1349.                             )
  1350.                             'Item
  1351.                             sheetName
  1352.                       )
  1353.                     )
  1354.              )
  1355.              (not (vl-catch-all-error-p xlsheet))
  1356.         )
  1357.       ()
  1358.       (setq xl nil)
  1359.     )
  1360.   )
  1361.   (or (and sheetName
  1362.            (= (type sheetName) 'str)
  1363.       )                                        ;有值就必须是字串
  1364.       (setq sheetName "Sheet1")                ;无值时默认sheet1
  1365.   )
  1366.   (or (and RangeStr
  1367.            (= (type RangeStr) 'str)
  1368.            (wcmatch RangeStr "[,[A-Z]*`:[A-Z]*,]")
  1369.       )                                        ;要么有值
  1370.       (setq RangeStr nil)                ;要么没值,下面程序自动获取可用区域
  1371.   )
  1372.   (or (and xlapp-old
  1373.            (not (vl-catch-all-error-p xlapp-old))
  1374.            (setq xl xlapp-old)
  1375.       )
  1376.       (setq xl ($xlapp-New$ nil nil nil))
  1377.   )
  1378.                                         ;创建excel程序对象
  1379.   (IF (or (NOT XL) (vl-catch-all-error-p XL))
  1380.     (PROGN
  1381.       "
  1382.           请检查注册表中以下两项的值是否正确
  1383. HKEY_CLASSES_ROOT\\Excel.Application\\CLSID
  1384. HKEY_CLASSES_ROOT\\CLSID\\{00024500-0000-0000-C000-000000000046}\\LocalServer32
  1385.       "
  1386.     )
  1387.   )
  1388.   (AND (NOT (vl-catch-all-error-p XL))
  1389.        (setq wbs (vlax-get-property xl "WorkBooks"))
  1390.   )
  1391.                                         ;获取excel程序对象的工作簿集合对象       
  1392.   (or (and XL
  1393.            (not excelFile)                ;没有传入路径
  1394.            (NOT (vl-catch-all-error-p XL))
  1395.            (setq wb (vlax-get-property XL 'activeworkbook))
  1396.                                         ;工作薄对象
  1397.            (NOT (vl-catch-all-error-p wb))
  1398.       )                                        ;如果这里成立说明文件处于打开状态
  1399.       (and XL
  1400.            (NOT (vl-catch-all-error-p XL))
  1401.            (setq wb (vlax-get-property XL 'activeworkbook))
  1402.                                         ;工作薄对象
  1403.            (NOT (vl-catch-all-error-p wb))
  1404.            (setq fullname (vlax-get-property wb 'fullname))
  1405.                                         ;完整路径
  1406.            (NOT (vl-catch-all-error-p fullname))
  1407.            excelFile
  1408.            (= excelFile fullname)        ;等于传入进来的路径             
  1409.       )                                        ;如果这里成立说明文件处于打开状态
  1410.       (AND wbs
  1411.            (NOT (vl-catch-all-error-p wbs))
  1412.            (setq wb (vl-catch-all-apply
  1413.                       'vlax-invoke-method
  1414.                       (list wbs "open" excelFile)
  1415.                     )
  1416.            )
  1417.            (setq open? 't)
  1418.       )
  1419.   )                                        ;用工作簿集合对象打开指定的excel文件
  1420.   (AND wb
  1421.        (NOT (vl-catch-all-error-p wb))
  1422.        (setq
  1423.          shs
  1424.           (vl-catch-all-apply 'vlax-get-property (list wb "Sheets"))
  1425.        )
  1426.   )
  1427.                                         ;获取刚才打开工作簿的所有工作表
  1428.   (if xlsheet
  1429.     (setq sh xlsheet)
  1430.     (if        (AND shs (NOT (vl-catch-all-error-p shs)))
  1431.       (PROGN (setq sh (vl-catch-all-apply
  1432.                         'vlax-get-property
  1433.                         (list (vl-catch-all-apply
  1434.                                 'vlax-get-property
  1435.                                 (list (vl-catch-all-apply
  1436.                                         'vlax-get-property
  1437.                                         (list xl 'activeworkbook)
  1438.                                       )
  1439.                                       'Sheets
  1440.                                 )
  1441.                               )
  1442.                               'Item
  1443.                               sheetName
  1444.                         )
  1445.                       )
  1446.              )
  1447.              (IF (VL-CATCH-ALL-ERROR-P SH)
  1448.                (IF sheetName
  1449.                  (PRINT (STRCAT "excel中 " sheetName " 表名没找到"))
  1450.                )
  1451.              )
  1452.       )
  1453.     )                                        ;获取指定的sheet表
  1454.   )
  1455.   (if (not RangeStr)
  1456.     (or        (and sh
  1457.              (NOT (vl-catch-all-error-p sh))
  1458.              (setq UsedRange (vlax-get-property SH 'UsedRange))
  1459.                                         ;使用单元格
  1460.              (progn (vl-catch-all-apply
  1461.                       'vlax-put-property
  1462.                       (list UsedRange
  1463.                             'NumberFormat
  1464.                             (vlax-make-variant
  1465.                               "@"
  1466.                               8
  1467.                             )
  1468.                       )
  1469.                     )                        ;设定为文本型               
  1470.                     t
  1471.              )
  1472.              (setq col (vlax-get-property
  1473.                          (vlax-get-property UsedRange 'columns)
  1474.                          'count
  1475.                        )
  1476.              )
  1477.              (setq row (vlax-get-property
  1478.                          (vlax-get-property UsedRange 'rows)
  1479.                          'count
  1480.                        )
  1481.              )
  1482.              (setq col-zms ($26个字母任意组合$ col))
  1483.              (setq RangeStr (strcat (car col-zms)
  1484.                                     "1:"
  1485.                                     (last col-zms)
  1486.                                     (itoa row)
  1487.                             )
  1488.              )
  1489.         )
  1490.         (setq RangeStr "A1:Z65535")
  1491.     )
  1492.   )                                        ;如果没有传入区域字串就获取可使用区域
  1493.   (setq        rg (vl-catch-all-apply
  1494.              'vlax-get-property
  1495.              (list sh "Range" RangeStr)
  1496.            )
  1497.   )
  1498.                                         ;用指定的字符串创建工作表范围对象
  1499.   (AND rg
  1500.        (NOT (vl-catch-all-error-p rg))
  1501.        (setq
  1502.          vvv
  1503.           (vl-catch-all-apply 'vlax-get-property (list rg 'Value))
  1504.        )
  1505.   )
  1506.                                         ;获取范围对象的值
  1507.   (AND vvv
  1508.        (NOT (vl-catch-all-error-p vvv))
  1509.        (setq arr (vl-catch-all-apply
  1510.                    'vlax-safearray->list
  1511.                    (list (vlax-variant-value vvv))
  1512.                  )
  1513.        )
  1514.   )
  1515.                                         ;转换为数组
  1516.   (if (and xlapp-old (not (vl-catch-all-error-p xlapp-old)))
  1517.     ()
  1518.     (if        open?                                ;如果前面有打开记号(说明是程序自己打开的)
  1519.       (progn
  1520.         (vl-catch-all-apply
  1521.           (function (lambda () (vlax-invoke-method wb "Close")))
  1522.         )
  1523.                                         ;关闭工作簿
  1524.         (vl-catch-all-apply
  1525.           (function (lambda () (vlax-invoke-method xl "Quit")))
  1526.         )                                ;退出excel对象
  1527.       )                                        ;程序打开的文件,程序必须关闭掉,用户打开的文件,程序不能关闭
  1528.     )
  1529.   )
  1530.   (progn
  1531.     (vl-catch-all-apply
  1532.       (function (lambda () (vlax-release-object sh)))
  1533.     )                                        ;释放sh对象
  1534.     (vl-catch-all-apply
  1535.       (function (lambda () (vlax-release-object wb)))
  1536.     )                                        ;释放wb对象
  1537.     (if        (and xlapp-old (not (vl-catch-all-error-p xlapp-old)))
  1538.                                         ;如果有传入xlapp-old对象,说明上级调用的时候已经获取到对象了,这里不能给释放掉,一旦释放了,上级调用方就出问题了
  1539.       ()
  1540.       (if (= (cdr (assoc "强制返回excel对象" lst)) "是")
  1541.         ()
  1542.         (progn (vl-catch-all-apply
  1543.                  (function (lambda () (vlax-release-object xl)))
  1544.                )                        ;释放excel对象
  1545.                (setq release? 't)        ;释放记号
  1546.         )
  1547.       )
  1548.     )

  1549.   )
  1550.   (IF (AND arr (NOT (vl-catch-all-error-p arr)))
  1551.     (SETQ
  1552.       DATA
  1553.        (mapcar
  1554.          (function
  1555.            (lambda (a /)
  1556.              (mapcar
  1557.                (function
  1558.                  (lambda (b / str)
  1559.                    (setq str
  1560.                           (vl-catch-all-apply 'vlax-variant-value (list b))
  1561.                    )
  1562.                    (if (vl-catch-all-error-p str)
  1563.                      (progn (print)
  1564.                             (princ (strcat "Excel返回错误: "
  1565.                                            (vl-catch-all-error-message str)
  1566.                                    )
  1567.                             )
  1568.                             (setq str "")
  1569.                      )
  1570.                    )
  1571.                    (or str
  1572.                        (setq str "")
  1573.                    )
  1574.                    str
  1575.                  )
  1576.                )
  1577.                a
  1578.              )
  1579.            )
  1580.          )
  1581.          arr
  1582.        )
  1583.     )
  1584.   )
  1585.   (if release?
  1586.     (list
  1587.       (cons "excel对象" NIL)
  1588.       (cons "数据" DATA)
  1589.       (cons
  1590.         "备注"
  1591.         "传入有效xlapp对象,返回有效的xlapp对象;未传入或者是传入不合法的xlapp将不返回xlapp对象;但是,如果在lst里面传入“强制返回excel对象”的值为“是”的时候会强制将excel的对象给返回去"
  1592.       )
  1593.     )                                        ;仅返回数据给上级
  1594.     (list
  1595.       (cons "excel对象" xl)
  1596.       (cons "数据" DATA)
  1597.       (cons
  1598.         "释放excel方法"
  1599.         "(PROGN (VL-CATCH-ALL-APPLY (FUNCTION (LAMBDA nil (vlax-release-object XLAPP)))) (SETQ XLAPP nil))"
  1600.       )
  1601.     )
  1602.                                         ;返回xlapp对象和数据
  1603.   )
  1604. )
  1605. (defun $kill-excel$ (/ xlapp)
  1606.                                         ;杀死excel进程
  1607.   (or
  1608.     (setq xlapp
  1609.            (VL-CATCH-ALL-APPLY
  1610.              'vlax-get-or-create-object
  1611.              '("Excel.Application")
  1612.            )
  1613.     )
  1614.                                         ;微软的office调用方法
  1615.     (SETQ xlapp        (VL-CATCH-ALL-APPLY
  1616.                   'vlax-get-or-create-object
  1617.                   '("Ket.Application")
  1618.                 )
  1619.     )                                        ;wps的调用方法
  1620.     (setq xlapp        (VL-CATCH-ALL-APPLY
  1621.                   'vlax-get-or-create-object
  1622.                   '("Calc.Application")
  1623.                 )
  1624.     )
  1625.                                         ;中线cad的office调用方法
  1626.   )
  1627.   (vl-catch-all-apply 'vlax-invoke-method (list xlapp 'Quit))
  1628.   (and xlapp
  1629.        (vl-catch-all-apply 'vlax-release-object (list xlapp))
  1630.   )
  1631. )
  1632. (defun $excel-he-bing-dan-yuan-ge$
  1633.        (xlapp sheet-n dygs xlapprelease? lst / xlbooks xlsheet)
  1634.                                         ;合并单元格
  1635.                                         ;($he-bing-dan-yuan-ge$ nil "下线分析"(list "B1:C1" "B3:C5")NIL NIL)
  1636.   (or xlapp (setq xlapp ($xlapp-New$ nil nil nil)))
  1637.   (setq        xlbooks        (vl-catch-all-apply
  1638.                   'vlax-get-property
  1639.                   (list xlapp 'Workbooks)
  1640.                 )
  1641.   )
  1642.   (setq        xlsheet
  1643.          (vl-catch-all-apply
  1644.            'vlax-get-property
  1645.            (list (vl-catch-all-apply
  1646.                    'vlax-get-property
  1647.                    (list (vl-catch-all-apply
  1648.                            'vlax-get-property
  1649.                            (list xlapp 'activeworkbook)
  1650.                          )
  1651.                          'Sheets
  1652.                    )
  1653.                  )
  1654.                  'Item
  1655.                  sheet-n
  1656.            )
  1657.          )
  1658.   )
  1659.   (vl-catch-all-apply
  1660.     'vlax-invoke-method
  1661.     (list xlsheet "Activate")
  1662.   )                                        ;置顶
  1663.   (vl-catch-all-apply
  1664.     'vlax-put-property
  1665.     (LIST xlapp 'DisplayAlerts :vlax-False)
  1666.   )                                        ;禁止弹出提示语
  1667.   (mapcar (function
  1668.             (lambda (a / rang)
  1669.               (setq
  1670.                 rang (vl-catch-all-apply 'msxlp-get-range (list xlapp a))
  1671.               )
  1672.               (vl-catch-all-apply 'msxl-merge (list rang nil))
  1673.             )
  1674.           )
  1675.           dygs
  1676.   )
  1677.   (vl-catch-all-apply
  1678.     'msxlp-put-HorizontalAlignment
  1679.     (list rang -4108)
  1680.   )
  1681.   (if xlapprelease?                        ;释放吗?
  1682.     (progn (vl-catch-all-apply 'vlax-release-object (list xlapp))
  1683.            (setq xlapp nil)
  1684.     )
  1685.   )
  1686.   xlapp
  1687. )
  1688. (defun $he-bing-dan-yuan-ge$ (xlapp sheet-n dygs xlapprelease? lst)
  1689.   ($excel-he-bing-dan-yuan-ge$
  1690.     xlapp sheet-n dygs xlapprelease? lst)
  1691. )
  1692. (defun $zi-shi-ying$ (xlapp sh-n lst)
  1693.                                         ;自适应,自动调整,列自适应
  1694.   (if xlapp
  1695.     (vl-catch-all-apply
  1696.       'variant-value
  1697.       (list
  1698.         (vl-catch-all-apply
  1699.           'msxl-autofit
  1700.           (list
  1701.             (vl-catch-all-apply
  1702.               'msxlp-get-columns
  1703.               (list
  1704.                 (vl-catch-all-apply
  1705.                   'msxlp-get-Cells
  1706.                   (list
  1707.                     (vl-catch-all-apply
  1708.                       'vlax-get-property
  1709.                       (list (vl-catch-all-apply
  1710.                               'vlax-get-property
  1711.                               (list (vl-catch-all-apply
  1712.                                       'vlax-get-property
  1713.                                       (list xlapp 'activeworkbook)
  1714.                                     )
  1715.                                     'Sheets
  1716.                               )
  1717.                             )
  1718.                             'Item
  1719.                             sh-n
  1720.                       )
  1721.                     )
  1722.                   )
  1723.                 )
  1724.               )
  1725.             )
  1726.           )
  1727.         )
  1728.       )
  1729.     )
  1730.   )
  1731. )

  1732. (defun $excel-zi-ti-jia-cu$ (sh rangs lst)
  1733.                                         ;字体加粗,文字加粗
  1734.   (defun $excel-zi-ti-jia-cu-run$ (sh rang-str / RANG font)
  1735.     (SETQ RANG (vl-catch-all-apply
  1736.                  'vlax-get-property
  1737.                  (list sh 'range rang-str)
  1738.                )
  1739.     )
  1740.     (setq font
  1741.            (vl-catch-all-apply 'vlax-get-property (list RANG 'font))
  1742.     )
  1743.     (vlax-put-property font 'FontStyle "加粗")
  1744.     (vl-catch-all-apply 'vlax-release-object (list font))
  1745.     (vl-catch-all-apply 'vlax-release-object (list RANG))
  1746.     (setq font nil)
  1747.     (setq RANG nil)
  1748.   )
  1749.   (cond        ((and rangs (= (type rangs) 'str))
  1750.          ($excel-zi-ti-jia-cu-run$ sh rangs)
  1751.         )
  1752.         ((and rangs (= (type rangs) 'list))
  1753.          (mapcar (function
  1754.                    (lambda (a / RANG font)
  1755.                      ($excel-zi-ti-jia-cu-run$ sh a)
  1756.                    )
  1757.                  )
  1758.                  rangs
  1759.          )
  1760.         )
  1761.   )
  1762. )
  1763. (DEFUN $zi-ti-jia-cu$ (xlapp sh-n address lst / sh activeworkbook)
  1764.                                         ;字体加粗,文字加粗
  1765.   (SETQ        activeworkbook
  1766.          (vl-catch-all-apply
  1767.            'vlax-get-property
  1768.            (list xlapp 'activeworkbook)
  1769.          )
  1770.   )
  1771.   (setq        SH
  1772.          (vl-catch-all-apply
  1773.            'vlax-get-property
  1774.            (list (vl-catch-all-apply
  1775.                    'vlax-get-property
  1776.                    (list activeworkbook
  1777.                          'Sheets
  1778.                    )
  1779.                  )
  1780.                  'Item
  1781.                  sh-n
  1782.            )
  1783.          )
  1784.   )
  1785.   ($excel-zi-ti-jia-cu$ SH address NIL)
  1786.   (vl-catch-all-apply 'vlax-release-object (list SH))
  1787.   (vl-catch-all-apply
  1788.     'vlax-release-object
  1789.     (list activeworkbook)
  1790.   )
  1791.   (SETQ activeworkbook NIL)
  1792.   (SETQ SH NIL)
  1793. )
  1794. (DEFUN $in-put-excel-func$ (xlapp sh-n address-fun-str lst)
  1795.                                         ;向excel单元格扔函数
  1796.                                         ;xlapp excel对象
  1797.                                         ;sh-n sheet表格的名字
  1798.                                         ;address-fun-str 单元格及函数字串
  1799.                                         ;lst 预留参数
  1800.                                         ;($in-put-excel-func$ nil "数据源" (list (cons "C2" "=B8")) NIL)
  1801.   (if (and address-fun-str
  1802.            (= (type address-fun-str) 'list)
  1803.            (= (type (car address-fun-str)) 'list)
  1804.            (= (type (car (car address-fun-str))) 'str)
  1805.       )
  1806.     (progn (or xlapp (setq xlapp ($xlapp-New$ NIL nil nil)))
  1807.            (vl-catch-all-apply
  1808.              'vlax-invoke-method
  1809.              (list (vl-catch-all-apply
  1810.                      'vlax-get-property
  1811.                      (list (vl-catch-all-apply
  1812.                              'vlax-get-property
  1813.                              (list (vl-catch-all-apply
  1814.                                      'vlax-get-property
  1815.                                      (list xlapp 'activeworkbook)
  1816.                                    )
  1817.                                    'Sheets
  1818.                              )
  1819.                            )
  1820.                            'Item
  1821.                            sh-n
  1822.                      )
  1823.                    )
  1824.                    "Activate"
  1825.              )
  1826.            )
  1827.            (mapcar
  1828.              (function
  1829.                (lambda (a / address str)
  1830.                  (setq address (car a))
  1831.                  (setq str (cdr a))
  1832.                  (vl-catch-all-apply
  1833.                    'vlax-put-property
  1834.                    (list
  1835.                      (vl-catch-all-apply
  1836.                        'msxlp-get-range
  1837.                        (list xlapp address)
  1838.                      )
  1839.                      "FormulaLocal"
  1840.                      (vl-catch-all-apply
  1841.                        'vlax-make-variant
  1842.                        (list str
  1843.                              8
  1844.                        )
  1845.                      )
  1846.                    )
  1847.                  )
  1848.                )
  1849.              )
  1850.              address-fun-str
  1851.            )
  1852.     )
  1853.   )
  1854. )
  1855. (defun $excel-cha-ru-tu-pian$ (xlapp        sh-n         ID          path
  1856.                                xlapprelease?         LST          /
  1857.                                H        H1         L          Mergerange
  1858.                                P        Pic         Picname  sc
  1859.                                ShapeRange         W          W1
  1860.                                xlrange        xlsheet
  1861.                               )
  1862.                                         ;插入图片
  1863.                                         ;xlapp excel对象
  1864.                                         ;sh-n sheet表名
  1865.                                         ;id 单元格
  1866.                                         ;path 图片路径
  1867.                                         ;xlapprelease? 程序结束后是否需要释放excel?
  1868.                                         ;lst 预留参数
  1869.   (OR ID (setq id "A1"))
  1870.   (or xlapp (setq xlapp ($xlapp-New$ NIL nil nil)))
  1871.   (setq        xlsheet
  1872.          (vl-catch-all-apply
  1873.            'vlax-get-property
  1874.            (list (vl-catch-all-apply
  1875.                    'vlax-get-property
  1876.                    (list (vl-catch-all-apply
  1877.                            'vlax-get-property
  1878.                            (list xlapp 'activeworkbook)
  1879.                          )
  1880.                          'Sheets
  1881.                    )
  1882.                  )
  1883.                  'Item
  1884.                  sh-n
  1885.            )
  1886.          )
  1887.   )
  1888.   (setq        Pic
  1889.          (vl-catch-all-apply
  1890.            'vlax-invoke-method
  1891.            (list
  1892.              (vl-catch-all-apply
  1893.                'vlax-invoke-method
  1894.                (list xlsheet 'Pictures)
  1895.              )
  1896.              'Insert
  1897.              path
  1898.            )
  1899.          )
  1900.   )
  1901.   (setq        Picname
  1902.          (vl-catch-all-apply
  1903.            'vlax-get-property
  1904.            (list Pic 'Name)
  1905.          )
  1906.   )
  1907.   (setq W1 (vl-catch-all-apply 'vlax-get-property (list Pic 'Width)))
  1908.   (setq H1 (vl-catch-all-apply 'vlax-get-property (list Pic 'Height)))
  1909.   (setq        xlrange
  1910.          (vl-catch-all-apply
  1911.            'vlax-get-property
  1912.            (list
  1913.              (vl-catch-all-apply
  1914.                'vlax-get
  1915.                (list (vl-catch-all-apply
  1916.                        'vlax-get-property
  1917.                        (list xlapp "ActiveWorkbook")
  1918.                      )
  1919.                      'ActiveSheet
  1920.                )
  1921.              )
  1922.              'range
  1923.              id
  1924.            )
  1925.          )
  1926.   )
  1927.   (setq
  1928.     L (vl-catch-all-apply
  1929.         'vlax-variant-value
  1930.         (LIST
  1931.           (vl-catch-all-apply 'vlax-get-property (LIST xlrange 'Left))
  1932.         )
  1933.       )
  1934.   )
  1935.   (SETQ
  1936.     P (vl-catch-all-apply
  1937.         'vlax-variant-value
  1938.         (LIST
  1939.           (vl-catch-all-apply 'vlax-get-property (LIST xlrange 'Top))
  1940.         )
  1941.       )
  1942.   )
  1943.   (SETQ        W (vl-catch-all-apply
  1944.             'vlax-variant-value
  1945.             (LIST (vl-catch-all-apply
  1946.                     'vlax-get-property
  1947.                     (LIST xlrange 'Width)
  1948.                   )
  1949.             )
  1950.           )
  1951.   )
  1952.   (SETQ        H (vl-catch-all-apply
  1953.             'vlax-variant-value
  1954.             (LIST (vl-catch-all-apply
  1955.                     'vlax-get-property
  1956.                     (LIST xlrange 'Height)
  1957.                   )
  1958.             )
  1959.           )
  1960.   )
  1961.   (vl-catch-all-apply 'vlax-put-property (LIST Pic 'Left L))
  1962.   (vl-catch-all-apply 'vlax-put-property (LIST Pic 'Top P))
  1963.   (setq        ShapeRange
  1964.          (vl-catch-all-apply
  1965.            'vlax-get-property
  1966.            (LIST
  1967.              (vl-catch-all-apply
  1968.                'vlax-get-property
  1969.                (LIST xlsheet 'Shapes)
  1970.              )
  1971.              'Range
  1972.              Picname
  1973.            )
  1974.          )
  1975.   )
  1976.   (vl-catch-all-apply
  1977.     'vlax-put-property
  1978.     (LIST
  1979.       ShapeRange
  1980.       'LockAspectRatio
  1981.       :vlax-true
  1982.     )
  1983.   )
  1984.   (if (AND W
  1985.            (NOT (VL-CATCH-ALL-ERROR-P W))
  1986.            W1
  1987.            (NOT (VL-CATCH-ALL-ERROR-P W1))
  1988.            H1
  1989.            (NOT (VL-CATCH-ALL-ERROR-P H1))
  1990.            H
  1991.            (NOT (VL-CATCH-ALL-ERROR-P H))
  1992.       )
  1993.     (if        (>= (/ W H) (/ W1 H1))
  1994.       (progn
  1995.         (SETQ SC (/ (- W (* (/ W1 H1) H)) 2))
  1996.         (vl-catch-all-apply
  1997.           'vlax-put-property
  1998.           (LIST ShapeRange 'Height H)
  1999.         )
  2000.         (vl-catch-all-apply
  2001.           'vlax-invoke-method
  2002.           (LIST ShapeRange 'IncrementLeft SC)
  2003.         )
  2004.       )
  2005.       (progn
  2006.         (SETQ SC (/ (- H (* (/ H1 W1) W)) 2))
  2007.         (vl-catch-all-apply
  2008.           'vlax-put-property
  2009.           (LIST ShapeRange 'Width W)
  2010.         )
  2011.         (vl-catch-all-apply
  2012.           'vlax-invoke-method
  2013.           (list ShapeRange 'IncrementTop SC)
  2014.         )
  2015.       )
  2016.     )
  2017.   )
  2018.   (vl-catch-all-apply
  2019.     'vlax-put-property
  2020.     (LIST Pic
  2021.           'Placement
  2022.           (vl-catch-all-apply 'vlax-make-variant (LIST 1 2))
  2023.     )
  2024.   )
  2025.   (if xlapprelease?                        ;释放吗?
  2026.     (progn (vl-catch-all-apply 'vlax-release-object (list xlapp))
  2027.            (setq xlapp nil)
  2028.     )
  2029.   )
  2030.   (princ)
  2031. )
  2032. (defun $excel-add-vba$
  2033.        (xlapp sh-n VBA-STR run-str lst / item vbproject xlsheet)
  2034.                                         ;向excel里面写vba代码,注入vba代码
  2035. ;;;  ($excel-add-vba$
  2036. ;;;  xlapp
  2037. ;;;  "Sub Lisp_vba()\nMsgBox \"Hello world!\", vbOKOnly, \"Lisp调用Excel\"\nEnd Sub"
  2038. ;;;  "(vlax-invoke-method XLAPP (QUOTE RUN) \"Sheet1.Lisp_vba\")"
  2039. ;;;  "Sheet1"
  2040. ;;;  nil
  2041. ;;; )
  2042.   (or xlapp (setq xlapp ($xlapp-New$ nil nil nil)))
  2043.   (setq        xlsheet
  2044.          (vl-catch-all-apply
  2045.            'vlax-get-property
  2046.            (list (vl-catch-all-apply
  2047.                    'vlax-get-property
  2048.                    (list (vl-catch-all-apply
  2049.                            'vlax-get-property
  2050.                            (list xlapp 'activeworkbook)
  2051.                          )
  2052.                          'Sheets
  2053.                    )
  2054.                  )
  2055.                  'Item
  2056.                  sh-n
  2057.            )
  2058.          )
  2059.   )
  2060.   (setq        VBProject
  2061.          (vl-catch-all-apply
  2062.            'vlax-get-property
  2063.            (list
  2064.              (vl-catch-all-apply
  2065.                'vlax-get-property
  2066.                (list xlapp
  2067.                      "ActiveWorkbook"
  2068.                )
  2069.              )
  2070.              'VBProject
  2071.            )
  2072.          )
  2073.   )
  2074.   (setq        Item (vl-catch-all-apply
  2075.                'vlax-invoke-method
  2076.                (LIST
  2077.                  (vl-catch-all-apply
  2078.                    'vlax-get-property
  2079.                    (LIST
  2080.                      VBProject
  2081.                      'VBComponents
  2082.                    )
  2083.                  )
  2084.                  'Item
  2085.                  sh-n
  2086.                )
  2087.              )
  2088.   )
  2089.   (vl-catch-all-apply
  2090.     'vlax-invoke-method
  2091.     (LIST
  2092.       (vl-catch-all-apply
  2093.         'vlax-get-property
  2094.         (LIST
  2095.           Item
  2096.           'CodeModule
  2097.         )
  2098.       )
  2099.       'DeleteLines
  2100.       1
  2101.       (vl-catch-all-apply
  2102.         'vlax-get-property
  2103.         (LIST
  2104.           (vl-catch-all-apply
  2105.             'vlax-get-property
  2106.             (LIST
  2107.               Item
  2108.               'CodeModule
  2109.             )
  2110.           )
  2111.           'CountOfLines
  2112.         )
  2113.       )
  2114.     )
  2115.   )                                        ;删除历史的vba代码
  2116.   (vl-catch-all-apply
  2117.     'vlax-invoke-method
  2118.     (LIST
  2119.       (vl-catch-all-apply
  2120.         'vlax-get-property
  2121.         (LIST
  2122.           Item
  2123.           'CodeModule
  2124.         )
  2125.       )
  2126.       'AddFromString
  2127.       VBA-STR
  2128.     )
  2129.   )
  2130.   (vl-catch-all-apply
  2131.     'EVAL
  2132.     (list (vl-catch-all-apply 'READ (list run-str)))
  2133.   )
  2134.   (vl-catch-all-apply
  2135.     'vlax-get-property
  2136.     (LIST
  2137.       (vl-catch-all-apply
  2138.         'vlax-get-property
  2139.         (LIST
  2140.           Item
  2141.           'CodeModule
  2142.         )
  2143.       )
  2144.       'CountOfLines
  2145.     )
  2146.   )                                        ;返回写入成功的行数
  2147. )
  2148. (defun $excel-vba-run$ (XLAPP vba-str lst)
  2149.                                         ;执行vba代码
  2150.                                         ;vba-str为字串型,发挥空间很大,为啥用字串型?主要是因为需要执行的vba函数可能需要传参,没法知道到底要传入多少个参数,所以,干脆用字串型,传入的时候自己包装好,传入进来就可以了 ,例如:"(vlax-invoke-method XLAPP (QUOTE RUN) \"Sheet1.Lisp_vba\")"
  2151.   (vl-catch-all-apply
  2152.     'EVAL
  2153.     (list (vl-catch-all-apply 'READ (list vba-str)))
  2154.   )
  2155. )
  2156. (defun $excel-rang-copy$
  2157.                          (xlapp             SH-N-O        SH-N-new   address-o
  2158.                           address-n  lst        /           xlsheet1
  2159.                           xlsheet2
  2160.                          )
  2161.                                         ;单元格复制
  2162.                                         ;SH-N-O原sheet表名
  2163.                                         ;SH-N-new 新的目标sheet表名
  2164.                                         ;address-o原复制单元格地址
  2165.                                         ;address-n 新的单元格地址
  2166.   (or xlapp (setq xlapp ($xlapp-New$ NIL nil nil)))
  2167.   (or SH-N-new (setq SH-N-new SH-N-O))
  2168.   (setq        xlsheet1
  2169.          (vl-catch-all-apply
  2170.            'vlax-get-property
  2171.            (list (vl-catch-all-apply
  2172.                    'vlax-get-property
  2173.                    (list (vl-catch-all-apply
  2174.                            'vlax-get-property
  2175.                            (list xlapp 'activeworkbook)
  2176.                          )
  2177.                          'Sheets
  2178.                    )
  2179.                  )
  2180.                  'Item
  2181.                  SH-N-O
  2182.            )
  2183.          )
  2184.   )
  2185.   (setq        xlsheet2
  2186.          (vl-catch-all-apply
  2187.            'vlax-get-property
  2188.            (list (vl-catch-all-apply
  2189.                    'vlax-get-property
  2190.                    (list (vl-catch-all-apply
  2191.                            'vlax-get-property
  2192.                            (list xlapp 'activeworkbook)
  2193.                          )
  2194.                          'Sheets
  2195.                    )
  2196.                  )
  2197.                  'Item
  2198.                  SH-N-new
  2199.            )
  2200.          )
  2201.   )
  2202.   (vl-catch-all-apply
  2203.     'vlax-invoke-method
  2204.     (list (vl-catch-all-apply
  2205.             'msxlp-get-range
  2206.             (list xlsheet1 address-o)
  2207.           )
  2208.           'copy
  2209.           (vl-catch-all-apply
  2210.             'msxlp-get-range
  2211.             (list xlsheet2 address-n)
  2212.           )
  2213.     )
  2214.   )
  2215. )
  2216. (defun $excel-zi-dong-tian-chong$ (xlapp     sh-n      rang-start
  2217.                                    rows             c-cz      XlAutoFillType
  2218.                                    lst             /               co
  2219.                                    nums             rang-end  row
  2220.                                    strs             xlsheet
  2221.                                   )
  2222.                                         ;自动填充
  2223.                                         ;xlapp             excel的对象
  2224.                                         ;sh-n              sheet的表名字
  2225.                                         ;rang-start        起始单元格,字串格式
  2226.                                         ;rows               函数,如果传入了这个,就不用传入c-cz的值了,这个变量优先
  2227.                                         ;c-cz              参照列,用来计算最大行的行号
  2228.                                         ;XlAutoFillType    填充模式
  2229.                                         ;lst               预留参数
  2230.                                         ;($excel-zi-dong-tian-chong$  nil "Sheet1" "C1" "A65536" 6 NIL)
  2231.   (or XlAutoFillType (setq XlAutoFillType 6))
  2232.   (or c-cz (setq c-cz "A65536"))        ;参照列,用来计算最下面哪一行的行号
  2233.   (or xlapp (setq xlapp ($xlapp-New$ NIL nil nil))) ;EXCEL对象
  2234.   (setq        xlsheet
  2235.          (vl-catch-all-apply
  2236.            'vlax-get-property
  2237.            (list (vl-catch-all-apply
  2238.                    'vlax-get-property
  2239.                    (list (vl-catch-all-apply
  2240.                            'vlax-get-property
  2241.                            (list xlapp 'activeworkbook)
  2242.                          )
  2243.                          'Sheets
  2244.                    )
  2245.                  )
  2246.                  'Item
  2247.                  sh-n
  2248.            )
  2249.          )
  2250.   )                                        ;根据传入进来的表名字获取表对象
  2251.   (cond        ((and rows (= (type rows) 'str) (= (type (read rows)) 'int))
  2252.                                         ;传入进来是字串格式,同时read后是int格式
  2253.          t
  2254.         )
  2255.         ((and rows (= (type rows) 'str) (= (type (read rows)) 'int))
  2256.                                         ;传入进来的就是int格式
  2257.          t
  2258.         )
  2259.         ((and rows (= (type rows) 'int)) ;传入进来的就是int格式
  2260.          (setq rows (vl-princ-to-string rows)) ;转换为字串格式
  2261.         )
  2262.         (t
  2263.          (setq rows (vl-princ-to-string
  2264.                       (vlax-get-property
  2265.                         (vlax-get-property
  2266.                           (msxlp-get-range xlsheet c-cz)
  2267.                           'End
  2268.                           3
  2269.                         )
  2270.                         'Row
  2271.                       )
  2272.                     )
  2273.          )                                ;自动根据参照列计算最大行的行号
  2274.         )
  2275.   )                                        ;填充的最大行数
  2276.   (setq nums nil)
  2277.   (setq        strs (MAPCAR 'vl-list->string
  2278.                      (mapcar 'list (vl-string->list rang-start))
  2279.              )
  2280.   )                                        ;转为字串表
  2281.   (setq strs (reverse strs))                ;倒置
  2282.   (while (and strs (= (type (read (car strs))) 'int))
  2283.     (setq nums (cons (car strs) nums))        ;找到数字,其实就是起始行号
  2284.     (setq strs (cdr strs))
  2285.   )
  2286.   (setq co (apply 'strcat (reverse strs))) ;得到起始列号
  2287.   (setq row (apply 'strcat (reverse nums))) ;得到起始行号
  2288.   (and rang-start
  2289.        co
  2290.        rows
  2291.        (setq rang-end (strcat rang-start ":" co rows))
  2292.   )                                        ;计算填充的最大行号
  2293.   (vl-catch-all-apply
  2294.     'vlax-invoke-method
  2295.     (LIST (vl-catch-all-apply
  2296.             'msxlp-get-range
  2297.             (list xlsheet rang-start)
  2298.           )
  2299.           'AutoFill
  2300.           (vl-catch-all-apply
  2301.             'msxlp-get-range
  2302.             (list xlsheet rang-end)
  2303.           )
  2304.           XlAutoFillType
  2305.     )
  2306.   )                                        ;执行填充
  2307. )
  2308. (defun $excel-dan-yuan-ge-pi-zhu$
  2309.        (xlapp sh-n address-str-h lst / $set-font-size$ xlsheet zt)
  2310.                                         ;Excel单元格插入批注
  2311.                                         ;xlapp excel对象
  2312.                                         ;sh-n 表的名字
  2313.                                         ;address-str-h  三个值:单元格地址、字串、文字大小
  2314.                                         ;lst 预留参数
  2315.                                         ;($excel-dan-yuan-ge-pi-zhu$  xlapp  "Sheet2"(list(list "A1" "中线CAD:\n这个列不能删除,删除后将会带来灾乱性后果")(list "B2" "秦始皇:\n您好呀,我是批注"))nil)
  2316.   (defun $set-font-size$ (range h)
  2317.     (vl-catch-all-apply
  2318.       'vlax-put-property
  2319.       (list
  2320.         (vl-catch-all-apply
  2321.           'vlax-get-property
  2322.           (list
  2323.             (vl-catch-all-apply
  2324.               'vlax-invoke-method
  2325.               (list
  2326.                 (vl-catch-all-apply
  2327.                   'vlax-get-property
  2328.                   (list
  2329.                     (vl-catch-all-apply
  2330.                       'vlax-get-property
  2331.                       (list
  2332.                         (vl-catch-all-apply
  2333.                           'vlax-get-property
  2334.                           (list range 'Comment)
  2335.                         )
  2336.                         'Shape
  2337.                       )
  2338.                     )
  2339.                     'TextFrame
  2340.                   )
  2341.                 )
  2342.                 'Characters
  2343.               )
  2344.             )
  2345.             'font
  2346.           )
  2347.         )
  2348.         'size
  2349.         h                                ;文字高度
  2350.       )
  2351.     )
  2352.   )
  2353.   (or xlapp (setq xlapp ($xlapp-New$ NIL nil nil)))
  2354.   (setq        xlsheet
  2355.          (vl-catch-all-apply
  2356.            'vlax-get-property
  2357.            (list (vl-catch-all-apply
  2358.                    'vlax-get-property
  2359.                    (list (vl-catch-all-apply
  2360.                            'vlax-get-property
  2361.                            (list xlapp 'activeworkbook)
  2362.                          )
  2363.                          'Sheets
  2364.                    )
  2365.                  )
  2366.                  'Item
  2367.                  sh-n
  2368.            )
  2369.          )
  2370.   )                                        ;工作表对象
  2371.   (setq        zt (mapcar (function (lambda (a / address str h range zt)
  2372.                                (setq address (car a))
  2373.                                (setq str (cadr a))
  2374.                                (setq h (caddr a))
  2375.                                (or h (setq h 8))
  2376.                                (if str
  2377.                                  (progn
  2378.                                    (SETQ
  2379.                                      range (vl-catch-all-apply
  2380.                                              'msxlp-get-range
  2381.                                              (list xlsheet address)
  2382.                                            )
  2383.                                    )        ;单元格对象
  2384.                                    (vl-catch-all-apply
  2385.                                      'vlax-invoke-method
  2386.                                      (list range 'ClearComments)
  2387.                                    )        ;删除历史批注  
  2388.                                    (setq zt (vl-catch-all-apply
  2389.                                               'vlax-invoke-method
  2390.                                               (list
  2391.                                                 range
  2392.                                                 'AddComment.Text
  2393.                                                 str
  2394.                                               )
  2395.                                             )
  2396.                                    )        ;添加批注
  2397.                                    ($set-font-size$ range h)
  2398.                                  )
  2399.                                )
  2400.                                zt
  2401.                              )
  2402.                    )
  2403.                    address-str-h
  2404.            )
  2405.   )
  2406.   zt
  2407. )
  2408. (defun $csv>xls$ (xlapp csv-f xls-f / f hzm i wb wjm xlapp-old)
  2409.                                         ;csv转xls,csv转excel
  2410.   (setq xlapp-old xlapp)
  2411.   (if (and csv-f (findfile csv-f))
  2412.     (progn
  2413.       (if (findfile xls-f)
  2414.         (progn
  2415.           (setq f (vl-filename-directory xls-f))
  2416.           (setq wjm (vl-filename-base xls-f))
  2417.           (setq hzm ".xls")
  2418.           (setq i 1)
  2419.           (while
  2420.             (and
  2421.               (findfile (setq xls-f (strcat f "\\" wjm (itoa i) hzm)))
  2422.             )
  2423.              (setq i (1+ i))
  2424.           )
  2425.         )
  2426.       )
  2427.       (or xlapp (setq xlapp ($xlapp-New$ NIL nil nil)))
  2428.       (setq wb (vl-catch-all-apply
  2429.                  'vlax-invoke-method
  2430.                  (list (vl-catch-all-apply
  2431.                          'vlax-get-property
  2432.                          (list xlapp 'Workbooks)
  2433.                        )
  2434.                        "open"
  2435.                        csv-f
  2436.                  )
  2437.                )
  2438.       )
  2439.       (vl-catch-all-apply
  2440.         'vlax-put-property
  2441.         (LIST xlapp 'DisplayAlerts :vlax-False)
  2442.       )                                        ;保存的时候不弹出警告窗口
  2443.       (vl-catch-all-apply
  2444.         'vlax-invoke-method
  2445.         (list
  2446.           wb "SaveAs" xls-f msxlc-xlNormal "" "" :vlax-False :vlax-False
  2447.           nil)
  2448.       )
  2449.       (vl-catch-all-apply 'vlax-invoke-method (list wb 'close))
  2450.       (vl-catch-all-apply 'vlax-release-object (list wb))
  2451.       (if xlapp-old
  2452.         ()
  2453.         (vl-catch-all-apply 'vlax-release-object (list xlapp))
  2454.       )
  2455.       (if xls-f
  2456.         (findfile xls-f)
  2457.       )
  2458.     )
  2459.   )
  2460. )
  2461. (defun $get-xls-sheets$        (excelFile / ns sheets xlapp xlbooks xls-open)
  2462.                                         ;获取excel文件的所有sheet表的名字
  2463.   (if excelFile
  2464.     (progn
  2465.       (setq xlapp ($xlapp-New$ NIL nil nil))
  2466.       (setq xlbooks (vl-catch-all-apply
  2467.                       'vlax-get-property
  2468.                       (list xlapp 'Workbooks)
  2469.                     )
  2470.       )
  2471.       (setq xls-open (vl-catch-all-apply
  2472.                        'vlax-invoke-method
  2473.                        (list xlbooks "open" excelFile)
  2474.                      )
  2475.       )
  2476.       (setq sheets (vl-catch-all-apply
  2477.                      'vlax-get-property
  2478.                      (list (vl-catch-all-apply
  2479.                              'vlax-get-property
  2480.                              (list xlapp 'activeworkbook)
  2481.                            )
  2482.                            'Sheets
  2483.                      )
  2484.                    )
  2485.       )
  2486.       (if (not (vl-catch-all-error-p sheets))
  2487.         (progn
  2488.           (setq ns nil)
  2489.           (VLAX-FOR SH sheets
  2490.             (setq ns
  2491.                    (cons (vl-catch-all-apply 'VLA-GET-NAME (list SH)) ns)
  2492.             )
  2493.           )
  2494.           (vl-catch-all-apply
  2495.             (function (lambda ()
  2496.                         (vlax-invoke-method
  2497.                           (vlax-get-property xlapp 'activeworkbook)
  2498.                           'Close
  2499.                         )
  2500.                       )
  2501.             )
  2502.           )
  2503.           (mapcar
  2504.             (function (lambda (x)
  2505.                         (vl-catch-all-apply
  2506.                           (function (lambda ()
  2507.                                       (vlax-release-object x)
  2508.                                     )
  2509.                           )
  2510.                         )
  2511.                       )
  2512.             )
  2513.             (list SH sheets xls-open xlbooks)
  2514.           )
  2515.           (vl-catch-all-apply 'vlax-invoke-method (list xlapp 'Quit))
  2516.           (setq sheets nil)
  2517.           (setq xls-open nil)
  2518.           (setq xlbooks nil)
  2519.           (setq xlapp nil)
  2520.           (gc)
  2521.         )
  2522.       )
  2523.     )
  2524.   )
  2525.   ns
  2526. )
  2527. (defun $excel-lie-kuan$        (sh lks lst)
  2528.                                         ;列宽设置
  2529.                                         ;sh Sheet表对象
  2530.                                         ;($lie-kuan$ SH(LIST(CONS "A1" 15)(CONS "B1" 15)(CONS "C1" 15))NIL)                  
  2531.   (MAPCAR (FUNCTION
  2532.             (LAMBDA (A / RANG)
  2533.               (SETQ RANG
  2534.                      (vl-catch-all-apply
  2535.                        'vlax-get-property
  2536.                        (list sh 'range (CAR A))
  2537.                      )
  2538.               )
  2539.               (vl-catch-all-apply
  2540.                 (function (lambda ()
  2541.                             (vlax-put-property RANG 'ColumnWidth (CDR A))
  2542.                           )
  2543.                 )
  2544.               )
  2545.               (vl-catch-all-apply
  2546.                 (function (lambda ()
  2547.                             (vlax-release-object RANG)
  2548.                           )
  2549.                 )
  2550.               )
  2551.               (SETQ RANG NIL)
  2552.             )
  2553.           )
  2554.           LKS
  2555.   )
  2556. )
  2557. (DEFUN $excel-hang-gao$        (sh rangs lst)
  2558.                                         ;行高设置
  2559.                                         ;sh Sheet表对象
  2560.                                         ;($excel-hang-gao$ SH(LIST(CONS "A1" 15)(CONS "A2" 15)(CONS "A3" 15))NIL)
  2561.   (MAPCAR (FUNCTION
  2562.             (LAMBDA (A / RANG)
  2563.               (SETQ RANG
  2564.                      (vl-catch-all-apply
  2565.                        'vlax-get-property
  2566.                        (list sh 'range (car a))
  2567.                      )
  2568.               )
  2569.               (vl-catch-all-apply
  2570.                 'vlax-PUT-property
  2571.                 (LIST RANG 'RowHeight (cdr a))
  2572.               )
  2573.               (vl-catch-all-apply
  2574.                 (function (lambda ()
  2575.                             (vlax-release-object RANG)
  2576.                           )
  2577.                 )
  2578.               )
  2579.               (SETQ RANG NIL)
  2580.             )
  2581.           )
  2582.           rangs
  2583.   )
  2584. )
  2585. (defun $excel-wen-zi-gao-du$ (sh rangs lst)
  2586.                                         ;文字高度,字体高度,字体大小,文字大小
  2587.                                         ;sh  sheet表对象
  2588.                                         ;rangs  rang单元格以及文字高度
  2589.                                         ;示例 ($excel-wen-zi-gao-du$ sh(list(cons "A1" 12)(cons "J1" 22))nil)
  2590.   (mapcar (function
  2591.             (lambda (a / RANG font)
  2592.               (SETQ RANG (vl-catch-all-apply
  2593.                            'vlax-get-property
  2594.                            (list sh 'range (car a))
  2595.                          )
  2596.               )
  2597.               (setq font
  2598.                      (vl-catch-all-apply 'vlax-get-property (list RANG 'font))
  2599.               )
  2600.               (vlax-put-property font 'size (cdr a))
  2601.               (vl-catch-all-apply 'vlax-release-object (list font))
  2602.               (vl-catch-all-apply 'vlax-release-object (list RANG))
  2603.               (setq font nil)
  2604.               (setq RANG nil)
  2605.             )
  2606.           )
  2607.           rangs
  2608.   )
  2609. )
  2610. (defun $excel-tian-xie-wen-zi$ (sh rang-strs lst)
  2611.                                         ;向单元格写入文字,写文字
  2612.   (mapcar (function (lambda (a / rang-str str)
  2613.                       (setq rang-str (car a))
  2614.                       (setq str (cdr a))
  2615.                       (or str (setq str ""))
  2616.                       (if (and rang-str str)
  2617.                         (vl-catch-all-apply
  2618.                           'vlax-put-property
  2619.                           (list
  2620.                             (vl-catch-all-apply
  2621.                               'vlax-get-property
  2622.                               (list sh 'range rang-str)
  2623.                             )
  2624.                             'value2        ;不是text
  2625.                             (vlax-make-variant str 8)
  2626.                           )
  2627.                         )
  2628.                       )
  2629.                     )
  2630.           )
  2631.           rang-strs
  2632.   )
  2633. )
  2634. (defun $excel-wen-zi-ju-zhong$ (sh rang-str lst / $jz-v-h$)
  2635.                                         ;单元格文字居中
  2636.   (defun $jz-v-h$ (sh rang-str / RANG)
  2637.     (SETQ RANG (vl-catch-all-apply
  2638.                  'vlax-get-property
  2639.                  (list sh 'range rang-str)
  2640.                )
  2641.     )
  2642.     (vl-catch-all-apply
  2643.       'vlax-put-property
  2644.       (list RANG 'HorizontalAlignment -4108)
  2645.     )
  2646.                                         ;水平对齐方式居中
  2647.     (vl-catch-all-apply
  2648.       'vlax-put-property
  2649.       (list RANG "VerticalAlignment" -4108)
  2650.     )
  2651.                                         ;垂直水平方式对齐
  2652.   )
  2653.   (cond        ((and rang-str (= (type rang-str) 'str))
  2654.          ($jz-v-h$ sh rang-str)
  2655.         )
  2656.         ((and rang-str (= (type rang-str) 'list))
  2657.          (mapcar (function (lambda (a) ($jz-v-h$ sh a))) rang-str)
  2658.         )
  2659.   )
  2660. )
  2661. (defun $excel-cha-ru-hang$
  2662.        (sh rang-str row-num lst / rang EntireRow resize)
  2663.                                         ;插入行,批量插入行,插入空行
  2664.                                         ;SH  sheet表格对象
  2665.                                         ;rang-str 单元格字串,比如说 A1
  2666.                                         ;row-num  插入的空行数数字
  2667.   (setq        rang (vl-catch-all-apply
  2668.                'vlax-get-property
  2669.                (list sh 'range rang-str)
  2670.              )
  2671.   )
  2672.   (setq        EntireRow (vl-catch-all-apply
  2673.                     'vlax-get-property
  2674.                     (list rang 'EntireRow)
  2675.                   )
  2676.   )
  2677.   (setq        resize (vl-catch-all-apply
  2678.                  'vlax-get-property
  2679.                  (list EntireRow 'resize row-num)
  2680.                )
  2681.   )
  2682.   (vl-catch-all-apply
  2683.     'vlax-invoke-method
  2684.     (list resize 'Insert)
  2685.   )
  2686.   (vl-catch-all-apply 'vlax-release-object (list resize))
  2687.   (vl-catch-all-apply 'vlax-release-object (list EntireRow))
  2688.   (vl-catch-all-apply 'vlax-release-object (list rang))
  2689.   (setq resize nil)
  2690.   (setq EntireRow nil)
  2691.   (setq rang nil)
  2692. )
  2693. (DEFUN $excel-fu-zhi-dan-yuan-ge$
  2694.        (sh rang-str-old rang-str-new lst / RANG1 RANG2)
  2695.                                         ;复制单元格,单元格复制
  2696.                                         ;sh sheet表格对象
  2697.                                         ;rang-str-old  待复制的源区域,例如 A1:D8
  2698.                                         ;rang-str-new  复制到目标区域的单元格,例如 :A1
  2699.   (SETQ        RANG1 (vl-catch-all-apply
  2700.                 'vlax-get-property
  2701.                 (list sh 'range rang-str-old)
  2702.               )
  2703.   )
  2704.   (SETQ        RANG2 (vl-catch-all-apply
  2705.                 'vlax-get-property
  2706.                 (list sh 'range rang-str-new)
  2707.               )
  2708.   )
  2709.   (vl-catch-all-apply
  2710.     'vlax-invoke-method
  2711.     (list RANG1 'copy RANG2)
  2712.   )
  2713.   (vl-catch-all-apply 'vlax-release-object (list RANG2))
  2714.   (vl-catch-all-apply 'vlax-release-object (list RANG1))
  2715.   (SETQ        RANG1 NIL
  2716.         RANG2 NIL
  2717.   )
  2718. )
  2719. (defun $excel-dan-yuan-ge-yan-se$
  2720.        (sh ranges lst / $dan-yuan-ge-yan-se-RUN$)
  2721.                                         ;单元格颜色,填充颜色
  2722.                                         ;sh sheet表对象
  2723.                                         ;ranges  单元格的颜色,例如(list(cons "A1:C2" 255)(cons "D1" 255))
  2724.   (DEFUN $dan-yuan-ge-yan-se-RUN$ (sh range-str color / RANG Interior)
  2725.     (SETQ RANG
  2726.            (vl-catch-all-apply
  2727.              'vlax-get-property
  2728.              (list sh 'range range-str)
  2729.            )
  2730.     )
  2731.     (SETQ Interior (vl-catch-all-apply
  2732.                      'vlax-get-property
  2733.                      (list RANG 'Interior)
  2734.                    )
  2735.     )
  2736.     (vl-catch-all-apply
  2737.       'vlax-put-property
  2738.       (list
  2739.         Interior
  2740.         'color
  2741.         (vl-catch-all-apply 'vlax-make-variant (list color 5))
  2742.       )
  2743.     )
  2744.     (vl-catch-all-apply 'vlax-release-object (list RANG))
  2745.     (setq RANG nil)
  2746.   )
  2747.   (mapcar (function
  2748.             (lambda (a)
  2749.               ($dan-yuan-ge-yan-se-RUN$ sh (car a) (cdr a))
  2750.             )
  2751.           )
  2752.           ranges
  2753.   )
  2754. )

评分

参与人数 5明经币 +5 收起 理由
bssurvey + 1 很给力!
JUN1 + 1 很给力!
USER2128 + 1 很给力!
cghdy + 1
ssyfeng + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-4-20 08:27 | 显示全部楼层
感谢大佬的无私分享  谢谢
发表于 2024-4-18 09:25 | 显示全部楼层

吃瓜群众也留个神国坐标
发表于 2024-4-17 13:52 | 显示全部楼层
感谢分享,十分好贴!
发表于 2024-4-16 16:26 | 显示全部楼层
这回我看懂了。
发表于 2024-4-16 17:00 | 显示全部楼层
前排占座招租
发表于 2024-4-16 17:19 | 显示全部楼层
先收藏再学习 !!
发表于 2024-4-16 18:39 | 显示全部楼层
吃瓜群众也占座
发表于 2024-4-16 19:13 | 显示全部楼层
感谢杜总的分享!
发表于 2024-4-17 00:15 | 显示全部楼层
感谢大佬分享
发表于 2024-4-17 11:31 | 显示全部楼层
感谢杜总分享。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-30 19:31 , Processed in 0.738769 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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