找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 242|回复: 0

[原创] Excel表格转CAD表格 源码

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-2-17 20:32:41 | 显示全部楼层 |阅读模式
[原创] Excel表格转CAD表格 源码
  1. ;;;--------------------------------------------------;;;
  2. ;;;Range对象的几个属性和方法:                       ;;;
  3. ;;;--------------------------------------------------;;;
  4. ;;;属性:                                            ;;;
  5. ;;; Address----地址,如"A
  6. 1" "A
  7. 1:C
  8. 4"            ;;;
  9. ;;;                     这个属性需要三个参数:       ;;;
  10. ;;;                     :vlax-true :vlax-true 1      ;;;
  11. ;;; Borders----单元格边框                            ;;;
  12. ;;; Characters----返回单元格字符串中的单个字符对象   ;;;
  13. ;;;    两个参数 start length                         ;;;
  14. ;;; Borders----单元格边框                            ;;;
  15. ;;; Column----返回指定区域第一列的列号               ;;;
  16. ;;; Columns----所有列集合                            ;;;
  17. ;;; End----指定区域尾端的单元格                      ;;;
  18. ;;; -4121 向下 -4159 向左 -4161 向右 -4162 向上      ;;;
  19. ;;; HorizontalAlignment----水平对齐方式              ;;;
  20. ;;;         1 常规 -4131 靠左 -4108 居中 -4152 靠右  ;;;
  21. ;;;         5 填充 -4130 两端 7 跨列居中 -4117 分散  ;;;
  22. ;;; IndentLevel----缩进 0--15                        ;;;
  23. ;;; MergeArea----返回Range对象,如果单元格不被包含合 ;;;
  24. ;;;    并格,就返回单元格本身。                      ;;;
  25. ;;; Next----下一个单元格对象                         ;;;
  26. ;;; Previous----上一个单元格                         ;;;
  27. ;;; Range----"A1" "A1:D3" "A
  28. 1:B
  29. 2"                ;;;
  30. ;;; Row----返回指定区域第一排                        ;;;
  31. ;;; Text----返回或设置单元格的文本                   ;;;
  32. ;;; Value----返回或设置单元格的值                    ;;;
  33. ;;; Value2----返回或设置单元格的值                   ;;;
  34. ;;; VerticalAlignment----垂直对齐方式                ;;;
  35. ;;; -4160靠上 -4108居中 -4107靠下 -4130两端 -4117分散;;;
  36. ;;;--------------------------------------------------;;;
  37. ;;;Font字体对象的属性                                ;;;
  38. ;;; Background: 背景颜色                             ;;;
  39. ;;;   XlBackground常量                               ;;;
  40. ;;;    xlBackgroundAutomatic=-4105 Excel控制背景     ;;;
  41. ;;;    xlBackgroundOpaque=3 不透明背景               ;;;
  42. ;;;    xlBackgroundTransparent=2 透明背景            ;;;
  43. ;;; Bold: 是否加粗 Boolean值                         ;;;
  44. ;;; Color: 字体颜色 RGB值                            ;;;
  45. ;;; ColorIndex: 字体颜色索引号值                     ;;;
  46. ;;; FontStyle: 字体样式名 string                     ;;;
  47. ;;; Italic: 是否倾斜 Boolean值                       ;;;
  48. ;;; Name: 字体名 string                              ;;;
  49. ;;; Size: 字号                                       ;;;
  50. ;;; Strikethrough: 中间删除线 Boolean值              ;;;
  51. ;;; Subscript: 下标 Boolean值                        ;;;
  52. ;;; Superscript: 上标 Boolean值                      ;;;
  53. ;;; TintAndShade: 字体亮度 -1 最暗 1 最亮            ;;;
  54. ;;; Underline: 下划线                                ;;;
  55. ;;;    xlUnderlineStyleDouble=-4119 粗双下划线       ;;;
  56. ;;;    xlUnderlineStyleDoubleAccounting=5 细双下划线 ;;;
  57. ;;;    xlUnderlineStyleNone=-4142 无下划线           ;;;
  58. ;;;    xlUnderlineStyleSingle=2 单下划线             ;;;
  59. ;;;    xlUnderlineStyleSingleAccounting=4 不支持     ;;;
  60. ;;;--------------------------------------------------;;;
  61. ;;;       替换编辑器设置多行文字的格式               ;;;
  62. ;;; \~          插入不间断空格                       ;;;
  63. ;;; \\          插入反斜杠                           ;;;
  64. ;;; \{...\}     插入大括号                           ;;;
  65. ;;; \Avalue;    设置对齐方式                         ;;;
  66. ;;;             0--底端对正                          ;;;
  67. ;;;             1--居中对正                          ;;;
  68. ;;;             2--顶端对正                          ;;;
  69. ;;; \Cvalue;    设置颜色                             ;;;
  70. ;;; \Ffilename; 设置字体文件                         ;;;
  71. ;;; \Hvalue;    设置高度                             ;;;
  72. ;;; \Hvaluex;   设置当前字体高度的倍数               ;;;
  73. ;;; \L...\l     打开或关闭下划线                     ;;;
  74. ;;; \O...\o     打开或关闭删除线(上划线)             ;;;
  75. ;;; ...\P       结束段落                             ;;;
  76. ;;; \Qangle;    设置倾斜角度                         ;;;
  77. ;;; \S...^...;  设置堆叠                             ;;;
  78. ;;;             /--除号                              ;;;
  79. ;;;             #--斜线                              ;;;
  80. ;;;             ^--上下界                            ;;;
  81. ;;; \Tvalue;    设置字符间距,有效值0.75-4倍         ;;;
  82. ;;; \Wvalue;    设置宽度比例                         ;;;
  83. ;;;--------------------------------------------------;;;
  84. ;;;Borders 集合对象的 item 属性                      ;;;
  85. ;;; (vlax-get-property Borders 'Item xlEdgeLeft)     ;;;
  86. ;;; 返回一个Border对象                               ;;;
  87. ;;; xlDiagonalDown     = 5 左上角至右下角            ;;;
  88. ;;; xlDiagonalUp       = 6 左下角至右上角            ;;;
  89. ;;; xlEdgeBottom       = 9 区域底部                  ;;;
  90. ;;; xlEdgeLeft         = 7 区域左边                  ;;;
  91. ;;; xlEdgeRight        =10 区域右边                  ;;;
  92. ;;; xlEdgeTop          = 8 区域顶部                  ;;;
  93. ;;; xlInsideHorizontal =12 所有水平边框              ;;;
  94. ;;; xlInsideVertical   =11 所有垂直边框              ;;;
  95. ;;;--------------------------------------------------;;;
  96. ;;;Border 对象的 LineStyle 属性                      ;;;
  97. ;;; (vlax-get-property Border 'LineStyle)            ;;;
  98. ;;; xlContinuous        1 实线。                     ;;;
  99. ;;; xlDash          -4115 虚线。                     ;;;
  100. ;;; xlDashDot           4 点划相间线。               ;;;
  101. ;;; xlDashDotDot        5 划线后跟两个点。           ;;;
  102. ;;; xlDot           -4118 点式线。                   ;;;
  103. ;;; xlDouble        -4119 双线。                     ;;;
  104. ;;; xlLineStyleNone -4142 无线条。                   ;;;
  105. ;;; xlSlantDashDot     13 倾斜的划线。               ;;;
  106. ;;;--------------------------------------------------;;;
  107. ;;;--------------------------------- 开始 ---------------------------------;;;
  108. (vl-load-com)
  109. ;;;将单位磅转换成毫米
  110. (defun AYL-ConvertUnit (ENumber)
  111.   (/ (* ENumber 25.4) 72)
  112. )
  113. ;;;将真彩色值转换成RGB三色的表
  114. (defun AYL-i->RGB (c)
  115.   (list  (lsh c -16)
  116.   (lsh (lsh c 16) -24)
  117.   (lsh (lsh c 24) -24)
  118.   )
  119. )
  120. ;;;将RGB转换成真彩色值   
  121. ;;;(defun AYL-RBG->i (Lst)
  122. ;;;  (+ (lsh (car Lst) 16)
  123. ;;;     (lsh (cadr Lst) 8)
  124. ;;;     (caddr Lst)      
  125. ;;;  )                    
  126. ;;;)                     
  127. ;;;将Excel真彩色值转换成AutoCAD颜色索引号
  128. (defun AYL-tColorCiColor (TrueColor / AcadApp AccVer cObj AppLst ci)
  129.   (setq ci nil)
  130.   (setq AcadApp (vlax-get-acad-object)
  131.   AccVer  (strcat "AutoCAD.AcCmColor." (substr (getvar 'AcadVer) 1 2))
  132.   )
  133.   (setq cObj (vl-catch-all-apply 'vla-getinterfaceobject (list AcadApp AccVer)))
  134.   (if (vl-catch-all-error-p cObj)
  135.     (vlax-release-object AcadApp)
  136.     (progn
  137.       (setq AppLst (reverse (AYL-i->RGB TrueColor)))
  138.       (if (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-setRGB (cons cObj AppLst))))
  139.   (setq ci (vla-get-ColorIndex cObj))
  140.       )
  141.       (mapcar 'vlax-release-object (list AcadApp cObj))
  142.     )
  143.   )
  144.   ci
  145. )
  146. (defun AYL-GetColorIndex (Int)
  147.   (if (member Int '(0 16777215))
  148.     (setq Int (- 16777215 Int))
  149.   )
  150.   (AYL-tColorCiColor Int)
  151. )
  152. ;;;--------------- AYL-GetStringProp 函数 ---------------;;;
  153. ;;; (AYL-GetStringProp CellObj)                          ;;;
  154. ;;;单元格字符串的属性                                    ;;;
  155. ;;; CellObj 单元格或合并单元格对象                       ;;;
  156. ;;;返回格式化后的多行文字字符串,或nil。                 ;;;
  157. ;;;------------------------------------------------------;;;
  158. ;;;调用的子函数                                          ;;;
  159. ;;; AYL-ConvertUnit                                      ;;;
  160. ;;; AYL-tColorCiColor                                    ;;;
  161. ;;;------------------------------------------------------;;;
  162. (defun AYL-GetStringProp (CellObj /       string      oFont         isItalic isBold
  163.         vColor  vSize   vULine      sName         n        CharObj
  164.         CurStr  sChar   isSubscript isSuperscript vColor0  vSize0
  165.         sName0  isBold0 isItalic0   vULine0       sChar0   CTsize
  166.        )
  167.   (if (setq string (vlax-variant-value (vlax-get-property CellObj 'Text)))
  168.     (progn
  169.       (setq oFont    (vlax-get-property CellObj 'Font)
  170.       isItalic (vlax-variant-value (vlax-get-property oFont 'Italic))
  171.       isBold   (vlax-variant-value (vlax-get-property oFont 'Bold))
  172.       vColor   (vlax-variant-value (vlax-get-property oFont 'Color))
  173.       vSize    (/ (AYL-ConvertUnit (vlax-variant-value (vlax-get-property oFont 'Size))) 1.35)
  174.       vULine   (vlax-variant-value (vlax-get-property oFont 'Underline))
  175.       sName    (vlax-variant-value (vlax-get-property oFont 'Name))
  176.       CTsize   (getvar 'textsize) ;采用 当前默认字体大小
  177.       )
  178.       (vlax-release-object oFont)
  179.       ;;如果单元格存在多种颜色时,vColor的值为nil
  180.       (if vColor (setq vColor (fix vColor)))
  181.       
  182.       ;;---------- 单字符对象处理开始 ----------;;
  183.       
  184.       (setq n       1
  185.       CharObj (vlax-get-property CellObj 'Characters n 1)
  186.       CurStr  ""
  187.       *vSize* 0.0 ;采用 初始化字符串长度的值
  188.       )
  189.       (while (and
  190.          ;;字符对象不支持数字的Text属性
  191.          (setq sChar (vl-catch-all-apply 'vlax-get-property (list CharObj 'Text)))
  192.          (not (vl-catch-all-error-p sChar))
  193.          (/= sChar "")
  194.        )
  195.   ;;将三种特定的字符转换成LISP格式
  196.   (cond
  197.     ((= sChar "{") (setq sChar "\\{"))
  198.     ((= sChar "}") (setq sChar "\\}"))
  199.     ((= sChar "\") (setq sChar "\\\"))
  200.     (t nil)
  201.   )
  202.   (setq oFont         (vlax-get-property CharObj 'Font)
  203.         isSubscript   (vlax-variant-value (vlax-get-property oFont 'Subscript))
  204.         isSuperscript (vlax-variant-value (vlax-get-property oFont 'Superscript))
  205.         vColor0       (fix (vlax-variant-value (vlax-get-property oFont 'Color)))
  206.         vSize0        (/ (AYL-ConvertUnit (vlax-variant-value (vlax-get-property oFont 'Size))) 1.35)
  207.         *vSize*       (+ *vSize* vSize0)
  208.         vSize0        (/ vSize0 CTsize)
  209.         sName0        (vlax-variant-value (vlax-get-property oFont 'Name))
  210.         vULine0       (vlax-variant-value (vlax-get-property oFont 'Underline))
  211.         sChar0        sChar
  212.   )
  213.   (if (not (= isBold :vlax-true)) (setq isBold0 (vlax-variant-value (vlax-get-property oFont 'Bold))))
  214.   (if (not (= isItalic :vlax-true)) (setq isItalic0 (vlax-variant-value (vlax-get-property oFont 'Italic))))
  215.   (vlax-release-object oFont)
  216.   (if (= isSubscript :vlax-true) (setq sChar (strcat "\\A1;\\H" (rtos (* vSize0 0.6)) "x;\\S^" sChar ";"))) ;采用 下标
  217.         (if (= isSuperscript :vlax-true) (setq sChar (strcat "\\A1;\\H" (rtos (* vSize0 0.6)) "x;\\S" sChar "^;"))) ;采用 上标
  218.   (cond
  219.     ((and (/= vULine -4142) (= vULine0 -4142)) (setq sChar (strcat "\\l" sChar)))
  220.     ((and (= vULine -4142) (/= vULine0 -4142)) (setq sChar (strcat "\\L" sChar)))
  221.     (t nil)
  222.   )
  223.         (and sName0 (/= sName sName0) (setq sChar (strcat "\\F" sName0 ";" sChar)))
  224.         (if (= isBold0 :vlax-true) (setq sChar (strcat "\\W1.2;" sChar)))
  225.         (if (= isItalic0 :vlax-true) (setq sChar (strcat "\\Q18;" sChar)))
  226.   (and (/= vColor vColor0)
  227.     (progn
  228.             (setq vColor0 (AYL-GetColorIndex vColor0))
  229.             (setq sChar (strcat "\\C" (itoa vColor0) ";" sChar))
  230.     )
  231.   )
  232.   (if (not (equal vSize0 (/ vSize CTsize) 0.00001))
  233.           (setq sChar (strcat "\\H" (rtos vSize0 2 2) "x;" sChar))
  234.   )
  235.   (if (/= sChar0 sChar) (setq sChar (strcat "{" sChar "}")))
  236.   (setq CurStr (strcat CurStr  sChar))
  237.   (vlax-release-object CharObj)
  238.   (setq n         (1+ n)
  239.         CharObj  (vlax-get-property CellObj 'Characters n 1)
  240.   )
  241.       ) ;采用 end while
  242.       (vlax-release-object CharObj)
  243.       ;;---------- 单字符对象处理结束 ----------;;
  244.       (if (= *vSize* 0.0) (setq *vSize* (* vSize (strlen string))))
  245.       (setq vSize (/ vSize CTsize))
  246.       (if (= CurStr "") (setq CurStr String))
  247.       (setq CurStr (strcat "{" CurStr "}"))
  248.       (if (/= vULine -4142) (setq CurStr (strcat "\\L" CurStr)))
  249.       (if sName (setq CurStr (strcat "\\F" sName ";" CurStr)))
  250.       (if (= isBold :vlax-true) (setq CurStr (strcat "\\W1.2;" CurStr)))
  251.       (if (= isItalic :vlax-true) (setq CurStr (strcat "\\Q18;" CurStr)))
  252.       (if vColor
  253.   (progn
  254.           ;;CAD的颜色转换系统用暗红色代替黑色
  255.           (setq vColor (AYL-GetColorIndex vColor))
  256.           (setq CurStr (strcat "\\C" (itoa vColor) ";" CurStr))
  257.   )
  258.       )
  259.       (setq CurStr (strcat "\\H" (rtos vSize 2 2) "x;" CurStr))
  260.     ) ;采用 end progn
  261.   ) ;采用 end if
  262. )
  263. ;;;--------------- AYL-GetBordersPr 函数 ---------------;;;
  264. ;;;(AYL-GetBordersPr RangeObj pt0 pt1 pt2 pat)          ;;;
  265. ;;;获取区域对象的边框属性,并设置给Acad表格相应方框。   ;;;
  266. ;;;                                                     ;;;
  267. ;;;RangeObj Excel区域对象                               ;;;
  268. ;;;pt0      方框的左上点                                ;;;
  269. ;;;pt1      方框的右上点                                ;;;
  270. ;;;pt2      方框的左下点                                ;;;
  271. ;;;pat      需要处理的边框类型,详细说明如下:          ;;;
  272. ;;;  1----上边线和左边线;                              ;;;
  273. ;;;  2----右边线;                                      ;;;
  274. ;;;  4----下边线;                                      ;;;
  275. ;;;  8----对角线。                                      ;;;
  276. ;;;-----------------------------------------------------;;;
  277. ;;;调用的子函数:                                       ;;;
  278. ;;; AYL-GetColorIndex                                   ;;;
  279. ;;;-----------------------------------------------------;;;
  280. (defun AYL-GetBordersPr (RangeObj pt0 pt1      pt2      pat      /
  281.        oBorders pt3 oBorder1 oBorder2 LnStyle1 LnStyle2
  282.        Color1   Color2)
  283.   (setq oBorders   (vlax-get-property RangeObj 'Borders)
  284.   pt3        (list (car pt1) (cadr pt2))
  285.   )
  286.   ;;如果pat参数包含1,就处理边框的上边线和左边线;
  287.   ;;如果pat参数包含2,就处理边框的右边线;
  288.   ;;如果pat参数包含4,就处理边框的下边线;
  289.   ;;如果pat参数包含8,就处理边框的对角线。
  290.   (if (= (logand pat 1) 1)
  291.     (progn
  292.       (setq oBorder1 (vlax-get-property oBorders 'Item 8)
  293.       oBorder2 (vlax-get-property oBorders 'Item 7)
  294.       LnStyle1 (vlax-variant-value (vlax-get-property oBorder1 'LineStyle))
  295.       LnStyle2 (vlax-variant-value (vlax-get-property oBorder2 'LineStyle))
  296.       )
  297.       (mapcar 'vlax-release-object (list oBorder1 oBorder2))
  298.       (if (/= LnStyle1 -4142)
  299.   (setq *HLineData* (cons (list pt0 pt1) *HLineData*))
  300.       )
  301.       (if (/= LnStyle2 -4142)
  302.   (setq *VLineData* (cons (list pt0 pt2) *VLineData*))
  303.       )
  304.     )
  305.   )
  306.   (if (= (logand pat 2) 2)
  307.     (progn
  308.       (setq oBorder1 (vlax-get-property oBorders 'Item 10)
  309.       LnStyle1 (vlax-variant-value (vlax-get-property oBorder1 'LineStyle))
  310.       )
  311.       (vlax-release-object oBorder1)
  312.       (if (/= LnStyle1 -4142)
  313.   (setq *VLineData* (cons (list pt1 pt3) *VLineData*))
  314.       )
  315.     )
  316.   )
  317.   (if (= (logand pat 4) 4)
  318.     (progn
  319.       (setq oBorder1 (vlax-get-property oBorders 'Item 9)
  320.       LnStyle1 (vlax-variant-value (vlax-get-property oBorder1 'LineStyle))
  321.       )
  322.       (vlax-release-object oBorder1)
  323.       (if (/= LnStyle1 -4142)
  324.   (setq *HLineData* (cons (list pt2 pt3) *HLineData*))
  325.       )
  326.     )
  327.   )
  328.   (if (= (logand pat 8) 8)
  329.     (progn
  330.       (setq oBorder1 (vlax-get-property oBorders 'Item 5)
  331.       oBorder2 (vlax-get-property oBorders 'Item 6)
  332.       LnStyle1 (vlax-variant-value (vlax-get-property oBorder1 'LineStyle))
  333.       LnStyle2 (vlax-variant-value (vlax-get-property oBorder2 'LineStyle))
  334.       Color1   (fix (vlax-variant-value (vlax-get-property oBorder1 'Color)))
  335.       Color2   (fix (vlax-variant-value (vlax-get-property oBorder2 'Color)))
  336.       )
  337.       (mapcar 'vlax-release-object (list oBorder1 oBorder2))
  338.       (if (/= LnStyle1 -4142)
  339.   (progn
  340.     (setq Color1 (AYL-GetColorIndex Color1))
  341.     (entmakex (list '(0 . "Line") (cons 10 pt0) (cons 11 pt3) (cons 62 Color1)))
  342.   )
  343.       )
  344.       (if (/= LnStyle2 -4142)
  345.   (progn
  346.     (setq Color2 (AYL-GetColorIndex Color2))
  347.     (entmakex (list '(0 . "Line") (cons 10 pt2) (cons 11 pt1) (cons 62 Color2)))
  348.   )
  349.       )
  350.     )
  351.   )
  352.   (vlax-release-object oBorders)
  353. )
  354. (defun AYL-ModString (k str n / m1 m2 ss)
  355.   (cond
  356.     ((and (setq m1 (vl-string-search "\\H" str n))
  357.     (setq m2 (vl-string-search "x;" str m1))
  358.      )
  359.      (setq ss (substr str (+ 3 m1) (- m2 m1 2)))
  360.      (AYL-ModString k (vl-string-subst (rtos (* (atof ss) k)) ss str n) m2)
  361.     )
  362.     (t str)
  363.   )
  364. )
  365. ;;;--------------- AYL-FixText 函数 ---------------;;;
  366. ;;; (AYL-FixText EnText MinPnt MaxPnt)             ;;;
  367. ;;;把自动换行的多行文字缩小以取消自动换行          ;;;
  368. ;;;------------------------------------------------;;;
  369. ;;;这个函数有问题                                  ;;;
  370. ;;;????????????????????????????????????????????????;;;
  371. (defun AYL-FixText (EnText MinPnt MaxPnt / EnData kkkk width)
  372.   ;;如果文字的高度大于方框的高度
  373.   (if (> (cdr (assoc 43 (entget EnText))) (- (cadr MaxPnt) (cadr MinPnt)))
  374.     (progn
  375.       (setq EnText (vlax-ename->vla-object EnText))
  376.       (vla-put-width EnText (* *vSize* 1.25))
  377.       (setq kkkk (/ (setq Width (- (car MaxPnt) (car MinPnt)))
  378.         (cdr (assoc 42 (setq EnData (entget (vlax-vla-object->ename EnText)))))
  379.      )
  380.       )
  381.       (vla-put-textstring
  382.   EnText
  383.   (AYL-ModString kkkk (cdr (assoc 1 EnData)) 0)
  384.       )
  385.       (vla-put-width EnText width)
  386.       (vlax-release-object EnText)
  387.     )
  388.   )
  389.   (setq *vSize* nil)
  390. )
  391. ;;;--------------- AYL-ControlMA 函数 ---------------;;;
  392. ;;;AYL-ControlMA 子函数有两个功能                    ;;;
  393. ;;;1 绘制文字图元                                    ;;;
  394. ;;;2 返回单元格上边线和左边线的表,边线用点对表表示  ;;;
  395. ;;;(AYL-ControlMA RangeObj InitPt)                   ;;;
  396. ;;;RangeObj 合并区域的vla对象                        ;;;
  397. ;;;InitPt   左上点                                   ;;;
  398. ;;;--------------------------------------------------;;;
  399. ;;;调用的子函数:                                    ;;;
  400. ;;; AYL-ConvertUnit                                  ;;;
  401. ;;; AYL-GetStringProp                                ;;;
  402. ;;; AYL-GetBordersPr                                 ;;;
  403. ;;; AYL-FixText (目前还只是个空函数)                 ;;;
  404. ;;;--------------------------------------------------;;;
  405. (defun AYL-ControlMA (RangeObj InitPt /      Width  Height RetPnt
  406.           String   HAlign VAlign IndLvl Align  MaCells
  407.           lusPnt   lrsPnt
  408.          )
  409.   (setq Width   (AYL-ConvertUnit (vlax-variant-value (vlax-get-property RangeObj 'Width)))
  410.   Height  (AYL-ConvertUnit (vlax-variant-value (vlax-get-property RangeObj 'Height)))
  411.   lusPnt  InitPt
  412.   lrsPnt  (polar InitPt (* pi 1.5) Height)
  413.   RetPnt  (polar InitPt 0.0 Width)
  414.   String  nil
  415.   MaCells (vlax-get-property RangeObj 'Cells)
  416.   )
  417.   (vlax-for Item MaCells
  418.     (if (not String)
  419.       (setq String (AYL-GetStringProp Item))
  420.     )
  421.     (vlax-release-object Item)
  422.   )
  423.   (vlax-release-object MaCells)
  424.   (if String
  425.     (progn
  426.       ;;水平对正方式、垂直对正方式、缩进值
  427.       (setq HAlign (vlax-variant-value (vlax-get-property RangeObj 'HorizontalAlignment))
  428.       VAlign (vlax-variant-value (vlax-get-property RangeObj 'VerticalAlignment))
  429.       IndLvl (vlax-variant-value (vlax-get-property RangeObj 'IndentLevel))
  430.       IndLvl (* (AYL-ConvertUnit (* IndLvl 19.05)) 1.25)
  431.       *isStr* t ;采用 临时的全局变量,暂时没用
  432.       )
  433.       (cond ((and (= HAlign 1)
  434.       (numberp (read String))
  435.        )
  436.        (setq HAlign -4152)
  437.       )
  438.       ((and (= HAlign 1) (not (numberp (read String))))
  439.         (setq HAlign -4131)
  440.       )
  441.             ((= HAlign -4130) (setq HAlign -4108))
  442.       ((= HAlign -4117) (setq HAlign -4108))
  443.       ((= HAlign 5) (setq HAlign -4108))
  444.       (t nil)
  445.       )
  446.       (cond ((= VAlign -4130) (setq VAlign -4108))
  447.       ((= VAlign -4117) (setq VAlign -4108))
  448.       (t nil)
  449.       )
  450.       ;;文本文字的插入点和对正方式
  451.       (cond
  452.   ((and (= HAlign -4131) (= VAlign -4160))
  453.    (setq Align 1
  454.          InitPt (polar InitPt 0.0 IndLvl)
  455.          )
  456.   )
  457.   ((and (= HAlign -4131) (= VAlign -4108))
  458.    (setq Align  4
  459.          InitPt (polar InitPt (* pi 1.5) (* Height 0.5))
  460.          InitPt (polar InitPt 0.0 IndLvl)
  461.    )
  462.   )
  463.   ((and (= HAlign -4131) (= VAlign -4107))
  464.    (setq Align  7
  465.          InitPt (polar InitPt (* pi 1.5) Height)
  466.          InitPt (polar InitPt 0.0 IndLvl)
  467.    )
  468.   )
  469.   ((and (= HAlign -4108) (= VAlign -4160))
  470.    (setq Align  2
  471.          InitPt (polar InitPt 0.0 (* Width 0.5))
  472.    )
  473.   )
  474.   ((and (= HAlign -4108) (= VAlign -4108))
  475.    (setq Align  5
  476.          InitPt (polar InitPt 0.0 (* Width 0.5))
  477.          InitPt (polar InitPt (* pi 1.5) (* Height 0.5))
  478.    )
  479.   )
  480.   ((and (= HAlign -4108) (= VAlign -4107))
  481.    (setq Align  8
  482.          InitPt (polar InitPt 0.0 (* Width 0.5))
  483.          InitPt (polar InitPt (* pi 1.5) Height)
  484.    )
  485.   )
  486.   ((and (= HAlign -4152) (= VAlign -4160))
  487.    (setq Align  3
  488.          InitPt (polar InitPt 0.0 Width)
  489.          InitPt (polar InitPt pi IndLvl)
  490.    )
  491.   )
  492.   ((and (= HAlign -4152) (= VAlign -4108))
  493.    (setq Align  6
  494.          InitPt (polar InitPt 0.0 Width)
  495.          InitPt (polar InitPt (* pi 1.5) (* Height 0.5))
  496.          InitPt (polar InitPt pi IndLvl)
  497.    )
  498.   )
  499.   ((and (= HAlign -4152) (= VAlign -4107))
  500.    (setq Align  9
  501.          InitPt (polar InitPt 0.0 Width)
  502.          InitPt (polar InitPt (* pi 1.5) Height)
  503.          InitPt (polar InitPt pi IndLvl)
  504.    )
  505.   )
  506.   (t (setq Align 4))
  507.       )
  508.       (AYL-FixText
  509.   (entmakex
  510.     (list
  511.       '(0 . "MText")
  512.       '(100 . "AcDbEntity")
  513.       '(100 . "AcDbMText")
  514.       (cons 1 String)
  515.       (cons 10 InitPt)
  516.       (cons 41 (/ Width 1.35))
  517.       (cons 71 Align)
  518.     )
  519.   )
  520.   lrsPnt
  521.   RetPnt
  522.       )
  523.     )
  524.   ) ;采用 end if
  525.   (AYL-GetBordersPr RangeObj lusPnt RetPnt lrsPnt 9)
  526.   (list (list lusPnt RetPnt) (list lusPnt lrsPnt))
  527. )
  528. ;;;--------------- AYL-DrawRange 函数 ---------------;;;
  529. ;;;根据点对表绘制直线                                ;;;
  530. ;;;(AYL-DrawRange DPntsLst)                          ;;;
  531. ;;;DPntsLst 子表是点对表,表示单元格的一条边线       ;;;
  532. ;;;   指所有上边线或者所有左边线,顺序是颠倒的       ;;;
  533. ;;;--------------------------------------------------;;;
  534. (defun AYL-DrawRange (DPntsLst Cint / Lst0 Lst1 Item0 Item1 Pnt)
  535.   (setq  Lst0 (reverse DPntsLst)
  536.   Lst1 nil
  537.   )
  538.   ;;按顺序将共线的直线合并
  539.   (while Lst0
  540.     (setq Item0  (car Lst0)
  541.     Pnt  (cadr Item0)
  542.     Lst0  (cdr Lst0)
  543.     )
  544.     (while (setq
  545.        Item1 (car  (vl-member-if
  546.         (function
  547.           (lambda (x)
  548.             (equal (distance Pnt (car x)) 0 0.00001)
  549.           )
  550.         )
  551.         Lst0
  552.       )
  553.        )
  554.      )
  555.       (setq Pnt    (cadr Item1)
  556.       Item0 (list (car Item0) Pnt)
  557.       Lst0  (vl-remove Item1 Lst0)
  558.       )
  559.     )
  560.     (setq Lst1 (cons Item0 Lst1))
  561.   )
  562.   ;;用Entmakex函数绘制直线
  563.   (mapcar
  564.     (function
  565.       (lambda (x)
  566.   (entmakex
  567.     (list '(0 . "Line") (cons 10 (car x)) (cons 11 (cadr x)) (cons 62 Cint))
  568.   )
  569.       )
  570.     )
  571.     Lst1
  572.   )
  573. )
  574. ;;;-------------------- AYL-GetExcPr 函数 --------------------;;;
  575. ;;; (AYL-GetExcPr Range AlPnt)                                ;;;
  576. ;;; 把指定的Excel表格对象绘制在AutoCAD制图界面                ;;;
  577. ;;; Range Excel表格对象,指定要在AutoCAD制图界面绘制的表格    ;;;
  578. ;;; AlPnt 制图界面插入点,指定表格的左上点                    ;;;
  579. ;;;-----------------------------------------------------------;;;
  580. ;;; 调用的子函数:                                            ;;;
  581. ;;; AYL-ControlMA                                             ;;;
  582. ;;; AYL-ConvertUnit                                           ;;;
  583. ;;; AYL-DrawRange                                             ;;;
  584. ;;; AYL-GetBordersPr                                          ;;;
  585. ;;;-----------------------------------------------------------;;;
  586. (defun AYL-GetExcPr (Range  AlPnt /     Rows   CeLst
  587.          luPnt  Cells MArea MaAddr CeAddr
  588.          DPtLst RowH  RowW  rlPnt  ruPnt
  589.          *HLineData*  *VLineData*  *isStr*
  590.          n      m     CellW CellH
  591.         )
  592.   (setq  Rows   (vlax-get-property Range 'Rows) ;采用 所有行的集合对象
  593.   n      (vlax-get-property Rows 'Count)
  594.   DPtLst nil
  595.   CeLst  nil
  596.   luPnt  AlPnt
  597.   *HLineData* nil
  598.   *VLineData* nil
  599.   )
  600.   (vlax-for Item0 Rows
  601.     (setq Cells (vlax-get-property Item0 'Cells) ;采用 每一行所有单元格的集合对象
  602.     m     (vlax-get-property Cells 'Count)
  603.     n     (1- n)
  604.     *isStr* nil
  605.     )
  606.     (vlax-for Item1 Cells
  607.       ;;获取单元格的合并区域,绝对地址
  608.       (setq MArea  (vlax-get-property Item1 'MergeArea) ;采用 单元格被包含的合并区域对象
  609.       MaAddr (vlax-get-property MArea 'Address :vlax-true :vlax-true 1) ;采用 合并区域的绝对地址
  610.       CeAddr (vlax-get-property Item1 'Address :vlax-true :vlax-true 1) ;采用 单元格的绝对地址
  611.       CellW  (AYL-ConvertUnit (vlax-variant-value (vlax-get-property Item1 'Width)))
  612.       CellH  (AYL-ConvertUnit (vlax-variant-value (vlax-get-property Item1 'Height)))
  613.       m      (1- m)
  614.       )
  615.       (if (= m 0) (AYL-GetBordersPr Item1 AlPnt (polar AlPnt 0.0 CellW) (polar AlPnt (* pi 1.5) CellH) 2))
  616.       (if (= n 0) (AYL-GetBordersPr Item1 AlPnt (polar AlPnt 0.0 CellW) (polar AlPnt (* pi 1.5) CellH) 4))
  617.       (cond
  618.   ;;如果地址相同,说明单元格不被包含于合并区域
  619.   ;;那么,就对此单元格进行文字和边框的处理   
  620.   ((equal MaAddr CeAddr)
  621.    (setq DPtLst (cons (AYL-ControlMA MArea luPnt) DPtLst)
  622.          luPnt  (cadaar DPtLst)
  623.    )
  624.   )
  625.   ;;如果地址不相同,而且单元格被包含的合并区域还没被保存
  626.   ;;那么,就把这个合并区域的绝对地址保存在表CeLst中     
  627.   ;;并对此单元格进行文字和边框的处理                    
  628.   ((not (member MaAddr CeLst))
  629.    (setq CeLst (append CeLst (list MaAddr)))
  630.    (setq DPtLst (cons (AYL-ControlMA MArea luPnt) DPtLst)
  631.          luPnt  (cadaar DPtLst)
  632.    )
  633.   )
  634.   ;;如果地址不相同,单元格被包含的合并区域已经被保存
  635.   ;;而且单元格不是合并区域的第一行                  
  636.   ;;那么,改变左上点前进当前单元格的一个宽度,而不对
  637.   ;;单元格进行文字和边框的处理                     
  638.   ((and (member MaAddr CeLst)
  639.         (not (wcmatch CeAddr (strcat "*" (itoa (vlax-get-property MArea 'Row)))))
  640.    )
  641.    (setq luPnt (polar luPnt 0.0 CellW))
  642.   )
  643.   (t nil)
  644.       )
  645.       (mapcar 'vlax-release-object (list Item1 MArea))
  646.       (setq AlPnt (polar AlPnt 0.0 CellW))
  647.     )
  648.     ;;换行,把左上点移动到下一行的左上点
  649.     (setq RowH  (AYL-ConvertUnit (vlax-variant-value (vlax-get-property Item0 'Height)))
  650.     RowW  (AYL-ConvertUnit (vlax-variant-value (vlax-get-property Item0 'Width)))
  651.     luPnt (polar (polar luPnt pi RowW) (* pi 1.5) RowH)
  652.     AlPnt luPnt
  653.     )
  654.     (mapcar 'vlax-release-object (list Item0 Cells))
  655.   )
  656.   (vlax-release-object Rows)
  657.   ;;根据点对表绘制表格
  658.   (if (and (not *HLineData*) (not *VLineData*))
  659.     (progn
  660.       (mapcar 'AYL-DrawRange (apply 'mapcar (cons 'list DPtLst)) '(8 8))
  661.       ;;最后绘制使用区域的下边线和右边线
  662.       (setq RowH  (AYL-ConvertUnit (vlax-variant-value (vlax-get-property Range 'Height)))
  663.       RowW  (AYL-ConvertUnit (vlax-variant-value (vlax-get-property Range 'Width)))
  664.       rlPnt (polar luPnt 0.0 RowW)
  665.       ruPnt (polar rlPnt (* pi 0.5) RowH)
  666.       )
  667.       (entmakex (list '(0 . "Line") (cons 10 luPnt) (cons 11 rlPnt) '(62 . 8)))
  668.       (entmakex (list '(0 . "Line") (cons 10 ruPnt) (cons 11 rlPnt) '(62 . 8)))
  669.     )
  670.   )
  671.   (if *HLineData*
  672.     (AYL-DrawRange *HLineData* 7)
  673.   )
  674.   (if *VLineData*
  675.     (AYL-DrawRange *VLineData* 7)
  676.   )
  677.   nil
  678. )
  679. ;;;-------------------- 主命令 XlCAc --------------------;;;
  680. ;;; auther: 秋  寒                                       ;;;
  681. ;;;     QQ: 982049859                                    ;;;
  682. ;;;调用 AYL-GetExcPr 子函数                              ;;;
  683. ;;;------------------------------------------------------;;;
  684. (defun c:XlCAc (/ TtLst ExcApp Wkbk Sheet URange Cells InsPt)
  685.   (setq  TtLst (list vl-catch-all-apply   set
  686.         "作者:秋  寒"   vlax-get-object
  687.         +       "QQ:982049859"
  688.         vlax-release-object   -
  689.         "\000\001\002\003\004\005\006\007\010"
  690.         vlax-variant-value   boole
  691.         "????????????????????????????????????"
  692.         mapcar     entdel
  693.         "\011\012\013\014\015\016\017\020\021"
  694.         entmakex     logand
  695.         "\022\023\024\025\026\027\030\031\032"
  696.         cons     entsel
  697.         "作者:秋  寒"   vlax-for
  698.         entget     "QQ:982049859"
  699.         progn     entmake
  700.         vl-catch-all-error-p logior
  701.         "QQ:982049859"   setq
  702.         vlax-3d-point   getpoint
  703.         vla-addLine     "QQ:982049859"
  704.         defun     substr
  705.         function     getvar
  706.         "QQ:982049859"   lambda
  707.         command     polar
  708.         distance     "QQ:982049859"
  709.         not       reverse
  710.         pi       setvar
  711.         "QQ:982049859"   member
  712.         abs       strcat
  713.         numberp     "QQ:982049859"
  714.         wcmatch     <
  715.         append     >
  716.         "QQ:982049859"   cadaar
  717.         cdr       vl-remove
  718.         caddr     "QQ:982049859"
  719.         *       cadddr
  720.         car       cddr
  721.         "QQ:982049859"   cadr
  722.         =       /=
  723.         cdddr     "QQ:982049859"
  724.         itoa     read
  725.         1-       vlax-get-object
  726.         "QQ:982049859"   vlax-get-acad-object
  727.         vlax-get-or-create-object
  728.         /       vlax-curve-getstartpoint
  729.         "QQ:982049859"   fix
  730.         vlax-curve-getendpoint
  731.         equal     vlax-safearray->list
  732.         "QQ:982049859"   rtos
  733.         vl-string->list   :vlax-true
  734.         vlax-ename->vla-object
  735.         "QQ:982049859"   vlax-make-variant
  736.         vla-getinterfaceobject
  737.         vla-setRGB     vla-get-modelspace
  738.         "QQ:982049859"   vla-addMtext
  739.         vla-move     vl-list->string
  740.         vla-get-ActiveDocument
  741.         "QQ:982049859"   vla-get-ColorIndex
  742.         ssget     princ
  743.         prin1
  744.        )
  745.   )
  746.   ;;防破译
  747.   (if (apply 'and TtLst)
  748.     (progn
  749.       ;;提示用户先打开被操作的Excel文件,再继续执行
  750.       (alert "需要先打开被操作的Excel文件")
  751.       (if (setq ExcApp (vlax-get-object "Excel.Application")) ;采用 Excel应用程序对象
  752.   (if (setq Wkbk (vlax-get-property ExcApp 'ActiveWorkbook)) ;采用 当前工作簿
  753.     (progn
  754.       (setq Sheet   (vlax-get-property Wkbk 'ActiveSheet) ;采用 当前工作表
  755.       URange (vlax-get-property Sheet 'UsedRange) ;采用 当前使用的区域
  756.       Cells   (vlax-get-property URange 'Cells) ;采用 已经使用区域的所有单元格集合
  757.       )
  758.       ;;判断当前工作表是否是空的
  759.       (if (and
  760.       (= (vlax-get-property Cells 'Count) 1)
  761.       (not (vlax-variant-value (vlax-get-property URange 'Value)))
  762.     )
  763.          (princ "\n当前工作表是空的")
  764.          ;;如果不是空的,提示用户在制图界面指定插入点
  765.          (if (setq InsPt (getpoint "\n指定表格的插入点<左上点>:"))
  766.       ;;根据使用区域对象和插入点绘制表格
  767.       (AYL-GetExcPr URange InsPt)
  768.          )
  769.       )
  770.       ;;释放对象
  771.       (mapcar 'vlax-release-object (list ExcApp Wkbk Sheet URange Cells))
  772.     )
  773.     (progn (princ "\n没有打开Excel文件") (vlax-release-object ExcApp))
  774.   )
  775.       )
  776.     )
  777.     (princ "函数错误")
  778.   )
  779.   (princ)
  780. )
  781. (princ "\n将Excel表格转换为Acad表格的命令名是:XlCAc")
  782. (princ)
  783. ;;;------------------------------ 结束 ------------------------------;;;
复制代码

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-28 18:03 , Processed in 0.171852 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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