找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 525|回复: 0

[LISP程序]:关于在VLISP内操作EXCEL的示范性代码

[复制链接]
发表于 2003-11-25 12:51:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
关于在VLISP内操作EXCEL的示范性代码

  1. ;;;Moss Designs
  2. ;;;[url]www.mossdesigns.com[/url]
  3. ;;;December 2002
  4. ;;;This routine allows the user to select an Excel spreadsheet.
  5. ;;;The spreadsheet data is then imported into your AutoCAD drawing and placed as a block
  6. ;;;;

  7. (defun placetext ()
  8.   (setq textno 0)
  9.   (setq text-item (nth textno row-list))
  10.   (setq newpt ins-point)
  11.    (if (numberp text-item)
  12.       (setq text-item (rtos text-item 2 0 ))
  13.     )
  14.   (setq counter 0)
  15.   
  16.   (while (< textno list-len)

  17.     (if        (= th nil)
  18.       (command "text" newpt "" "" text-item "")
  19.     )
  20.     (if (/= th nil)
  21.             (command "text" newpt "" "" text-item "")
  22.     )
  23.     ; set up column x points
  24.     (setq x-pt (car newpt))
  25.     (setq colx-list (append colx-list (list x-pt)))
  26.     (setq text (entlast))
  27.     (setq block-list (append block-list (list text)))
  28.     (setq text-list (entget text))
  29.     (setq texth (cdr (assoc 40 text-list)))
  30.     (setq texth (+ 0.15 texth))
  31.     (setq text-length (strlen text-item))
  32.     (setq col-wid (* text-length 0.25))
  33.     (setq x-pt (+ x-pt col-wid))
  34.     (setq y-pt (cadr ins-point))
  35.     (setq newpt (list x-pt y-pt))
  36.     (setq textno (+ 1 textno))
  37.     (setq text-item (nth textno row-list))
  38.     (if (numberp text-item)
  39.       (setq text-item (rtos text-item 2 0 ))
  40.     )
  41.   )                                        ; end while  
  42. )
  43. ;;;;
  44. ;;;;****************************************************************

  45. (defun placetext2 ()
  46.   (setq textno 0)
  47.   (setq text-item (nth textno row-list))
  48.   (setq y-pt (- y-pt texth))
  49.   (setq xno 0)
  50.   (setq x-pt (nth xno colx-list))
  51.   (setq ins-point (list x-pt y-pt))
  52.   (setq newpt ins-point)
  53.   
  54.    (if (numberp text-item)
  55.       (setq text-item (rtos text-item 2 0 ))
  56.     )
  57.   (setq counter 0)
  58.   
  59.   (while (< textno list-len)

  60.     (if        (= th nil)
  61.       (command "text" newpt "" "" text-item "")
  62.     )
  63.     (if (/= th nil)
  64.             (command "text" newpt "" "" text-item "")
  65.     )
  66.     ; set up column x points
  67.     (setq text (entlast))
  68.     (setq block-list (append block-list (list text)))
  69.     (setq text-list (entget text))
  70.     (setq xno (+ xno 1))
  71.     (setq x-pt (nth xno colx-list))
  72.     (setq newpt (list x-pt y-pt))
  73.     (setq textno (+ 1 textno))
  74.     (setq text-item (nth textno row-list))
  75.     (if (numberp text-item)
  76.       (setq text-item (rtos text-item 2 0 ))
  77.     )

  78.   )                                        ; end while
  79.   
  80. ); end defun
  81. ;
  82. (defun Link_2_Excel ()
  83.   (vl-load-com)
  84.   (setq refname "excel9.olb")
  85.   (setq
  86.     fil        (findfile
  87.           "c:/program files/Microsoft Office/Office/excel9.olb"
  88.         )
  89.   )
  90.   (if (= fil nil)                        ; then excel file not found
  91.     (setq
  92.       fil (getfiled "Locate Excel application" "excel9" "olb" 8)
  93.     )
  94.    
  95.   )
  96.   (if (not excm-open)
  97.     (vlax-import-type-library
  98.       :tlb-filename        fil                  :methods-prefix
  99.       "excm-"                :properties-prefix
  100.       "excp-"                :constants-prefix "excc-"
  101.      )
  102.   )
  103.   (setq excelApp (vlax-create-object "Excel.Application"))
  104.   (setq oWbks (vlax-get-property excelApp 'Workbooks))
  105.   (setq
  106.     filepath (getfiled "Select Excel file to insert"
  107.                        ""
  108.                        "xls"
  109.                        4
  110.              )
  111.   )
  112.   (setq oWbk (excm-open oWbks filepath))
  113.   (vla-Put-Visible excelApp 1) ; hide excel session
  114.   (setq oWkshts (vlax-get-property oWbk 'Worksheets))
  115.   (setq oWksht (excp-get-item oWkshts 1))
  116.   

  117. ;; get information from spreadsheet

  118. (setq oRng (excp-get-range oWksht "A1:Z1"))
  119.   (setq array (excp-get-value oRng))        ;array is a safearray variant filled with variants
  120.   (vlax-release-object oRng)

  121.                                         ;conversion
  122.   (setq sfarray (vlax-variant-value array))
  123.   (setq valList (car (vlax-safearray->list sfarray)))
  124.   (setq entry 0)
  125.   (setq row-list nil)
  126.   (while (/= entry nil)
  127.     (progn
  128.       (setq var (nth entry valList))
  129.       (setq cellVal (vlax-variant-value var)) ; get value in cell
  130.       (if (/= cellVal nil)
  131.         (progn
  132.           (setq row-list (append row-list (list cellVal)))
  133.           (setq entry (+ 1 entry))
  134.         )                                ;end progn
  135.       )                                        ;end if
  136.       (if (= cellVal nil)
  137.         (setq entry nil)
  138.       )
  139.     )                                        ; end progn
  140.   )                                        ; end while
  141. (setq list-len (length row-list))
  142. (setq ins-point (getpoint "\nInsertion point for Excel data? "))
  143.   (setq th (getvar "TEXTSIZE"))


  144. ); end defun
  145. ;;;;

  146. (defun firstrow        ()

  147.   (placetext)
  148.                                         ; that's the first row
  149.   (setq rowno "2")
  150.                                         ; how many items in the row?  This tells us how many columns to read

  151.   (if (= list-len 3)
  152.     (setq col "C")
  153.   )
  154.   (if (= list-len 4)
  155.     (setq col "D")
  156.   )
  157.   (if (= list-len 5)
  158.     (setq col "E")
  159.   )
  160.   (if (= list-len 6)
  161.     (setq col "F")
  162.   )
  163.   (if (= list-len 7)
  164.     (setq col "G")
  165.   )
  166.   (if (= list-len 8)
  167.     (setq col "H")
  168.   )
  169.   (if (= list-len 9)
  170.     (setq col "I")
  171.   )
  172.   (if (= list-len 10)
  173.     (setq col "J")
  174.   )
  175.   (if (= list-len 11)
  176.     (setq col "K")
  177.   )
  178.   (if (= list-len 12)
  179.     (setq col "L")
  180.   )
  181.   (if (= list-len 13)
  182.     (setq col "M")
  183.   )
  184.   (if (= list-len 14)
  185.     (setq col "N")
  186.   )
  187.   (if (= list-len 15)
  188.     (setq col "O")
  189.   )
  190.   (if (= list-len 16)
  191.     (setq col "P")
  192.   )
  193.   (if (= list-len 17)
  194.     (setq col "Q")
  195.   )
  196.   (if (= list-len 18)
  197.     (setq col "R")
  198.   )
  199.   (if (= list-len 19)
  200.     (setq col "S")
  201.   )
  202.   (if (= list-len 20)
  203.     (setq col "T")
  204.   )
  205.   (if (= list-len 21)
  206.     (setq col "U")
  207.   )
  208.   (if (= list-len 22)
  209.     (setq col "V")
  210.   )
  211.   (if (= list-len 23)
  212.     (setq col "W")
  213.   )
  214.   (if (= list-len 24)
  215.     (setq col "X")
  216.   )
  217.   (if (= list-len 25)
  218.     (setq col "Y")
  219.   )
  220.   (setq range (strcat "A" rowno ":" col rowno))

  221.   (setq oRng (excp-get-range oWksht range))
  222.   (setq array (excp-get-value oRng))        ;array is a safearray variant filled with variants
  223.   (vlax-release-object oRng)

  224.                                         ;conversion
  225.   (setq sfarray (vlax-variant-value array))
  226.   (setq valList (car (vlax-safearray->list sfarray)))
  227.   (setq entry 0)
  228.   (setq row-list nil)
  229.   (while (/= entry nil)
  230.     (progn
  231.       (setq var (nth entry valList))
  232.       (if (/= var nil)
  233.         (progn
  234.           (setq cellVal (vlax-variant-value var)) ; get value in cell
  235.           (setq row-list (append row-list (list cellVal)))
  236.           (setq entry (+ 1 entry))
  237.         )                                ;end progn
  238.       )                                        ;end if
  239.       (if (= var nil)
  240.         (setq entry nil)
  241.       )
  242.     )                                        ; end progn
  243.   )                                        ; end while
  244. )                                        ;end defun

  245. ;;;;
  246. ;;;;******************************************************
  247. (defun filltext()
  248.   (placetext2)
  249.   (setq rowno (atoi rowno))
  250.   (setq rowno (+ 1 rowno))
  251.   (setq rowno (itoa rowno))
  252.   (setq range (strcat "A" rowno ":" col rowno))

  253.   (setq oRng (excp-get-range oWksht range))
  254.   (setq array (excp-get-value oRng))        ;array is a safearray variant filled with variants
  255.   (vlax-release-object oRng)

  256.                                         ;conversion
  257.   (setq sfarray (vlax-variant-value array))
  258.   (setq valList (car (vlax-safearray->list sfarray)))
  259.   (setq entry 0)
  260.   (setq row-list nil)
  261.   (while (/= entry nil)
  262.     (progn
  263.       (setq var (nth entry valList))
  264.       (if (/= var nil)
  265.         (setq cellVal (vlax-variant-value var)) ; get value in cell
  266.       )

  267.       (if (/= var nil)
  268.         (progn
  269.           (setq row-list (append row-list (list cellVal)))
  270.           (setq entry (+ 1 entry))
  271.         )                                ;end progn
  272.       )                                        ;end if
  273.       (if (= var nil)
  274.         (setq entry nil)
  275.       )
  276.     )                                        ; end progn
  277.   )                                        ; end while
  278.   (setq flag (nth 0 row-list))
  279. );end defun

  280. ;;;;

  281. (defun closeExcel ()

  282.                                         ; save worksheet chan
  283.   (excm-close oWbk :vlax-true)


  284.                                         ; commented out here, this object not used when adding a new workbook
  285.                                         ;(vlax-release-object oWbks)

  286.   (vlax-invoke-method excelApp 'Quit)


  287.                                         ; known problem.
  288.                                         ; EXTERNAL COM PROCESSES DO NOT TERMINATE, IF CREATED WITH (VLAX-GET-OR-CREATE-OBJECT)
  289.                                         ; As a workaround, you can force a
  290.                                         ; garbage-collection with the lisp function (gc).
  291.                                         ; After you invoke Excel's Quit method, insert the call to (gc) into your code.
  292.   (gc)
  293. )
  294. ;;;
  295. ;;;**********************

  296. (defun placelines ()
  297. (setq vertlineno (1+ list-len))
  298. (setq horlineno (atoi rowno))
  299. (setq ent (nth 0 block-list))
  300. (setq ent-list (entget ent))
  301. (setq y1 (caddr (assoc 10 ent-list)))
  302. (setq y1 (+ texth y1))
  303. (setq xno 0)
  304. (setq col-length (length colx-list))
  305. ;;;create horizontal lines
  306.   
  307. (setq x1 (nth xno colx-list))
  308. (setq x1 (- x1 texth))
  309. (setq stpt (list x1 y1))
  310. (setq col-length (- col-length 1))
  311. (setq x2 (nth col-length colx-list))
  312. (setq x2 (+ x2 col-wid))
  313. (setq endpt (list x2 y1))
  314. (command "line" stpt endpt "")
  315. (setq text (entlast))
  316. (setq block-list (append block-list (list text)))
  317. (setq y2 (cadr ins-point))
  318. (setq y2 (- y2 0.06))
  319. (setq diff (- y1 y2))
  320. (setq delta1 (- horlineno 0.9))
  321. (setq delta (/ diff delta1))
  322. (setq count 1)
  323. (while (< count horlineno)
  324.    (setq stpt2 (list x1 y2))
  325.    (setq endpt2 (list x2 y2))
  326.    (command "line" stpt2 endpt2 "")
  327.    (setq text (entlast))
  328.    (setq block-list (append block-list (list text)))
  329.    (setq y2 (+ y2 delta))
  330.    (setq count (1+ count))
  331. ); end while

  332. ;; create vertical lines
  333.    (setq y2 (cadr ins-point))
  334. (setq y2 (- y2 0.06))
  335.    (setq stpt2 (list x1 y2))
  336. (command "line" stpt stpt2 "")
  337.    (setq text (entlast))
  338. (setq block-list (append block-list (list text)))
  339. (setq xno 1)
  340. (setq col-length (length colx-list))
  341. (while (< xno col-length)
  342.    (setq x1 (nth xno colx-list))
  343.    (setq x1 (- x1 0.06))
  344.    (setq stpt (list x1 y1))
  345.    (setq endpt (list x1 y2))
  346.    (command "line" stpt endpt "")
  347.    (setq text (entlast))
  348.    (setq block-list (append block-list (list text)))
  349.    (setq xno (1+ xno))
  350. )
  351.    (setq stpt (list x2 y1))
  352.    (setq endpt (list x2 y2))
  353. (command "line" stpt endpt "")
  354. (setq text (entlast))
  355. (setq block-list (append block-list (list text)))
  356. ); end defun
  357. ;;;
  358. ;;;;**********************************


  359. (defun createblock ()
  360.    (setq blocklen (length block-list)) ; how many entities for the block
  361.    (setq count 0)
  362.    (setq ss nil)
  363.     (setq en (nth count block-list))
  364.      (setq ss (ssadd en))
  365.      (setq count (1+ count))
  366.    (while (< count blocklen)
  367.    (setq en (nth count block-list))
  368.      (setq ss (ssadd en ss))
  369.      (setq count (1+ count))
  370.    )
  371.    (setq sscheck (sslength ss))
  372.    (command "-block" "excel-ins" ins-point ss "")
  373. )
  374. ;;;
  375. ;;;**********************************
  376. (defun c:insxls()
  377.   ; ask you to locate an xls spreadsheet
  378.   (setq colx-list nil)
  379.   (setq block-list nil)
  380.   (setq row-list nil)
  381.   
  382.    ; create layer called "EXCEL-IMPORT" COLOR YELLOW
  383.   (command "-layer" "new" "excel-import" "c" "yellow" "excel-import" "s" "excel-import" "")
  384.   ; open excel spreadsheet
  385.   (Link_2_Excel)
  386.   ; creates a block with data from the spreadsheet and gridlines
  387.   ; prompt for insertion point
  388.   ; use textscale
  389.   ; use rotation of 0
  390.   (firstrow)
  391.   (setq flag 1)
  392.   (while (/= flag nil)
  393.      (filltext)
  394.   )
  395.   (closeExcel)
  396.   (placelines)
  397.   (createblock)
  398.   (command "-insert" "excel-ins" ins-point "" "" "")
  399. )
  400.       
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-26 19:16 , Processed in 0.328858 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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