天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 41|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    19 分钟前
  • 签到天数: 82 天

    [LV.6]常住居民II

    1564

    主题

    204

    回帖

    214748万

    积分

    管理员

    积分
    2147483647
    发表于 2024-4-17 08:00:51 | 显示全部楼层 |阅读模式
    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.   )          ;<a href="https://learn.microsoft.com/zh-cn/office/vba/api/excel.xlfileformat" target="_blank">https://learn.microsoft.com/zh-c ... /excel.xlfileformat</a>有详细说明
    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. )
    复制代码

     

     

     

     

    [源码] Lisp与Excel通信的相关函数
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-5-16 08:21 , Processed in 0.066614 second(s), 21 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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