明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3297|回复: 15

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

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

工作中的笔记分享,大家一起整理吧
  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.    "C:\\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-app$ "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-cha-ru-tu-pian2$
  2033.              (xlapp  excelFile  sh-n  bmp-f
  2034.         lef  top  w  h  lst
  2035.         /  sh  shapes  xlbook  xlbooks
  2036.              )
  2037.   (or (and lef (= (type lef) 'int)) (setq lef 0))
  2038.   (or (and top (= (type top) 'int)) (setq top 0))
  2039.   (or (and w (= (type w) 'int)) (setq w 100))
  2040.   (or (and h (= (type h) 'int)) (setq h 100))
  2041.   (if (and excelFile
  2042.      (findfile excelFile)
  2043.      bmp-f
  2044.      (findfile bmp-f)
  2045.       )
  2046.     (progn
  2047.       (or xlapp (setq xlapp ($xlapp-New$ 1 nil nil)))
  2048.       (setq xlbooks (vl-catch-all-apply
  2049.           'vlax-get-property
  2050.           (list xlapp 'Workbooks)
  2051.         )
  2052.       )
  2053.       (setq xlbook (vl-catch-all-apply
  2054.          'vlax-invoke-method
  2055.          (list xlbooks "open" excelFile)
  2056.        )
  2057.       )          ;打开指定的excel文件
  2058.       (setq SH
  2059.        (vl-catch-all-apply
  2060.          'vlax-get-property
  2061.          (list (vl-catch-all-apply
  2062.            'vlax-get-property
  2063.            (list xlbook 'Sheets)
  2064.          )
  2065.          'Item
  2066.          sh-n
  2067.          )
  2068.        )
  2069.       )
  2070.       (setq Shapes
  2071.        (vl-catch-all-apply 'vlax-get-property (list sh 'Shapes))
  2072.       )
  2073.       (vl-catch-all-apply
  2074.   'vlax-invoke-method
  2075.   (list
  2076.     Shapes 'AddPicture bmp-f 0 1 0 0 w h)
  2077.       )
  2078.       (vl-catch-all-apply 'vlax-release-object (list Shapes))
  2079.       (vl-catch-all-apply 'vlax-release-object (list SH))
  2080.       (vl-catch-all-apply 'vlax-release-object (list xlbook))
  2081.     )
  2082.   )
  2083.   xlapp
  2084. )
  2085. (defun $excel-add-vba$
  2086.        (xlapp sh-n VBA-STR run-str lst / item vbproject xlsheet)
  2087.           ;向excel里面写vba代码,注入vba代码
  2088. ;;;  ($excel-add-vba$
  2089. ;;;  xlapp
  2090. ;;;  "Sub Lisp_vba()\nMsgBox \"Hello world!\", vbOKOnly, \"Lisp调用Excel\"\nEnd Sub"
  2091. ;;;  "(vlax-invoke-method XLAPP (QUOTE RUN) \"Sheet1.Lisp_vba\")"
  2092. ;;;  "Sheet1"
  2093. ;;;  nil
  2094. ;;; )
  2095.   (or xlapp (setq xlapp ($xlapp-New$ nil nil nil)))
  2096.   (setq  xlsheet
  2097.    (vl-catch-all-apply
  2098.      'vlax-get-property
  2099.      (list (vl-catch-all-apply
  2100.        'vlax-get-property
  2101.        (list (vl-catch-all-apply
  2102.          'vlax-get-property
  2103.          (list xlapp 'activeworkbook)
  2104.        )
  2105.        'Sheets
  2106.        )
  2107.      )
  2108.      'Item
  2109.      sh-n
  2110.      )
  2111.    )
  2112.   )
  2113.   (setq  VBProject
  2114.    (vl-catch-all-apply
  2115.      'vlax-get-property
  2116.      (list
  2117.        (vl-catch-all-apply
  2118.          'vlax-get-property
  2119.          (list xlapp
  2120.          "ActiveWorkbook"
  2121.          )
  2122.        )
  2123.        'VBProject
  2124.      )
  2125.    )
  2126.   )
  2127.   (setq  Item (vl-catch-all-apply
  2128.          'vlax-invoke-method
  2129.          (LIST
  2130.      (vl-catch-all-apply
  2131.        'vlax-get-property
  2132.        (LIST
  2133.          VBProject
  2134.          'VBComponents
  2135.        )
  2136.      )
  2137.      'Item
  2138.      sh-n
  2139.          )
  2140.        )
  2141.   )
  2142.   (vl-catch-all-apply
  2143.     'vlax-invoke-method
  2144.     (LIST
  2145.       (vl-catch-all-apply
  2146.   'vlax-get-property
  2147.   (LIST
  2148.     Item
  2149.     'CodeModule
  2150.   )
  2151.       )
  2152.       'DeleteLines
  2153.       1
  2154.       (vl-catch-all-apply
  2155.   'vlax-get-property
  2156.   (LIST
  2157.     (vl-catch-all-apply
  2158.       'vlax-get-property
  2159.       (LIST
  2160.         Item
  2161.         'CodeModule
  2162.       )
  2163.     )
  2164.     'CountOfLines
  2165.   )
  2166.       )
  2167.     )
  2168.   )          ;删除历史的vba代码
  2169.   (vl-catch-all-apply
  2170.     'vlax-invoke-method
  2171.     (LIST
  2172.       (vl-catch-all-apply
  2173.   'vlax-get-property
  2174.   (LIST
  2175.     Item
  2176.     'CodeModule
  2177.   )
  2178.       )
  2179.       'AddFromString
  2180.       VBA-STR
  2181.     )
  2182.   )
  2183.   (vl-catch-all-apply
  2184.     'EVAL
  2185.     (list (vl-catch-all-apply 'READ (list run-str)))
  2186.   )
  2187.   (vl-catch-all-apply
  2188.     'vlax-get-property
  2189.     (LIST
  2190.       (vl-catch-all-apply
  2191.   'vlax-get-property
  2192.   (LIST
  2193.     Item
  2194.     'CodeModule
  2195.   )
  2196.       )
  2197.       'CountOfLines
  2198.     )
  2199.   )          ;返回写入成功的行数
  2200. )
  2201. (defun $excel-vba-run$ (XLAPP vba-str lst)
  2202.           ;执行vba代码
  2203.           ;vba-str为字串型,发挥空间很大,为啥用字串型?主要是因为需要执行的vba函数可能需要传参,没法知道到底要传入多少个参数,所以,干脆用字串型,传入的时候自己包装好,传入进来就可以了 ,例如:"(vlax-invoke-method XLAPP (QUOTE RUN) \"Sheet1.Lisp_vba\")"
  2204.   (vl-catch-all-apply
  2205.     'EVAL
  2206.     (list (vl-catch-all-apply 'READ (list vba-str)))
  2207.   )
  2208. )
  2209. (defun $excel-rang-copy$
  2210.        (xlapp       SH-N-O  SH-N-new   address-o
  2211.         address-n  lst  /     xlsheet1
  2212.         xlsheet2
  2213.        )
  2214.           ;单元格复制
  2215.           ;SH-N-O原sheet表名
  2216.           ;SH-N-new 新的目标sheet表名
  2217.           ;address-o原复制单元格地址
  2218.           ;address-n 新的单元格地址
  2219.   (or xlapp (setq xlapp ($xlapp-New$ NIL nil nil)))
  2220.   (or SH-N-new (setq SH-N-new SH-N-O))
  2221.   (setq  xlsheet1
  2222.    (vl-catch-all-apply
  2223.      'vlax-get-property
  2224.      (list (vl-catch-all-apply
  2225.        'vlax-get-property
  2226.        (list (vl-catch-all-apply
  2227.          'vlax-get-property
  2228.          (list xlapp 'activeworkbook)
  2229.        )
  2230.        'Sheets
  2231.        )
  2232.      )
  2233.      'Item
  2234.      SH-N-O
  2235.      )
  2236.    )
  2237.   )
  2238.   (setq  xlsheet2
  2239.    (vl-catch-all-apply
  2240.      'vlax-get-property
  2241.      (list (vl-catch-all-apply
  2242.        'vlax-get-property
  2243.        (list (vl-catch-all-apply
  2244.          'vlax-get-property
  2245.          (list xlapp 'activeworkbook)
  2246.        )
  2247.        'Sheets
  2248.        )
  2249.      )
  2250.      'Item
  2251.      SH-N-new
  2252.      )
  2253.    )
  2254.   )
  2255.   (vl-catch-all-apply
  2256.     'vlax-invoke-method
  2257.     (list (vl-catch-all-apply
  2258.       'msxlp-get-range
  2259.       (list xlsheet1 address-o)
  2260.     )
  2261.     'copy
  2262.     (vl-catch-all-apply
  2263.       'msxlp-get-range
  2264.       (list xlsheet2 address-n)
  2265.     )
  2266.     )
  2267.   )
  2268. )
  2269. (defun $excel-zi-dong-tian-chong$ (xlapp     sh-n      rang-start
  2270.            rows       c-cz      XlAutoFillType
  2271.            lst       /         co
  2272.            nums       rang-end  row
  2273.            strs       xlsheet
  2274.           )
  2275.           ;自动填充
  2276.           ;xlapp             excel的对象
  2277.           ;sh-n              sheet的表名字
  2278.           ;rang-start        起始单元格,字串格式
  2279.           ;rows               函数,如果传入了这个,就不用传入c-cz的值了,这个变量优先
  2280.           ;c-cz              参照列,用来计算最大行的行号
  2281.           ;XlAutoFillType    填充模式
  2282.           ;lst               预留参数
  2283.           ;($excel-zi-dong-tian-chong$  nil "Sheet1" "C1" "A65536" 6 NIL)
  2284.   (or XlAutoFillType (setq XlAutoFillType 6))
  2285.   (or c-cz (setq c-cz "A65536"))  ;参照列,用来计算最下面哪一行的行号
  2286.   (or xlapp (setq xlapp ($xlapp-New$ NIL nil nil))) ;EXCEL对象
  2287.   (setq  xlsheet
  2288.    (vl-catch-all-apply
  2289.      'vlax-get-property
  2290.      (list (vl-catch-all-apply
  2291.        'vlax-get-property
  2292.        (list (vl-catch-all-apply
  2293.          'vlax-get-property
  2294.          (list xlapp 'activeworkbook)
  2295.        )
  2296.        'Sheets
  2297.        )
  2298.      )
  2299.      'Item
  2300.      sh-n
  2301.      )
  2302.    )
  2303.   )          ;根据传入进来的表名字获取表对象
  2304.   (cond  ((and rows (= (type rows) 'str) (= (type (read rows)) 'int))
  2305.           ;传入进来是字串格式,同时read后是int格式
  2306.    t
  2307.   )
  2308.   ((and rows (= (type rows) 'str) (= (type (read rows)) 'int))
  2309.           ;传入进来的就是int格式
  2310.    t
  2311.   )
  2312.   ((and rows (= (type rows) 'int)) ;传入进来的就是int格式
  2313.    (setq rows (vl-princ-to-string rows)) ;转换为字串格式
  2314.   )
  2315.   (t
  2316.    (setq rows (vl-princ-to-string
  2317.           (vlax-get-property
  2318.       (vlax-get-property
  2319.         (msxlp-get-range xlsheet c-cz)
  2320.         'End
  2321.         3
  2322.       )
  2323.       'Row
  2324.           )
  2325.         )
  2326.    )        ;自动根据参照列计算最大行的行号
  2327.   )
  2328.   )          ;填充的最大行数
  2329.   (setq nums nil)
  2330.   (setq  strs (MAPCAR 'vl-list->string
  2331.          (mapcar 'list (vl-string->list rang-start))
  2332.        )
  2333.   )          ;转为字串表
  2334.   (setq strs (reverse strs))    ;倒置
  2335.   (while (and strs (= (type (read (car strs))) 'int))
  2336.     (setq nums (cons (car strs) nums))  ;找到数字,其实就是起始行号
  2337.     (setq strs (cdr strs))
  2338.   )
  2339.   (setq co (apply 'strcat (reverse strs))) ;得到起始列号
  2340.   (setq row (apply 'strcat (reverse nums))) ;得到起始行号
  2341.   (and rang-start
  2342.        co
  2343.        rows
  2344.        (setq rang-end (strcat rang-start ":" co rows))
  2345.   )          ;计算填充的最大行号
  2346.   (vl-catch-all-apply
  2347.     'vlax-invoke-method
  2348.     (LIST (vl-catch-all-apply
  2349.       'msxlp-get-range
  2350.       (list xlsheet rang-start)
  2351.     )
  2352.     'AutoFill
  2353.     (vl-catch-all-apply
  2354.       'msxlp-get-range
  2355.       (list xlsheet rang-end)
  2356.     )
  2357.     XlAutoFillType
  2358.     )
  2359.   )          ;执行填充
  2360. )
  2361. (defun $excel-dan-yuan-ge-pi-zhu$
  2362.        (xlapp sh-n address-str-h lst / $set-font-size$ xlsheet zt)
  2363.           ;Excel单元格插入批注
  2364.           ;xlapp excel对象
  2365.           ;sh-n 表的名字
  2366.           ;address-str-h  三个值:单元格地址、字串、文字大小
  2367.           ;lst 预留参数
  2368.           ;($excel-dan-yuan-ge-pi-zhu$  xlapp  "Sheet2"(list(list "A1" "中线CAD:\n这个列不能删除,删除后将会带来灾乱性后果")(list "B2" "秦始皇:\n您好呀,我是批注"))nil)
  2369.   (defun $set-font-size$ (range h)
  2370.     (vl-catch-all-apply
  2371.       'vlax-put-property
  2372.       (list
  2373.   (vl-catch-all-apply
  2374.     'vlax-get-property
  2375.     (list
  2376.       (vl-catch-all-apply
  2377.         'vlax-invoke-method
  2378.         (list
  2379.     (vl-catch-all-apply
  2380.       'vlax-get-property
  2381.       (list
  2382.         (vl-catch-all-apply
  2383.           'vlax-get-property
  2384.           (list
  2385.       (vl-catch-all-apply
  2386.         'vlax-get-property
  2387.         (list range 'Comment)
  2388.       )
  2389.       'Shape
  2390.           )
  2391.         )
  2392.         'TextFrame
  2393.       )
  2394.     )
  2395.     'Characters
  2396.         )
  2397.       )
  2398.       'font
  2399.     )
  2400.   )
  2401.   'size
  2402.   h        ;文字高度
  2403.       )
  2404.     )
  2405.   )
  2406.   (or xlapp (setq xlapp ($xlapp-New$ NIL nil nil)))
  2407.   (setq  xlsheet
  2408.    (vl-catch-all-apply
  2409.      'vlax-get-property
  2410.      (list (vl-catch-all-apply
  2411.        'vlax-get-property
  2412.        (list (vl-catch-all-apply
  2413.          'vlax-get-property
  2414.          (list xlapp 'activeworkbook)
  2415.        )
  2416.        'Sheets
  2417.        )
  2418.      )
  2419.      'Item
  2420.      sh-n
  2421.      )
  2422.    )
  2423.   )          ;工作表对象
  2424.   (setq  zt (mapcar (function (lambda (a / address str h range zt)
  2425.              (setq address (car a))
  2426.              (setq str (cadr a))
  2427.              (setq h (caddr a))
  2428.              (or h (setq h 8))
  2429.              (if str
  2430.          (progn
  2431.            (SETQ
  2432.              range (vl-catch-all-apply
  2433.                'msxlp-get-range
  2434.                (list xlsheet address)
  2435.              )
  2436.            )  ;单元格对象
  2437.            (vl-catch-all-apply
  2438.              'vlax-invoke-method
  2439.              (list range 'ClearComments)
  2440.            )  ;删除历史批注  
  2441.            (setq zt (vl-catch-all-apply
  2442.                 'vlax-invoke-method
  2443.                 (list
  2444.             range
  2445.             'AddComment.Text
  2446.             str
  2447.                 )
  2448.               )
  2449.            )  ;添加批注
  2450.            ($set-font-size$ range h)
  2451.          )
  2452.              )
  2453.              zt
  2454.            )
  2455.        )
  2456.        address-str-h
  2457.      )
  2458.   )
  2459.   zt
  2460. )
  2461. (defun $csv>xls$ (xlapp csv-f xls-f / f hzm i wb wjm xlapp-old)
  2462.           ;csv转xls,csv转excel
  2463.   (setq xlapp-old xlapp)
  2464.   (if (and csv-f (findfile csv-f))
  2465.     (progn
  2466.       (if (findfile xls-f)
  2467.   (progn
  2468.     (setq f (vl-filename-directory xls-f))
  2469.     (setq wjm (vl-filename-base xls-f))
  2470.     (setq hzm ".xls")
  2471.     (setq i 1)
  2472.     (while
  2473.       (and
  2474.         (findfile (setq xls-f (strcat f "\\" wjm (itoa i) hzm)))
  2475.       )
  2476.        (setq i (1+ i))
  2477.     )
  2478.   )
  2479.       )
  2480.       (or xlapp (setq xlapp ($xlapp-New$ NIL nil nil)))
  2481.       (setq wb (vl-catch-all-apply
  2482.      'vlax-invoke-method
  2483.      (list (vl-catch-all-apply
  2484.        'vlax-get-property
  2485.        (list xlapp 'Workbooks)
  2486.            )
  2487.            "open"
  2488.            csv-f
  2489.      )
  2490.          )
  2491.       )
  2492.       (vl-catch-all-apply
  2493.   'vlax-put-property
  2494.   (LIST xlapp 'DisplayAlerts :vlax-False)
  2495.       )          ;保存的时候不弹出警告窗口
  2496.       (vl-catch-all-apply
  2497.   'vlax-invoke-method
  2498.   (list
  2499.     wb "SaveAs" xls-f msxlc-xlNormal "" "" :vlax-False :vlax-False
  2500.     nil)
  2501.       )
  2502.       (vl-catch-all-apply 'vlax-invoke-method (list wb 'close))
  2503.       (vl-catch-all-apply 'vlax-release-object (list wb))
  2504.       (if xlapp-old
  2505.   ()
  2506.   (vl-catch-all-apply 'vlax-release-object (list xlapp))
  2507.       )
  2508.       (if xls-f
  2509.   (findfile xls-f)
  2510.       )
  2511.     )
  2512.   )
  2513. )
  2514. (defun $get-xls-sheets$  (excelFile / ns sheets xlapp xlbooks xls-open)
  2515.           ;获取excel文件的所有sheet表的名字
  2516.   (if excelFile
  2517.     (progn
  2518.       (setq xlapp ($xlapp-New$ NIL nil nil))
  2519.       (setq xlbooks (vl-catch-all-apply
  2520.           'vlax-get-property
  2521.           (list xlapp 'Workbooks)
  2522.         )
  2523.       )
  2524.       (setq xls-open (vl-catch-all-apply
  2525.            'vlax-invoke-method
  2526.            (list xlbooks "open" excelFile)
  2527.          )
  2528.       )
  2529.       (setq sheets (vl-catch-all-apply
  2530.          'vlax-get-property
  2531.          (list (vl-catch-all-apply
  2532.            'vlax-get-property
  2533.            (list xlapp 'activeworkbook)
  2534.          )
  2535.          'Sheets
  2536.          )
  2537.        )
  2538.       )
  2539.       (if (not (vl-catch-all-error-p sheets))
  2540.   (progn
  2541.     (setq ns nil)
  2542.     (VLAX-FOR SH sheets
  2543.       (setq ns
  2544.        (cons (vl-catch-all-apply 'VLA-GET-NAME (list SH)) ns)
  2545.       )
  2546.     )
  2547.     (vl-catch-all-apply
  2548.       (function (lambda ()
  2549.       (vlax-invoke-method
  2550.         (vlax-get-property xlapp 'activeworkbook)
  2551.         'Close
  2552.       )
  2553.           )
  2554.       )
  2555.     )
  2556.     (mapcar
  2557.       (function (lambda (x)
  2558.       (vl-catch-all-apply
  2559.         (function (lambda ()
  2560.               (vlax-release-object x)
  2561.             )
  2562.         )
  2563.       )
  2564.           )
  2565.       )
  2566.       (list SH sheets xls-open xlbooks)
  2567.     )
  2568.     (vl-catch-all-apply 'vlax-invoke-method (list xlapp 'Quit))
  2569.     (setq sheets nil)
  2570.     (setq xls-open nil)
  2571.     (setq xlbooks nil)
  2572.     (setq xlapp nil)
  2573.     (gc)
  2574.   )
  2575.       )
  2576.     )
  2577.   )
  2578.   ns
  2579. )
  2580. (defun $excel-lie-kuan$  (sh lks lst)
  2581.           ;列宽设置
  2582.           ;sh Sheet表对象
  2583.           ;($lie-kuan$ SH(LIST(CONS "A1" 15)(CONS "B1" 15)(CONS "C1" 15))NIL)      
  2584.   (MAPCAR (FUNCTION
  2585.       (LAMBDA (A / RANG)
  2586.         (SETQ RANG
  2587.          (vl-catch-all-apply
  2588.            'vlax-get-property
  2589.            (list sh 'range (CAR A))
  2590.          )
  2591.         )
  2592.         (vl-catch-all-apply
  2593.     (function (lambda ()
  2594.           (vlax-put-property RANG 'ColumnWidth (CDR A))
  2595.         )
  2596.     )
  2597.         )
  2598.         (vl-catch-all-apply
  2599.     (function (lambda ()
  2600.           (vlax-release-object RANG)
  2601.         )
  2602.     )
  2603.         )
  2604.         (SETQ RANG NIL)
  2605.       )
  2606.     )
  2607.     LKS
  2608.   )
  2609. )
  2610. (DEFUN $excel-hang-gao$  (sh rangs lst)
  2611.           ;行高设置
  2612.           ;sh Sheet表对象
  2613.           ;($excel-hang-gao$ SH(LIST(CONS "A1" 15)(CONS "A2" 15)(CONS "A3" 15))NIL)
  2614.   (MAPCAR (FUNCTION
  2615.       (LAMBDA (A / RANG)
  2616.         (SETQ RANG
  2617.          (vl-catch-all-apply
  2618.            'vlax-get-property
  2619.            (list sh 'range (car a))
  2620.          )
  2621.         )
  2622.         (vl-catch-all-apply
  2623.     'vlax-PUT-property
  2624.     (LIST RANG 'RowHeight (cdr a))
  2625.         )
  2626.         (vl-catch-all-apply
  2627.     (function (lambda ()
  2628.           (vlax-release-object RANG)
  2629.         )
  2630.     )
  2631.         )
  2632.         (SETQ RANG NIL)
  2633.       )
  2634.     )
  2635.     rangs
  2636.   )
  2637. )
  2638. (defun $excel-wen-zi-gao-du$ (sh rangs lst)
  2639.           ;文字高度,字体高度,字体大小,文字大小
  2640.           ;sh  sheet表对象
  2641.           ;rangs  rang单元格以及文字高度
  2642.           ;示例 ($excel-wen-zi-gao-du$ sh(list(cons "A1" 12)(cons "J1" 22))nil)
  2643.   (mapcar (function
  2644.       (lambda (a / RANG font)
  2645.         (SETQ RANG (vl-catch-all-apply
  2646.          'vlax-get-property
  2647.          (list sh 'range (car a))
  2648.        )
  2649.         )
  2650.         (setq font
  2651.          (vl-catch-all-apply 'vlax-get-property (list RANG 'font))
  2652.         )
  2653.         (vlax-put-property font 'size (cdr a))
  2654.         (vl-catch-all-apply 'vlax-release-object (list font))
  2655.         (vl-catch-all-apply 'vlax-release-object (list RANG))
  2656.         (setq font nil)
  2657.         (setq RANG nil)
  2658.       )
  2659.     )
  2660.     rangs
  2661.   )
  2662. )
  2663. (defun $excel-tian-xie-wen-zi$ (sh rang-strs lst)
  2664.           ;向单元格写入文字,写文字
  2665.   (mapcar (function (lambda (a / rang-str str)
  2666.           (setq rang-str (car a))
  2667.           (setq str (cdr a))
  2668.           (or str (setq str ""))
  2669.           (if (and rang-str str)
  2670.       (vl-catch-all-apply
  2671.         'vlax-put-property
  2672.         (list
  2673.           (vl-catch-all-apply
  2674.             'vlax-get-property
  2675.             (list sh 'range rang-str)
  2676.           )
  2677.           'value2  ;不是text
  2678.           (vlax-make-variant str 8)
  2679.         )
  2680.       )
  2681.           )
  2682.         )
  2683.     )
  2684.     rang-strs
  2685.   )
  2686. )
  2687. (defun $excel-wen-zi-ju-zhong$ (sh rang-str lst / $jz-v-h$)
  2688.           ;单元格文字居中
  2689.   (defun $jz-v-h$ (sh rang-str / RANG)
  2690.     (SETQ RANG (vl-catch-all-apply
  2691.      'vlax-get-property
  2692.      (list sh 'range rang-str)
  2693.          )
  2694.     )
  2695.     (vl-catch-all-apply
  2696.       'vlax-put-property
  2697.       (list RANG 'HorizontalAlignment -4108)
  2698.     )
  2699.           ;水平对齐方式居中
  2700.     (vl-catch-all-apply
  2701.       'vlax-put-property
  2702.       (list RANG "VerticalAlignment" -4108)
  2703.     )
  2704.           ;垂直水平方式对齐
  2705.   )
  2706.   (cond  ((and rang-str (= (type rang-str) 'str))
  2707.    ($jz-v-h$ sh rang-str)
  2708.   )
  2709.   ((and rang-str (= (type rang-str) 'list))
  2710.    (mapcar (function (lambda (a) ($jz-v-h$ sh a))) rang-str)
  2711.   )
  2712.   )
  2713. )
  2714. (defun $excel-cha-ru-hang$
  2715.        (sh rang-str row-num lst / rang EntireRow resize)
  2716.           ;插入行,批量插入行,插入空行
  2717.           ;SH  sheet表格对象
  2718.           ;rang-str 单元格字串,比如说 A1
  2719.           ;row-num  插入的空行数数字
  2720.   (setq  rang (vl-catch-all-apply
  2721.          'vlax-get-property
  2722.          (list sh 'range rang-str)
  2723.        )
  2724.   )
  2725.   (setq  EntireRow (vl-catch-all-apply
  2726.         'vlax-get-property
  2727.         (list rang 'EntireRow)
  2728.       )
  2729.   )
  2730.   (setq  resize (vl-catch-all-apply
  2731.      'vlax-get-property
  2732.      (list EntireRow 'resize row-num)
  2733.          )
  2734.   )
  2735.   (vl-catch-all-apply
  2736.     'vlax-invoke-method
  2737.     (list resize 'Insert)
  2738.   )
  2739.   (vl-catch-all-apply 'vlax-release-object (list resize))
  2740.   (vl-catch-all-apply 'vlax-release-object (list EntireRow))
  2741.   (vl-catch-all-apply 'vlax-release-object (list rang))
  2742.   (setq resize nil)
  2743.   (setq EntireRow nil)
  2744.   (setq rang nil)
  2745. )
  2746. (DEFUN $excel-fu-zhi-dan-yuan-ge$
  2747.        (sh rang-str-old rang-str-new lst / RANG1 RANG2)
  2748.           ;复制单元格,单元格复制
  2749.           ;sh sheet表格对象
  2750.           ;rang-str-old  待复制的源区域,例如 A1:D8
  2751.           ;rang-str-new  复制到目标区域的单元格,例如 :A1
  2752.   (SETQ  RANG1 (vl-catch-all-apply
  2753.     'vlax-get-property
  2754.     (list sh 'range rang-str-old)
  2755.         )
  2756.   )
  2757.   (SETQ  RANG2 (vl-catch-all-apply
  2758.     'vlax-get-property
  2759.     (list sh 'range rang-str-new)
  2760.         )
  2761.   )
  2762.   (vl-catch-all-apply
  2763.     'vlax-invoke-method
  2764.     (list RANG1 'copy RANG2)
  2765.   )
  2766.   (vl-catch-all-apply 'vlax-release-object (list RANG2))
  2767.   (vl-catch-all-apply 'vlax-release-object (list RANG1))
  2768.   (SETQ  RANG1 NIL
  2769.   RANG2 NIL
  2770.   )
  2771. )
  2772. (defun $excel-dan-yuan-ge-yan-se$
  2773.        (sh ranges lst / $dan-yuan-ge-yan-se-RUN$)
  2774.           ;单元格颜色,填充颜色
  2775.           ;sh sheet表对象
  2776.           ;ranges  单元格的颜色,例如(list(cons "A1:C2" 255)(cons "D1" 255))
  2777.   (DEFUN $dan-yuan-ge-yan-se-RUN$ (sh range-str color / RANG Interior)
  2778.     (SETQ RANG
  2779.      (vl-catch-all-apply
  2780.        'vlax-get-property
  2781.        (list sh 'range range-str)
  2782.      )
  2783.     )
  2784.     (SETQ Interior (vl-catch-all-apply
  2785.          'vlax-get-property
  2786.          (list RANG 'Interior)
  2787.        )
  2788.     )
  2789.     (vl-catch-all-apply
  2790.       'vlax-put-property
  2791.       (list
  2792.   Interior
  2793.   'color
  2794.   (vl-catch-all-apply 'vlax-make-variant (list color 5))
  2795.       )
  2796.     )
  2797.     (vl-catch-all-apply 'vlax-release-object (list RANG))
  2798.     (setq RANG nil)
  2799.   )
  2800.   (mapcar (function
  2801.       (lambda (a)
  2802.         ($dan-yuan-ge-yan-se-RUN$ sh (car a) (cdr a))
  2803.       )
  2804.     )
  2805.     ranges
  2806.   )
  2807. )

评分

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

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-4-20 08:27:48 | 显示全部楼层
感谢大佬的无私分享  谢谢
发表于 2024-5-12 15:21:25 | 显示全部楼层
吃瓜群众也留个神国坐标
发表于 2024-4-18 09:25:37 | 显示全部楼层

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

本版积分规则

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

GMT+8, 2024-11-25 08:43 , Processed in 0.264019 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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